Android service通信

概要:介紹綁定服務端的三種方式:同一進程綁定服務、跨進程綁定服務(Messenger)、跨進程綁定服務(aidl)。 重點說一下通過Messenger、Service實現的進程間通信。

基礎:AIDL(Android Interface Definition Language)——進程間通信的一種機制。它允許您定義客戶端和服務端通過使用進程間通信(IPC)進行通信的編程接口。在Android上,一個進程無法正常訪問另一個進程的內存。所以說,他們需要將他們的對象分解成操作系統能夠理解的原語,并且把這些對象放在你的邊界上。編寫這些代碼非常繁瑣,所以Android使用AIDL來處理它。

使用場景:
在創建提供綁定的Service時,必須提供一個IBinder (客戶端可以用來與服務進行交互的編程接口)。有三種方法可以定義接口:

1、擴展Binder類

如果您的Service對您自己的應用程序是私有的,并且與客戶端在相同的進程中運行(這是常見的),則應該通過擴展Binder類并創建其實例,onBind()返回該實例。 客戶端收到Binder,可以使用它直接訪問Binder實現或甚至Service中可用的公共方法。

當您的服務只是您自己的應用程序的后臺工作者時,這是首選技術。您不會以這種方式創建界面的唯一原因是因為您的服務被其他應用程序或單獨的進程使用。

2、使用Messenger

如果您需要Service 和客戶端位于不同的進程,則可以使用Messenger為服務創建一個interface。 以這種方式,服務定義響應不同類型的Message對象的Handler。 該Handler是Messenger的基礎,可以與客戶端共享IBinder,允許客戶端使用Message對象向服務發送命令。 此外,客戶端可以定義自己的Messenger,因此服務可以發回消息。

這是執行進程間通信(IPC)的最簡單的方法,因為Messenger將所有請求排隊到單個線程中,以便您不必將服務設計為線程安全。

3、使用AIDL

AIDL(Android Interface Definition Language)執行所有的工作,將對象分解為基元,操作系統可以在進程之間了解和編組它們以執行IPC。 之前使用的Messenger技術實際上是基于AIDL作為其底層結構。 如上所述,Messenger在單個線程中創建所有客戶端請求的隊列,因此服務一次接收一個請求。 但是,如果您希望您的服務同時處理多個請求,則可以直接使用AIDL。 在這種情況下,您的服務必須能夠進行多線程并建立線程安全。

要直接使用AIDL,您必須創建一個定義編程接口的.aidl文件。 Android SDK工具使用此文件生成一個實現接口并處理IPC的抽象類,然后您可以在服務中擴展它。

注意:大多數應用程序不應該使用AIDL創建綁定的服務,因為它可能需要多線程功能,并可能導致更復雜的實現。因此,AIDL不適用于大多數應用程序。

異同:

  1. Messenger本質也是AIDL,只是進行了封裝,開發的時候不用再寫.aidl文件。

結合我自身的使用,因為不用去寫.aidl文件,相比起來,Messenger使用起來十分簡單。但前面也說了,Messenger本質上也是AIDL,故在底層進程間通信這一塊,兩者的效率應該是一樣的。

  1. 在service端,Messenger處理client端的請求是單線程的,而AIDL是多線程的。

使用AIDL的時候,service端每收到一個client端的請求時,就會啟動一個線程(非主線程)去執行相應的操作。而Messenger,service收到的請求是放在Handler的MessageQueue里面,Handler大家都用過,它需要綁定一個Thread,然后不斷poll message執行相關操作,這個過程是同步執行的。

  1. client的方法,使用AIDL獲取返回值是同步的,而Messenger是異步的。

Messenger只提供了一個方法進行進程間通信,就是send(Message msg)方法,發送的是一個Message,沒有返回值,要拿到返回值,需要把client的Messenger作為msg.replyTo參數傳遞過去,service端處理完之后,在調用客戶端的Messenger的send(Message msg)方法把返回值傳遞回client,這個過程是異步的,而AIDL你可以自己指定方法,指定返回值,它獲取返回值是同步的。

其實,第二點是有辦法解決的,在service端,Messenger的Handler可以只當作一個轉發器,不處理請求,只轉發請求到相應的處理線程(多是相應的HandlerThread),這樣也可以達到異步的效果。

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容