標籤:
服務端MessengerService的process屬性指定它的進程跟MainActivity不在一個進程
<service android:name="com.example.activity.MessengerService" android:process="com.example.activity.remote" > </service>
在MessengerService建立一個Messenger,以它底層的binder作為綁定服務返回的IBinder對象。
private final Messenger messenger = new Messenger(new messengerHandler()); @Override public IBinder onBind(Intent intent) { return messenger.getBinder(); }
messengerHandler用於處理用戶端向服務端通過Messenger發的Message。
private class messengerHandler extends Handler{ @Override public void handleMessage(Message msg) { super.handleMessage(msg); System.out.println(msg.getData().getString("msg")); } }
用戶端MainActivity中綁定服務。
Intent intent = new Intent(); intent.setClass(MainActivity.this, MessengerService.class); bindService(intent, conn, Context.BIND_AUTO_CREATE);
綁定服務需要ServiceConnection,以綁定Service返回的IBinder對象建立Messenger ,將用戶端要發送的資訊發個服務端。
private ServiceConnection conn = new ServiceConnection() { @Override public void onServiceDisconnected(ComponentName name) { } @Override public void onServiceConnected(ComponentName name, IBinder service) { Messenger messenger = new Messenger(service); Message msg = Message.obtain(); Bundle data = new Bundle(); data.putString("msg", "hello!!!"); msg.setData(data); try { messenger.send(msg); } catch (RemoteException e) { e.printStackTrace(); } } };
此時,服務端便可通過messengerHandler接受到用戶端發送的訊息,至此完成進程間的通訊。
當然,服務端也可以回複訊息給用戶端。
可在用戶端也建立一個Messenger,通過hanlder來處理服務端發送的訊息。
private Messenger mainMessenger = new Messenger(new MessengerHandler());private class MessengerHandler extends Handler{ @Override public void handleMessage(Message msg) { super.handleMessage(msg); System.out.println(msg.getData().getString("reply")); } }
當然需要把用戶端的mainMessenger 傳遞給服務端,服務端通過mainMessenger 發送訊息給用戶端。這裡使用Message的replyTo屬性傳遞。
msg.replyTo = mainMessenger;
那麼服務端便可通過用戶端傳遞過來的Messenger給用戶端返回訊息了。
Messenger client = msg.replyTo; Bundle bundle = new Bundle(); Message reply = Message.obtain(); bundle.putString("reply", "hello yeah!"); reply.setData(bundle); try { client.send(reply); } catch (RemoteException e) { e.printStackTrace(); }
這時用戶端便可通過mainMessenger擷取服務端發回的訊息。
使用Messenger通訊不能很好的處理高並發,因為它的訊息是一條一條處理的。它通過Message傳輸訊息,所以只支援Bundle資料類型。在低並發的即時通訊中,可以使用這種方式。
Android中跨進程通訊方式之使用Messenger