1.ActivityManager
作用:是与系统中所有正在运行着的Activity进行交互,对系统所有运行中的Activity相关信息(task,memory,service,app)进行管理和维护;提供了相应的接口用于获取这些信息。
2.ActivityManager与ActivityManagerService之间的通信
首先看下图(不是本人所画,但大致都是这样),ActivityManager类图:
这些类所在的文件如下:
其中Binder.java和IBinder.java分别在
frameworks/base/core/java/android/os/IBinder.java (为接口文件)
frameworks/base/core/java/android/os/Binder.java (实现了IBinder接口)
frameworks/base/core/java/android/app/IActivityManager.java (接口文件)
frameworks/base/core/java/android/app/ActivityManagerNative.java(类ActivityManagerNative和类ActivityManagerProxy在同一个文件中,其中ActivityManagerNative类继承Binder类并实现了IActivityManager中部分方法,所以ActivityManagerNative为抽象类,ActivityManagerProxy实现了IActivityManager中的所有方法,但是对activity的管理和维护却不是该类完成,后详述。)
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java (该类继承ActivityManagerNative类并实现了IActivityManager中的所有方法,该类完成对activity管理和维护的所有功能)
frameworks/base/core/java/android/app/ActivityManager.java(该类依赖ActivityManagerProxy类)
3.在了解通信过程之前先了解java中的继承的几个原则
1)子类继承了父类中不是私有的成员变量和成员方法,作为自己的成员变量和成员方法;
2)子类中定义的成员变量和父类中定义的成员变量相同时,则父类中的成员变量被隐藏;
3)子类中定义的成员方法和父类中定义的成员方法相同时,则父类中的成员方法被隐藏;(即调用方法时首先调用子类中的方法)
4.简单看一下这个getServices的执行过程,如下图所示:
其中ActivityManager的getRunningServices()方法的代码如下:
public List<RunningServiceInfo> getRunningServices(int maxNum)
throws SecurityException {
try {
return ActivityManagerNative.getDefault()
.getServices(maxNum, 0);
} catch (RemoteException e) {
// System dead, we will be dead too soon!
return null;
}
}
ActivityManagerNative.getDefault()方法的代码如下:
static public IActivityManager getDefault() {
return gDefault.get();
}
其中gDefault变量的定义如下:
private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {
protected IActivityManager create() {
IBinder b = ServiceManager.getService("activity");
if (false) {
Log.v("ActivityManager", "default service binder = " + b);
}
IActivityManager am = asInterface(b);
if (false) {
Log.v("ActivityManager", "default service = " + am);
}
return am;
}
};
asInterface()代码如下,从代码中看出,函数最后返回一个ActivityManagerProxy的一个实例对象。
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);
}
此时完成了Service对象代理的创建。
当对该对象代理进行getServices(maxNum, 0)操作时,此时调用的是ActivityManagerProxy类中的方法getServices(maxNum,0),该方法的代码如下:
public List getServices(int maxNum, int flags) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IActivityManager.descriptor);
data.writeInt(maxNum);
data.writeInt(flags);
mRemote.transact(GET_SERVICES_TRANSACTION, data, reply, 0);
reply.readException();
ArrayList list = null;
int N = reply.readInt();
if (N >= 0) {
list = new ArrayList();
while (N > 0) {
ActivityManager.RunningServiceInfo info =
ActivityManager.RunningServiceInfo.CREATOR
.createFromParcel(reply);
list.add(info);
N--;
}
}
data.recycle();
reply.recycle();
return list;
}
该部分代码中的mRemote.transact(GET_SERVICES_TRANSACTION, data, reply, 0);其中mRemote为IBinder的一个对象,由于Binder继承IBinder类,所以该方法即为Binder类中的transact方法,如下:
public final boolean transact(int code, Parcel data, Parcel reply,
int flags) throws RemoteException {
if (false) Log.v("Binder", "Transact: " + code + " to " + this);
if (data != null) {
data.setDataPosition(0);
}
//此处的方法已经被子类重写
boolean r = onTransact(code, data, reply, flags);
if (reply != null) {
reply.setDataPosition(0);
}
return r;
}
onTransact方法在ActivityManagerNative类(该类继承了Binder类)中被重写,另外在ActivityManagerService类(继承ActivityManagerNative类)中又被重写以此,此处调用的onTransact方法为ActivityManagerService类中的方法。但是该类中的方法又调用了父类ActivityManagerNative中的onTransact方法,如下:
try {
return super.onTransact(code, data, reply, flags);
} catch (RuntimeException e) {
在ActivityManagerNative类中方法中,onTransact方法代码巨长,但是都是有一个switch…case…语句构成,此处只给出一部分,如下:
.....
case GET_SERVICES_TRANSACTION: {
data.enforceInterface(IActivityManager.descriptor);
int maxNum = data.readInt();
int fl = data.readInt();
//猜猜此处调用的是哪里的getServices(),是ActivityManagerProxy类中的,还是ActivityManagerService类中的?
List<ActivityManager.RunningServiceInfo> list = getServices(maxNum, fl);
reply.writeNoException();
int N = list != null ? list.size() : -1;
reply.writeInt(N);
int i;
for (i=0; i<N; i++) {
ActivityManager.RunningServiceInfo info = list.get(i);
info.writeToParcel(reply, 0);
}
return true;
}
......
此处调用的getServices()方法为ActivityManagerService类中的getServices()方法。
至此,ActivityManager(Client)与ActivityManagerService(server)的通信过程就分析到这了。只要记住虽然ActivityManagerProxy类和ActivityManagerService类都实现了IActivityManager抽象类,但是两个类的作用是不一样的,一个是作为代理,另外一个才是真正的实现功能。