Android Service之Messenger实现通讯

  1. 从类Binder派生若是你的service是你本身应用的私有物,而且与客户端运行于同一个进程中(通常都这样),你应该经过从类Binder派生来建立你的接口而且从onBind()返回一它的实例.客户端接收这个Binder而后使用它来直接操做所实现的Binder甚至Service的公共接口.当你的service仅仅是一个后台工做而且仅服务于本身的应用时,这是最好的选择.惟一使你不能以这种方式建立你的接口的理由就是你的service被其它应用使使用或者是跨进程的.java

  2. 使用一个Messenger若是你须要你的接口跨进程工做,你能够为service建立一个带有Messager的接口.在此方式下,service定义一个Handler来负责不一样类型的Message对象.这个Handler是Messenger能够与客户端共享一个IBinder的基础,它容许客户端使用Message对象发送命令给servic.客户端能够定义一个本身的Messenger以使service能够回发消息.这是执行IPC的最简单的方法,由于Messenger把全部的请求都放在队列中依次送入一个线程中,因此你没必要把你的service设计为线程安全的android

  3. 使用AIDLAIDL(Android接口定义语言)执行把对象分解为操做系统可以理解并能跨进程封送的基本体以执行IPC的全部的工做.上面所讲的使用一个Messenger,实际上就是基于AIDL的.就像上面提到的,Messenger在一个线程中建立一个容纳全部客户端请求的队列,使用service一个时刻只接收一个请求.然而,若是你想要你的service同时处理多个请求,那么你能够直接使用AIDL.在此状况下,你的service必须是多线程安全的.要直接使用AIDL,你必须建立一个.aidl文件,它定义了程序的接口.AndroidSDK工具使用这个文件来生成一个实现接口和处理IPC的抽象类,以后你在你的service内派生它.安全

    注:大多数应用不该使用AIDL来处理一个绑定的service,由于它可能要求有多线程能力而且致使实现变得更加复杂.一样的,AIDL也不适合于大多数应用而且本文档不会讨论如何在你的service中使用它.若是你肯定你须要直接使用AIDL,请看AIDL的文档.多线程

    Serviceide

public class MyService extends Service {
 Messenger messenger = null;
 Messenger replyMessenger = null;
 
 public MyService() {
 }
 
 @Override
 public void onCreate() {
  super.onCreate();
  messenger = new Messenger(handler);//实例化一个对象,并将Handler传入绑定,UI MQ消息检测
 }
 
 Handler handler = new Handler(){
  public void handleMessage(android.os.Message msg) {
   Log.d("","Msg:" + msg.what + ";" + msg.obj);
    replyMessenger = msg.replyTo; 
  }
 };
  
 @Override
 public IBinder onBind(Intent arg0) {
  return messenger.getBinder();//返回Binder接口
 }
}

Activity工具

private Messenger messenger;
private Messenger sendMessenger;  

Handler handler = new Handler() { 
 @Override         
 public void handleMessage(Message msg) { 
     System.out.println("acitivty handler");             
     super.handleMessage(msg); 
 } 
};  
 
@Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);
  bindService(new Intent(this,MyService.class), conn, Context.BIND_AUTO_CREATE);//同样绑定一个Connection
  sendMessenger = new Messenger(handler); 
 }
 private ServiceConnection conn = new ServiceConnection() {
  @Override
  public void onServiceDisconnected(ComponentName cn) {
  }
  @Override
  public void onServiceConnected(ComponentName cn, IBinder ibiner) {
   messenger = new Messenger(ibiner);//获得Service中的Messenger
   Log.d("","OK messenger connected........");
  }
 };
 
 public void sendMsg(int what, String msg){ //这个方法就是本身的业务信息发送消息 传递到Service中 有 Handler处理。
  if (messenger == null) {
   return;
  }
  Message msg1 = Message.obtain();
  msg1.what = what;
  msg1.obj = msg;
  msg.replyTo = sendMessenger; 
  try {
   messenger.send(msg1);
  } catch (RemoteException e) {
   e.printStackTrace();
  }
 }
相关文章
相关标签/搜索