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)

猜你喜欢

转载自blog.csdn.net/u013359807/article/details/80325997