新建AIDL文件,aidl文件會自動生成包含stub類的文件
寫一個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
-
連接啟動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應該也可以?).