Android中Messenger的使用
生活随笔
收集整理的這篇文章主要介紹了
Android中Messenger的使用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
2019獨角獸企業重金招聘Python工程師標準>>>
我們使用Handler都是在一個進程中使用的,如何跨進程使用Handler?
其實這個問題不難解決,自己動手對binder進行一些封裝就可以簡單實現。但是當你看系統源碼,就會發現,其實這些android都已經為我們做好了。
使用android系統的android.os.Messenger可以很方便的跨進程使用Handler。下面是示例程序。
?
首先是服務端。
public?class?MessengerTestService?extends?Service?{protected?static?final?String?TAG?=?"MessengerTestService";private?Handler?mHandler?=?new?Handler()?{@Overridepublic?void?handleMessage(Message?msg)?{switch?(msg.what)?{case?1:Log.d(TAG,?"收到消息");//獲取客戶端message中的Messenger,用于回調final?Messenger?callback?=?msg.replyTo;try?{//?回調callback.send(Message.obtain(null,?0));}?catch?(RemoteException?e)?{//?TODO?Auto-generated?catch?blocke.printStackTrace();}break;}}};@Overridepublic?IBinder?onBind(Intent?intent)?{return?new?Messenger(mHandler).getBinder();}}?
?
然后是客戶端
public?class?MainActivity?extends?Activity?{protected?static?final?String?TAG?=?"MainActivity";Messenger?messenger;Messenger?reply;@Overrideprotected?void?onCreate(Bundle?savedInstanceState)?{super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);reply?=?new?Messenger(handler);Intent?intent?=?new?Intent();intent.setClassName("test.messenger",?"test.messenger.MessengerTestService");//?綁定服務bindService(intent,?new?ServiceConnection()?{@Overridepublic?void?onServiceDisconnected(ComponentName?name)?{}@Overridepublic?void?onServiceConnected(ComponentName?name,?IBinder?service)?{Toast.makeText(MainActivity.this,?"bind?success",?0).show();messenger?=?new?Messenger(service);}},?Context.BIND_AUTO_CREATE);}public?void?sendMessage(View?v)?{Message?msg?=?Message.obtain(null,?1);//?設置回調用的Messengermsg.replyTo?=?reply;try?{messenger.send(msg);}?catch?(RemoteException?e)?{e.printStackTrace();}}private?Handler?handler?=?new?Handler()?{@Overridepublic?void?handleMessage(Message?msg)?{Log.d(TAG,?"回調成功");}}; }?
客戶端綁定服務端,獲取遠程Messenger的binder對象。調用Messenger的send函數,就可以吧Message發送至服務端的Handler。
同時,如果需要服務端回調客戶端(往客戶端的Handler發消息),則可以在send的Message中設置replyTo,服務端就可以往客戶端發送消息了。
下面我們看下Messenger的源碼,還是很簡單的。
構造函數
????public?Messenger(Handler?target)?{mTarget?=?target.getIMessenger();??}Handler.getIMessenger()返回的是一個IMessenger的binder對象,它的send方法將會調用Handler的sendMessage方法。
????public?void?send(Message?message)?throws?RemoteException?{mTarget.send(message);}?
?
?
?
轉載于:https://my.oschina.net/u/1177694/blog/687772
總結
以上是生活随笔為你收集整理的Android中Messenger的使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: inner join on, left
- 下一篇: 什么是SVC模式【转】