android使用Messenger綁定Service的多種實(shí)現(xiàn)方法
如果你需要在不同進(jìn)程間通信,你可以在Service中使用Messenger來實(shí)現(xiàn)進(jìn)程中通信。
如果使用這種方式,Service中需要定義一個(gè)Handler對(duì)象(負(fù)責(zé)對(duì)客戶端發(fā)送過來的Message進(jìn)行響應(yīng))。
Messenger可以共享給client一個(gè)IBinder對(duì)象,client通過這個(gè)IBinder對(duì)象向Service發(fā)送Message,而前面提到的Handler對(duì)象是這一切的基礎(chǔ)。
注:使用這種方式進(jìn)行通信是不支持多線程的。
那就讓我們來看看使用這種方式進(jìn)行通信吧!
注:Service在聲明時(shí)必須對(duì)外開放,即android:exported="true",且本文是通過Intent啟動(dòng)的Service,所以在聲明時(shí)該Service可以接收特定的Action。
1、在Service中創(chuàng)建一個(gè)Handler對(duì)象,來處理從client發(fā)過來的Message
2、根據(jù)創(chuàng)建的Handler對(duì)象創(chuàng)建一個(gè)Messenger對(duì)象
3、使用Messenger的getBinder方法得到一個(gè)IBinder對(duì)象,并在Service的onBind方法中將其反出去
4、client在onServiceConnected中根據(jù)IBinder參數(shù)創(chuàng)建一個(gè)Messenger對(duì)象(可參考Messenger的構(gòu)造函數(shù))
5、client可以使用上一步得到的Messenger對(duì)象來給Service發(fā)送Message了
經(jīng)過上面的五部我們就能讓client與Service進(jìn)行通信。client使用Messenger對(duì)象給Service發(fā)送Message后,Service中的Handler將會(huì)對(duì)消息作出響應(yīng)。
上面實(shí)現(xiàn)的僅僅是單向通信,即client給Service發(fā)送消息,如果我需要Service給client發(fā)送消息又該怎樣做呢?
其實(shí),這也是很容易實(shí)現(xiàn)的,下面就讓我們接著上面的步驟來實(shí)現(xiàn)雙向通信吧~
6、在client中創(chuàng)建一個(gè)Handler對(duì)象,用于處理Service發(fā)過來的消息
7、根據(jù)client中的Handler對(duì)象創(chuàng)建一個(gè)client自己的Messenger對(duì)象
8、我們?cè)诘?步的時(shí)候獲得了Service的Messenger對(duì)象,并通過它來給Service發(fā)送消息。這時(shí)候,我們將client的Messenger對(duì)象賦給待發(fā)送的Message對(duì)象的replyTo字段
9、在Service的Handler處理Message時(shí)將client的Messenger解析出來,并使用client的Messenger對(duì)象給client發(fā)送消息
這樣我們就實(shí)現(xiàn)了client和Service的雙向通信。client和Service都有自己的Handler和Messenger對(duì)象,使得對(duì)方可以給自己發(fā)送消息,值得注意的是client的Messenger是通過Message的replyTo傳遞給Service的。
相關(guān)文章
Android Studio 升級(jí)到3.0 提示 java.lang.NoClassDefFoundError的解決方法
這篇文章主要介紹了Android Studio 升級(jí)到3.0 提示 java.lang.NoClassDefFoundError的解決方法,需要的朋友可以參考下2017-12-12android studio實(shí)現(xiàn)簡(jiǎn)單考試應(yīng)用程序?qū)嵗a詳解
這篇文章主要介紹了android studio實(shí)現(xiàn)簡(jiǎn)單考試應(yīng)用程序,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03自定義ListView實(shí)現(xiàn)拖拽ListItem項(xiàng)交換位置(附源碼)
本文要實(shí)現(xiàn)的是拖拽ListView的Item項(xiàng),在布局方面還是用基于布局泵LayoutInflater來從不同的Layout模板拿到不同的布局然后將view返回,感興趣的朋友可以了解下哈2013-06-06Android實(shí)現(xiàn)打開各種文件的intent方法小結(jié)
這篇文章主要介紹了Android實(shí)現(xiàn)打開各種文件的intent方法,結(jié)合實(shí)例形式總結(jié)分析了Android針對(duì)HTML、圖片文件、pdf文件、文本文件、音頻文件、視頻文件等的intent打開方法,需要的朋友可以參考下2016-08-08Android超詳細(xì)講解組件LinearLayout的使用
LinearLayout又稱作線性布局,是一種非常常用的布局。正如它的名字所描述的一樣,這個(gè)布局會(huì)將它所包含的控件在線性方向上依次排列。既然是線性排列,肯定就不僅只有一個(gè)方向,這里一般只有兩個(gè)方向:水平方向和垂直方向2022-03-03Android中創(chuàng)建快捷方式及刪除快捷方式實(shí)現(xiàn)方法
這篇文章主要介紹了Android中創(chuàng)建快捷方式及刪除快捷方式實(shí)現(xiàn)方法,本文直接給出實(shí)現(xiàn)代碼,需要的朋友可以參考下2015-06-06Android Studio Intent隱式啟動(dòng),發(fā)短信,撥號(hào),打電話,訪問網(wǎng)頁等實(shí)例代碼
這篇文章主要介紹了Android Studio Intent隱式啟動(dòng),發(fā)短信,撥號(hào),打電話,訪問網(wǎng)頁等實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-12-12Android實(shí)現(xiàn)自動(dòng)朗讀功能(TTS)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)自動(dòng)朗讀功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08