原址:http://blog.csdn.net/kc58236582/article/details/50394905
由于ActivityManagerService没有使用aidl机制,因此就直接用了代码实现看上去复杂了一些,下面我们来理下ActivityManager、ActivityManagerService、ActivityManagerNative、ActivityManagerProxy的关系。
1.ActivityManagerNative
先来看ActivityManagerNative:
- public abstract class ActivityManagerNative extends Binder implements IActivityManager
- {
-
-
-
-
- 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);
- }
-
-
-
-
- static public IActivityManager getDefault() {
- return gDefault.get();
- }
其实这个类是一个Binder通信类,相当于IPowerManager.Java就是实现了IPowerManager.aidl,我们再来看看getDefault这个函数
- 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;
- }
- };
而gDefault.get()返回的就是IActivityManager,如果实在客户端调用就是返回的ActivityManagerProxy。
而当远程调用过来后,ActivityManagerNative会在onTransact中处理:
- @Override
- public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
- throws RemoteException {
- switch (code) {
- case START_ACTIVITY_TRANSACTION:
- {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder b = data.readStrongBinder();
- IApplicationThread app = ApplicationThreadNative.asInterface(b);
- String callingPackage = data.readString();
- Intent intent = Intent.CREATOR.createFromParcel(data);
- String resolvedType = data.readString();
- IBinder resultTo = data.readStrongBinder();
- String resultWho = data.readString();
- int requestCode = data.readInt();
- int startFlags = data.readInt();
- ProfilerInfo profilerInfo = data.readInt() != 0
- ? ProfilerInfo.CREATOR.createFromParcel(data) : null;
- Bundle options = data.readInt() != 0
- ? Bundle.CREATOR.createFromParcel(data) : null;
- int result = startActivity(app, callingPackage, intent, resolvedType,
- resultTo, resultWho, requestCode, startFlags, profilerInfo, options);
- reply.writeNoException();
- reply.writeInt(result);
- return true;
- }
-
-
- ............
2. ActivityManager
下面我们再来看看ActivityManager类:
比如我们看下强制stop应用的接口:
- public void forceStopPackageAsUser(String packageName, int userId) {
- try {
- ActivityManagerNative.getDefault().forceStopPackage(packageName, userId);
- } catch (RemoteException e) {
- }
- }
在里面调用了ActivityManagerNative.getDefault().forceStopPackage,而前面说过在客户端调用ActivityManagerNative.getDefault()返回的是ActivityManagerProxy。
3. ActivityManagerProxy
因此我们再看看ActivityManagerProxy这个类。
- class ActivityManagerProxy implements IActivityManager
- {
- public ActivityManagerProxy(IBinder remote)
- {
- mRemote = remote;
- }
-
- public IBinder asBinder()
- {
- return mRemote;
- }
-
- ......
-
- public void forceStopPackage(String packageName, int userId) throws RemoteException {
- Parcel data = Parcel.obtain();
- Parcel reply = Parcel.obtain();
- data.writeInterfaceToken(IActivityManager.descriptor);
- data.writeString(packageName);
- data.writeInt(userId);
- mRemote.transact(FORCE_STOP_PACKAGE_TRANSACTION, data, reply, 0);
- reply.readException();
- data.recycle();
- reply.recycle();
- }
- .....
- }
4. IActivityManager
下面我们看下FORCE_STOP_PACKAGE_TRANSACTION这个变量如何来的
在IActivityManager中不但定义了接口,也定义了FORCE_STOP_PACKAGE_TRANSACTION这类值。
- public interface IActivityManager extends IInterface {
- public int startActivity(IApplicationThread caller, String callingPackage, Intent intent,
- String resolvedType, IBinder resultTo, String resultWho, int requestCode, int flags,
- ProfilerInfo profilerInfo, Bundle options) throws RemoteException;
- public int startActivityAsUser(IApplicationThread caller, String callingPackage, Intent intent,
- String resolvedType, IBinder resultTo, String resultWho, int requestCode, int flags,
-
- ..........
-
-
- int HANDLE_APPLICATION_CRASH_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+1;
- int START_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+2;
- int UNHANDLED_BACK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+3;
- int OPEN_CONTENT_URI_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+4;
-
-
- int FINISH_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+10;
- int REGISTER_RECEIVER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+11;
- int UNREGISTER_RECEIVER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+12;
- int BROADCAST_INTENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+13;
- int UNBROADCAST_INTENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+14;
- int FINISH_RECEIVER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+15;
- int ATTACH_APPLICATION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+16;
- int ACTIVITY_IDLE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+17;
- int ACTIVITY_PAUSED_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+18;
- int ACTIVITY_STOPPED_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+19;
- int GET_CALLING_PACKAGE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+20;
- int GET_CALLING_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+21;
- int GET_TASKS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+22;
- int MOVE_TASK_TO_FRONT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+23;
- int MOVE_TASK_TO_BACK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+24;
- int MOVE_TASK_BACKWARDS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+25;
- int GET_TASK_FOR_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+26;
- ..........
- }
我们仔细观察其实这个类和普通的aidl文件实现后几乎一样。
5. ActivityManagerService
最后来看看ActivityManagerService的实现:
- public final class ActivityManagerService extends ActivityManagerNative..... {
- .....
-
-
- @Override
- public void forceStopPackage(final String packageName, int userId) {
- if (checkCallingPermission(android.Manifest.permission.FORCE_STOP_PACKAGES)
- != PackageManager.PERMISSION_GRANTED) {
- String msg = "Permission Denial: forceStopPackage() from pid="
- + Binder.getCallingPid()
- + ", uid=" + Binder.getCallingUid()
- + " requires " + android.Manifest.permission.FORCE_STOP_PACKAGES;
- Slog.w(TAG, msg);
- throw new SecurityException(msg);
- }
- final int callingPid = Binder.getCallingPid();
- userId = handleIncomingUser(callingPid, Binder.getCallingUid(),
- userId, true, ALLOW_FULL_ONLY, "forceStopPackage", null);
- long callingId = Binder.clearCallingIdentity();
- try {
- IPackageManager pm = AppGlobals.getPackageManager();
- synchronized(this) {
- int[] users = userId == UserHandle.USER_ALL
- ? getUsersLocked() : new int[] { userId };
- for (int user : users) {
- int pkgUid = -1;
- try {
- pkgUid = pm.getPackageUid(packageName, user);
- } catch (RemoteException e) {
- }
- if (pkgUid == -1) {
- Slog.w(TAG, "Invalid packageName: " + packageName);
- continue;
- }
- try {
- pm.setPackageStoppedState(packageName, true, user);
- } catch (RemoteException e) {
- } catch (IllegalArgumentException e) {
- Slog.w(TAG, "Failed trying to unstop package "
- + packageName + ": " + e);
- }
- if (isUserRunningLocked(user, false)) {
- forceStopPackageLocked(packageName, pkgUid, "from pid " + callingPid);
- }
- }
- }
- } finally {
- Binder.restoreCallingIdentity(callingId);
- }
- }
- ....
-
- }
ActivityManagerService继承了ActivityManagerNative类,因此也实现了forceStopPackage接口。ActivityMangerProxy远程调用后,到了ActivityManagerNative的onTransact函数,然后调用到forceStopPackage接口,因为最后再ActivityManagerService实现了这个接口所以最后就到ActivityManagerService中来了。