1. Binder通信機制流程(整體框架)
2. 如何使用AIDL
一. 服務(wù)端
- 創(chuàng)建一個專門用來 存放AIDL文件的包 如
com.kkk.myaidl
- 在
com.kkk.myaidl
包下建一個.aidl文件,如IService.aidl
,代碼如下。
package com.kkk.myaidl;
import com.kkk.aidl.Person;//很重要截珍,即使在同一個包下也要加import.
interface IServiceaidl{
public int getSum(int num1,int num2);
public Person getPerson();
void setPerson(in Person person);
}
另外疙筹,接口中的參數(shù)除了aidl支持的類型巫糙,其他類型必須標(biāo)識其方向:到底是輸入還是輸出抑或兩者兼之旦签,用in破托,out或者inout來表示肪跋,上面的代碼我們用in標(biāo)記,因為它是輸入型參數(shù)土砂。
- 創(chuàng)建服務(wù)端service
package com.kkk.service;
public class MyService extends Service{
@Override
public IBinder onBind(Intent intent){
return mbinder;
}
private final IServiceaidl.Stub mbinder = new IServiceaidl.Stub(){
@Override
public int getSum(int num1,int num2){
return num1+num2;
}
}
}
- 在manifests中聲明service
<service android:name=".MyService" android:enabled="true" android:exported="true">
<intent-filter>
<action android:name="com.kkk.service.MyService"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</service>
設(shè)置action是為了其他應(yīng)用隱式bindService州既。通過隱式調(diào)用的方式來起activity或者service,需要把category設(shè)為default萝映,這是因為吴叶,隱式調(diào)用的時候,intent中的category默認(rèn)會被設(shè)置為default序臂。
- 傳輸自定義類型的參數(shù)晤郑。
android studio中,新建一個aidl文件贸宏,會自動生成一個aidl文件夾造寝。在其中定義需要的類型的.aidl文件。如Person.aidl
吭练。
package com.kkk.aidl;
parcelable Person;
注意诫龙,這里的parcelable是類型,不是Parcelable接口鲫咽。接著在jave文件夾下建立一個與aidl中相同的包名,如com.kkk.aidl
签赃。在包中新建Person.java谷异,并實現(xiàn)Parcelable接口。一定不能直接把Person.java放在自動生成的aidl文件夾下锦聊,否則會出現(xiàn)無法找到Person.java類的錯誤歹嘹。
二. 客戶端
- 將服務(wù)端工程中的
com.kkk.myaidl
包整個拷貝到客戶端中。雙方的aidl包名必須完全一致孔庭,否則會報錯尺上。 - 新建一個ServiceConnection。
private ServiceConnection mconnection = new ServiceConnection(){
@Override
public void onServiceDisconnected(ComponentName name)
{
mIMyService = null;
}
@Override
public void onServiceConnected(ComponentName name, IBinder service)
{
//通過服務(wù)端onBind方法返回的binder對象得到MyService的實例圆到,得到實例就可以調(diào)用它的方法了
mIServiceaidl =IServiceaidl.Stub.asInterface(service);
}
}
- 綁定service怎抛。
Intent intent = new Intent();
intent.setAction(BIND_SERVICE);
bindService(intent, mconnection, Context.BIND_AUTO_CREATE);
- 調(diào)用getSum。
try {
int sum = mIServiceaidl.add(1, 2);
Log.e(TAG, "add: " + sum);
} catch (RemoteException e) {
e.printStackTrace();
}