Android-ActivityManager框架解析
来源:互联网 发布:ape转mp3软件 编辑:程序博客网 时间:2024/05/18 14:28
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抽象类,但是两个类的作用是不一样的,一个是作为代理,另外一个才是真正的实现功能。
- Android-ActivityManager框架解析
- Android源码学习之--ActivityManager框架解析
- Android源码学习之ActivityManager框架解析
- ActivityManager框架解析
- ActivityManager框架解析
- ActivityManager框架解析
- ActivityManager框架解析
- ActivityManager框架解析
- ActivityManager框架解析
- ActivityManager框架解析
- ActivityManager框架解析
- ActivityManager框架解析
- ActivityManager框架解析
- ActivityManager框架解析
- ActivityManager框架解析
- ActivityManager框架解析
- Android源码学习之六——ActivityManager框架解析
- Android源码学习之六——ActivityManager框架解析
- 简单计算器
- URAL 1960 Palindromes and Super Abilities (Palindromic Tree)
- 排序方法之快速排序
- java 初识 java平台无关性
- FormBorderStyle设为None,移动Winform窗口的两种方法
- Android-ActivityManager框架解析
- 从1到n的数中总共包含1的个数
- hdu 1546 Idiomatic Phrases Game 最短路
- 我们会使用BI吗?
- Set Matrix zeroes--LeetCode
- MoreWindows 微软认证专家博客目录(白话算法,C++ STL,windows编程)
- App Store审核指南中文版(2014.10.11更新)
- poj 2386 Lake counting
- [leetcode]35 Reverse Integer