作用
項目需現實推送消息的Service放入私有進程:push,找一種思路實現push來的消息由:push到:Main進程.這個demo將展示如何人初步實現項目這個需求
準備工作
了解Handle,Message原理http://www.lxweimin.com/p/acaccfdf046b
了解AIDL機制原理:http://www.lxweimin.com/p/c6a8e913efb3
利用Messenger信使來通信
新建一個Messenger mMessenger,Service#onBind()返回mMessenger.getBinder();
-
MainActivity在bindService的回調中將IBinder強轉為Messenger,Main擁有Service的Messenger,Main可以給Service發送指令了.
private ServiceConnection mConn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) { mService = new Messenger(service); isConn = true; Message inactiveMessage = Message.obtain(null, MSG_SUM); inactiveMessage.replyTo = mMainMessenger; if (isConn) { //往服務端發激活消息 try { mService.send(inactiveMessage); } catch (RemoteException e) { e.printStackTrace(); } } } @Override public void onServiceDisconnected(ComponentName name) { mService = null; isConn = false; mTvState.setText("disconnected!"); } };
-
Service如何擁有Main的Messenger
Main中新定義一個Messenger mMessengerprivate Messenger mMainMessenger = new Messenger(new Handler() { @Override public void handleMessage(Message msg) { switch (msg.what) { case MSG_SUM: Bundle bundle = (Bundle) msg.obj; mTvState.setText("=>" + bundle.getInt("result")); break; } super.handleMessage(msg); } });
在綁定Service回調中,將一個激活Message的replyTo設置為mMessgener,Main將這個激活Message發送到Service.
這樣Service就能獲取到Main的Messenger,通過它就能給Main發送消息了.
數據傳遞
數據傳遞使用Message攜帶,Message#obtain()的第三個參數可以依靠Bunder傳輸基本類型,非基本類型需要序列化.