Android開發中在哪些場合下會需要使用AIDL?


嚴格來說,線程是共享資源的,所以線程之間是不存在通信的,Android裡面的Handle是用來解決非同步調用的,這個觀念很重要,想明白了,代碼也就寫的更合理了~~~

進程之間內存等資源是隔離的,而AIDL,是Android提供的跨進程通信IPC工具Binder的具體使用方法,跟其他Linux跨進程通信(socket,管道,能存共享等)在概念上沒啥差~~~所以要實現跨進程的內存訪問(比如數據傳輸,函數跨進程同步調用等)就需要了AIDL了,當然了AIDL並不是Android中跨進程通信的唯一選擇,socket(systemServer進程與zygote進程,pkms調用install進程,MountService與vold進程通信都是通過socket),共享內存(sqlite3查詢就用了)等都可以用的,但是沒有Binder通過AIDL好用罷了~~~


一般都用在需要比較複雜的跨進程/線程通信場合。如LS所說的情況,比如自己的程序需要用一個Service去處理各種事務,而又需要跟Service能相互調用的場合。

要注意的是AIDL不是線程安全的,如有這方面需要的話就要自己處理好臨界情況。


  • 如果你的service是local service (跟client在一個進程里), 用Binder就夠了

  • 如果你的service是remote service (另外的一個進程), 但是不需要處理MultiThreading, 用Messager就行了

  • 如果你的service是remote service (另外的一個進程), 需要處理MultiThreading, 用AIDL。

那麼問題來了,什麼情況下需要service單開一個進程?

  • app私有service, 別的app不能訪問,但是需要系統獨立分配heap空間, 適合對資源要求多的app
  • 公有service,想開一個service在 app之間共享,多個app都可以訪問這個service。

 歡迎討論。


使用多進程能帶來更好的用戶體驗,例如音樂播放器,用戶一邊聽音樂一邊在頁面上點來點去,播放音樂需要不停的從網路下載資源,需要不停的寫本地緩存,都是很消耗系統資源的動作,放到另外的進程無需佔用主進程什麼資源,從而用戶體驗也會好些,即使主進程掛掉,依然不影響播放,同時還能被播放進程再次叫醒


其實很多地方都可以用到,我在課程設計中就嘗試了運用一下感覺還不錯,我的是音樂播放器,所以把所有關於音樂的操作都移到了Service里。


這幾天發現一個很好玩的東西,用一個APP開啟服務並建立LocalServerSocket,其餘的APP不需要AIDL也是可以直接連接到LocalSocket的,也就是說僅靠一個LocalSocket就能夠完成跨進程通訊,當然這邊需要對收到的數據進行大量的處理,因為你無法直接調用遠程方法,只能通過解析傳輸數據的方式來進行相應的回答.但這種也不失為一種數據傳輸的方式.


AIDL的不好處是雙方介面耦合性大,對於大型模塊,業務變更比較頻繁的APPS。個人感覺盡量不要使用。


跨進程通信使用IPC機制,會用到AIDL;跨線程通信使用Handler。


推薦閱讀:

怎樣才能獲得編程開發的樂趣?
怎樣著手研究 Android 源代碼?
安卓培訓公司黑馬程序員怎麼樣?有必要參加安卓培訓嗎?可以自學嗎?
為什麼 Android 系統那麼多 ROM,這是必然的嗎,有必要嗎?
有哪些比較好的Android異常(crash、ANR、內存泄漏等等)處理機制?

TAG:Android開發 | Android |