作者Blog
看這個(gè)之前,可以先去看看大神對于Binder機(jī)制的分析,在這里附上地址
了解Binder機(jī)制
看完之后,再來看IActivityManager,ActivityManagerNative,ActivityManagerService這三者之間的關(guān)系。
IActivityManager:這就相當(dāng)于AIDL中定義的接口,其中包括三個(gè)部分
public interface IActivityManager extends IInterface{
// 省略一大波代碼
}
- 對該接口的完整類名描述
String descriptor = "android.app.IActivityManager";
- 接口方法定義
public int startActivity(/*參數(shù)忽略*/) throws RemoteException;
// 此處省略N條方法定義
- 接口方法的transaction code(后面有用到的)定義
int START_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+2;
// 此處省略N條transaction code定義
ActivityManagerNative:接口的Binder機(jī)制實(shí)現(xiàn)類,NOTICE:并沒有實(shí)現(xiàn)IActivityManager中定義的方法,這個(gè)后面再說;這里面分為兩部分
- ActivityManagerNative (對應(yīng)AIDL生成的Stub類)
public abstract class ActivityManagerNative extends Binder implements IActivityManager{
// 1 . 構(gòu)造函數(shù)
public ActivityManagerNative() {
attachInterface(this, descriptor);
}
// 2 . asInterface函數(shù),轉(zhuǎn)換Binder對象到Interface,有些情況會生成代理對象
static public IActivityManager asInterface(IBinder obj) {
if (obj == null) {
return null;
}
IActivityManager in = (IActivityManager)obj.queryLocalInterface(descriptor);
if (in != null) {
return in;
}
return new ActivityManagerProxy(obj);
}
// 3 . onTransact函數(shù),通過code(這個(gè)code就是之前在IActivityManager中定義的transaction code)
// 找到對應(yīng)的方法,進(jìn)行調(diào)用
public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
throws RemoteException {
// 省略一小撮代碼
}
// 4 . asBinder函數(shù),返回Binder對象,就是自己
public IBinder asBinder() {
return this;
}
// 省略一大波代碼
}
- ActivityManagerProxy(對應(yīng)Stub的內(nèi)部類Proxy)
class ActivityManagerProxy implements IActivityManager{
// 遠(yuǎn)程Binder對象
private IBinder mRemote;
// 1. 構(gòu)造函數(shù)
public ActivityManagerProxy(IBinder remote){
mRemote = remote;
}
// 2. asBinder函數(shù),返回遠(yuǎn)程Binder對象
public IBinder asBinder(){
return mRemote;
}
// 3. 代理對象的接口的實(shí)現(xiàn)
public int startActivity(IApplicationThread caller, String callingPackage, Intent intent,
String resolvedType, IBinder resultTo, String resultWho, int requestCode,
int startFlags, ProfilerInfo profilerInfo, Bundle options) throws RemoteException{
// 代碼省略,不多,可以去看看源碼
}
// 其他方法實(shí)現(xiàn)省略,大同小異
代理對象接口的實(shí)現(xiàn)基本都差不多,分為這三部分
1. 拿到data
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.write...(...);
2. 調(diào)用方法
mRemote.transact(START_ACTIVITY_TRANSACTION, data, reply, 0);
3. 返回結(jié)果
reply.readException();
int result = reply.readInt();
reply.recycle();
data.recycle();
return result;
ActivityManagerService:這個(gè)才是接口定義方法的真正實(shí)現(xiàn)類
public final class ActivityManagerService extends ActivityManagerNative
implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
public final int startActivity(IApplicationThread caller, String callingPackage,
Intent intent, String resolvedType, IBinder resultTo, String resultWho,
int requestCode, int startFlags, ProfilerInfo profilerInfo, Bundle options)
throws RemoteException{
// 代碼省略......
}
}