Android Service的一些疑問

1、綁定服務可以調用裏面的方法,爲什麼?
Service onBind返回Ibinder,Activity中綁定服務時得到當前服務的引用,可以使用引用執行服務裏面的方法。
MyService.MyBinder binder;
	ServiceConnection conn = new ServiceConnection() {

		@Override
		public void onServiceDisconnected(ComponentName name) {

		}

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			binder = (MyBinder) service;
		

		}
	};
Activity和Service交互的幾種方式:
1)將Activity中的handler傳給Service
2)Activity中設置接口回調
3)廣播
public class MainActivity extends Activity implements IServiceMethod{

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}

	Handler handler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			System.out.println(msg.arg1);
		};
	};

	public void btn(View v) {
		switch (v.getId()) {
		case R.id.btn1:
			startService(new Intent(this, MyService.class));
			break;

		case R.id.btn2:
			stopService(new Intent(this, MyService.class));
			break;

		case R.id.btn3:
			bindService((new Intent(this, MyService.class)), conn,
					Context.BIND_AUTO_CREATE);
			break;

		case R.id.btn4:
			unbindService(conn);
			break;
		case R.id.btn5:
			binder.getService().startDownLoad();
//			binder.getService().setHandler(handler);
			binder.getService().setDataChange(this);
			break;
			
			
		default:
			break;
		}
	}
	MyService.MyBinder binder;
	ServiceConnection conn = new ServiceConnection() {

		@Override
		public void onServiceDisconnected(ComponentName name) {

		}

		@Override
		public void onServiceConnected(ComponentName name, IBinder service) {
			binder = (MyBinder) service;
		

		}
	};

	@Override
	public void test(int i) {
		System.out.println(i+"====");
	}
public class MyService extends Service{
	public final static String TAG="MyService";
	
	@Override
	public void onCreate() {
		super.onCreate();
		Log.d(TAG, "onCreate");
	}
	
	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		Log.d(TAG, "onStartCommand");
		return super.onStartCommand(intent, flags, startId);
		
	}
	@Override
	public void onDestroy() {
		super.onDestroy();
		Log.d(TAG, "onDestroy");
	}
	
	
	@Override
	public boolean onUnbind(Intent intent) {
		Log.d(TAG, "onUnbind");
		return super.onUnbind(intent);
	}
	

	@Override
	public IBinder onBind(Intent intent) {
		Log.d(TAG, "onBind");
		return new MyBinder();
	}
	
	Handler handler;
	public void setHandler(Handler handler){
		this.handler=handler;
	}
	
	IServiceMethod iServiceMethod;
	public void setDataChange(IServiceMethod iServiceMethod){
		this.iServiceMethod=iServiceMethod;
	}
	
	public class MyBinder extends Binder{

		public MyService getService(){
			return MyService.this;
		}
		
	}
	
	public void startDownLoad(){
		new Thread(new Runnable() {
			
			@Override
			public void run() {
				
				
				try {
					Thread.sleep(2000);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				//handler方式往Activity傳數據
//				Message msg=new Message();
//				msg.arg1=5;
//				handler.sendMessage(msg);
				
				//接口回調方式往Activity傳數據
				iServiceMethod.test(5);
			}
		}).start();
	}
	
	
	

}
public interface IServiceMethod {
	void test(int i);

}



4)第三方工具(EventBus)

發佈了34 篇原創文章 · 獲贊 6 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章