Activity与Service通信
Activity与Service通信的方式有三种:
?
继承Binder类
? 这个方式只有当你的Acitivity和Service处于同一个Application和进程时,才可以用,比如你后台有一个播放背景音乐的Service,这时就可以用这种方式来进行通信。
用例子来说明其使用方法:
? 1. 来看Service的写法:
?
?
?? 这里就是通过IBinder来得到LocalService对象,再去调用其Public方法。
使用Messenger
? ?上面的方法只能在同一个进程里才能用,如果要与另外一个进程的Service进行通信,则可以用Messenger。
? ? 其实实现IPC的方式,还有AIDL,但推荐使用Messenger,有两点好处:
? ? ? 1. 使用Messenger方式比使用AIDL的方式,实现起来要简单很多
? ? ? 2. 使用Messenger时,所有从Activity传过来的消息都会排在一个队列里,不会同时请求Service,所以是线程安全的。如果你的程序就是要多线程去访问Service,就可以用AIDL,不然最好使用Messenger的方式。
? 不过,其实Messenger底层用的就是AIDL实现的,看一下实现方式,先看Service的代码:
?
public class ActivityMessenger extends Activity { /** 向Service发送Message的Messenger对象 */ Messenger mService = null; /** 判断有没有绑定Service */ boolean mBound; private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { // Activity已经绑定了Service // 通过参数service来创建Messenger对象,这个对象可以向Service发送Message,与Service进行通信 mService = new Messenger(service); mBound = true; } public void onServiceDisconnected(ComponentName className) { mService = null; mBound = false; } }; public void sayHello(View v) { if (!mBound) return; // 向Service发送一个Message Message msg = Message.obtain(null, MessengerService.MSG_SAY_HELLO, 0, 0); try { mService.send(msg); } catch (RemoteException e) { e.printStackTrace(); } } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override protected void onStart() { super.onStart(); // 绑定Service bindService(new Intent(this, MessengerService.class), mConnection, Context.BIND_AUTO_CREATE); } @Override protected void onStop() { super.onStop(); // 解绑 if (mBound) { unbindService(mConnection); mBound = false; } }}?注意:以上写的代码只能实现从Activity向Service发送消息,如果想从Service向Activity发送消息,只要把代码反过来写就可以了。
?
使用AIDL
? 这个方法略,如果知道上面两种方法,这个方法基本很少会用到。
?
?