Android Service在工作中也用的很多,但是AIDL就用的很少了,感覺也很生疏,之前在公司也有同事做過技術講座,而且也看過一些技術文章,但是感覺依然朦朦胧胧的。現在從事教學工作後,把AIDL又看了一遍,發現其實並不用理解的那麼復雜,其實很簡單的一個RPC(IPC)機制。
使用AIDL涉及到的前提是:需要跟其他應用的Service進行數據交換或者是方法調用。(也就是遠程操作其他Service)。否則如果沒有數據交換或方法調用,直接使用startService()即可;本地Service更加無需AIDL。
明確這個大前提後,來看AIDL所涉及的幾個知識點:
1.ServiceConnection接口:實現這個接口後可以實現Service連接狀態的回調方法onServiceConnected(ComponentName component, IBinder service)和onServiceDisconnected(ComponentName component)。
2.IBinder接口
3.Binder類:Binder可以想象成一個內存共享對象,這個對象只有方法暴露出來給客戶端調用。
4.Stub靜態內部類:其實就是繼承了Binder和實現了自己定義的AIDL接口的一個類(所謂的代理),就是一個實現了自己定義的接口的一個Binder。
5.實現了Parcelable序列化接口的自定義Java Bean:如果傳輸簡單數據,根本沒必要。(順便說兩句:1.要想把數據存儲到磁盤或者是通過網絡傳輸,一定要序列化;2.最為經常使用的Bundle其實就是一個Parcelable,可以通過Bundle來理解Parcelable)
使用AIDL要注意的地方:
1.文件名字一定要以.aidl結尾
2..aidl文件的包名很重要,Service端和調用端包名一定要保持一致。
先上一張圖,說明整個調用過程和遠程過程調用的原理:
下面貼出工程代碼結構圖: