把接口java文件的后綴名改成aidl# 遠程服務(wù)
- 本地服務(wù):指的是服務(wù)和啟動服務(wù)的activity在同一個進程中
- 遠程服務(wù):指的是服務(wù)和啟動服務(wù)的activity不在同一個進程中
遠程服務(wù)的啟動
服務(wù)和活動類似,均有顯示啟動和隱式啟動。而遠程服務(wù)的啟動只能通過顯示啟動
-
服務(wù)的注冊
<service android:name="com.example.android_service.RemoteService"> <!--支持隱式啟動的服務(wù)需配置intent-filter標(biāo)簽--> <intent-filter > <action android:name="com.itheima.remote"/> </intent-filter> </service> -
啟動遠程服務(wù)
//匹配action內(nèi)容 Intent intent = new Intent("com.itheima.remote"); startService(intent);
啟動,綁定,解綁,關(guān)閉遠程服務(wù)的方法和操作本地服務(wù)的方法一樣
和遠程服務(wù)進行通信
進程間通信使用的機制是:AIDL(Android interface definition language)
操作步驟:
1. 把遠程服務(wù)的方法抽取成一個單獨的接口java文件
2. 把接口java文件的后綴名改成aidl xxx.java ---> xxx.aidl
3. 在gen目錄中會自動生成的xxx.java文件中,內(nèi)部有一個靜態(tài)抽象類Stub,它已經(jīng)繼承了Binder類,實現(xiàn)了抽取出來的服務(wù)接口,這個類就是新的中間人
4. 在遠程服務(wù)類中,定義一個內(nèi)部類繼承靜態(tài)抽象類Stub,實現(xiàn)其需要實現(xiàn)的方法,在服務(wù)綁定時,返回此內(nèi)部類的對象
5. 把aidl文件復(fù)制粘貼到啟動遠程服務(wù)的項目中,粘貼的時候注意,aidl文件所在的包名必須原aidl所在的包名一致
6. 在啟動遠程服務(wù)的項目中,強轉(zhuǎn)中間人對象時,直接使用Stub.asInterface()
Stub.asInterface(service);