AIDL總結

  1. 新建AIDL文件,aidl文件會自動生成包含stub類的文件

  2. 寫一個service類,內部類binder實現(xiàn)類繼承stub,實現(xiàn)aidl中的方法(調用service內方法);service類內實現(xiàn)onBind方法,返回這個內部binder類的實例;配置service在AndroidManifest中,service中配置process屬性,配置類似:service,程序運行時將為這個service新啟動進程.

需要注意的是,Manifest中service的intent-filter中的寫法,目前高版本的SDK不允許使用模糊的filter寫法來啟動service(防止被其它應用啟動),建議目前不配置intent-filter,直接使用類名來啟動service

  1. 連接啟動service的客戶端,首先需要實現(xiàn)一個ServiceConnection,在這個類的onServiceConnected方法中,保存返回的binder:

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        mImServiceBinder = IMServiceB.Stub.asInterface(service);
    }
    

然后是綁定service:bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
綁定之后,onServiceConnected會被調用,我們就獲得了跟service交互的binder.

需要注意的是,startService和bindService創(chuàng)建出來的service的生命周期是不同的.
startService啟動的服務的生命周期跟客戶端無關(即使后面再次被bind),而通過bindService啟動的服務一旦所有的客戶端都unbind之后,將自動銷毀.已經被start的服務再次被調用start,將不會調用onCreate,但是會再次調用onStartCommand方法.

4.對于復雜的數(shù)據(jù)傳遞,需要數(shù)據(jù)類實現(xiàn)Parcelable接口(自定義序列化).

5.一個程序啟動多個遠程服務進程,每個進程都有自己的applicationContext,除了通過AIDL方法,兩個進程不能通過其他方法共享數(shù)據(jù)(數(shù)據(jù)庫可以,sharedPreferences應該也可以?).

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容