Messenger可以在不同進程中傳遞Message對象,我們在Message中加入我們想要傳的數據就可以在進程間的進行數據傳遞了。Messenger是一種輕量級的IPC方案並對AIDL 進行了封裝,它實現起來比較容易,下麵我們來看看如何實現。 首先我們先寫服務端(MessengerService. ...
Messenger可以在不同進程中傳遞Message對象,我們在Message中加入我們想要傳的數據就可以在進程間的進行數據傳遞了。Messenger是一種輕量級的IPC方案並對AIDL 進行了封裝,它實現起來比較容易,下麵我們來看看如何實現。
首先我們先寫服務端(MessengerService.java),在onBind方法中創建Messenger,關聯接收消息的Handler調用getBinder來獲取Binder對象,在handleMessage方法中接收客戶端發來的信息。
服務端(MessengerService.java): 在handleMessage回調中收到客戶端信息時,我們調用Message.replyTo得到客戶端傳過來的Messenger對象,創建消息並通過Messenger發送給客戶端。
public class MessengerService extends Service { public static final String TAG = "MoonMessenger"; public static final int MSG_FROMCLIENT=1000; private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_FROMCLIENT: Log.i(TAG,"服務端收到的信息-------"+msg.getData().get("msg")); //得到客戶端傳來的Messenger對象 Messenger mMessenger=msg.replyTo; Message mMessage=Message.obtain(null,MessengerService.MSG_FROMCLIENT); Bundle mBundle=new Bundle(); mBundle.putString("rep","這裡是服務端,我們收到信息了"); mMessage.setData(mBundle); try { mMessenger.send(mMessage); } catch (RemoteException e) { e.printStackTrace(); } break; } } }; @Override public IBinder onBind(Intent intent) { Messenger mMessenger=new Messenger(mHandler); return mMessenger.getBinder(); } }
客戶端(MessengerActivity.java),客戶端需要創建一個Handler來接收服務端的信息,前面我們在服務端調用Message.replyTo得到客戶端傳過來的Messenger對象,可是客戶端並沒有傳送Messenger對象啊,現在我們加上這段代碼將Messenger對象傳給服務端,當然需要關聯我們定義的Handler。
public class MessengerActivity extends AppCompatActivity { private Messenger mMessenger; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_messenger); Intent intent=new Intent(MessengerActivity.this,MessengerService.class); bindService(intent,mServiceConnection, Context.BIND_AUTO_CREATE); } private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what){ case MessengerService.MSG_FROMCLIENT: Log.i(MessengerService.TAG, "客戶端收到的信息-------" + msg.getData().get("rep")); break; } } }; private ServiceConnection mServiceConnection=new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mMessenger=new Messenger(service); Message mMessage=Message.obtain(null,MessengerService.MSG_FROMCLIENT); Bundle mBundle=new Bundle(); mBundle.putString("msg", "這裡是客戶端,收到了嘛服務端"); mMessage.setData(mBundle); //將Messenger傳遞給服務端 mMessage.replyTo=new Messenger(mHandler); try { mMessenger.send(mMessage); } catch (RemoteException e) { e.printStackTrace(); } } @Override public void onServiceDisconnected(ComponentName name) { } }; @Override protected void onDestroy() { super.onDestroy(); unbindService(mServiceConnection); } }
當然別忘了註冊servce時要另開一個進程:
<service android:name=".MessengerService" android:process=":remote"></service>
運行代碼查看Log,大功告成。