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();
  }
 }
相關文章
相關標籤/搜索