ActivityManager、ActivityManagerService、ActivityManagerNative、ActivityManagerProxy的关系(and5.1)
来源:互联网 发布:s7下不了软件 编辑:程序博客网 时间:2024/05/07 09:49
由于ActivityManagerService没有使用aidl机制,因此就直接用了代码实现看上去复杂了一些,下面我们来理下ActivityManager、ActivityManagerService、ActivityManagerNative、ActivityManagerProxy的关系。
1.ActivityManagerNative
先来看ActivityManagerNative:
public abstract class ActivityManagerNative extends Binder implements IActivityManager{ /** * Cast a Binder object into an activity manager interface, generating * a proxy if needed. */ 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); } /** * Retrieve the system's default/global activity manager. */ 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;//这个就是从ServiceManger获取的IBinder } 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);//远程调用,然后就到ActivityManagerNative的onTranct函数中处理了。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; // Remaining non-native transaction codes. 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中来了。
- ActivityManager、ActivityManagerService、ActivityManagerNative、ActivityManagerProxy的关系(and5.1)
- ActivityManager、ActivityManagerService、ActivityManagerNative、ActivityManagerProxy的关系(and5.1)
- ActivityManager、ActivityManagerService、ActivityManagerNative、ActivityManagerProxy的关系(and5.1)
- ActivityManager、ActivityManagerService、ActivityManagerNative、ActivityManagerProxy的关系(and5.1)
- ActivityManagerService && ActivityManager
- IActivityManager ,ActivityManagerNative,ActivityManagerService之间如何进行工作
- IActivityManager ActivityManagerNative ActivityManagerService之间如何进行工作
- 有关ActivityManager的关系结构
- android api 26 ActivityManagerNative类被弃用。代理类ActivityManagerProxy已经被删除。改用AIDL方式。
- Activity ActivityManagerService以及WindowManagerService之间的关系
- WMS简介 (and5.1)
- 深入init进程(and5.1)
- ActivityManagerService的源代码分析
- ActivityManagerService的启动
- ActivityManagerService的启动过程
- ActivityManagerService的学习笔记
- Android Framework ActivityManagerService(1)
- Android ActivityManagerService 笔记(1)
- @SuppressLint("NewApi")和@TargetApi(number)使用比较
- PHP利用 JSON 将XML转换为数组
- 内-左-右-全-交叉:连接
- ArcGIS API for JavaScript之BlendRenderer融合渲染
- android studio ignore 文件
- ActivityManager、ActivityManagerService、ActivityManagerNative、ActivityManagerProxy的关系(and5.1)
- Apache流量猛增,并发过高导致问题的处理解决方案
- HDU 1394 Minimum Inversion Number(树状数组||线段树)
- html、js实现facebook、twitter分享
- 有一个fuck叫做wfg,还是大写---python的@修饰符解析
- 读《Boost程序库完全开发指南》
- 高并发的几个解决方案
- .net反射的研究
- Java IO系列3 字节流之DataInputStream与DataOutputStream