ActivityManager 讲解1.ActivityManager是android框架的一个重要部分,它负责一新ActivityThread进程创建,Activity生命周期的维护,本blog就是着手对ActivityManager框架作一个整体的了解 2.先看一个静态类结构图: 上图很清楚地描述了ActivityManager框架的几个主要类之间的关系,我们做应用开发接触很多的
大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。 Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺 1.ActivityManager 是 android 框架的一个重要部分,它负责一新 ActivityThread 进程创建, Activity 生命周期的维护,本 blog 就是着手对 ActivityManager 框架作一个整体的了解 2. 先看一个静态类结构图:
上图很清楚地描述了 ActivityManager 框架的几个主要类之间的关系,我们做应用开发接触很多的其实就是 ActivityManager 类,该类也在 SDK 中公布,应用可以直接访问,它提供了我们管理 Activity 的一些基本的方法 如下: public void testgetRecentTasks() // 获取最近的应用,最后启动的排前 public void testgetRunningTasks() // 获取当前运行的 Activity 应用 public void testgetRunningServices() // 获取当前运行的 service 应用 public void testgetRunningAppProcesses() // 获取所用系统运行的进程 而这些操作都依赖于 ActivityManagerProxy 代理类的实现, IActivitManager 接口定义了所有 ActivityManager 框架的操作, ActivityManagerProxy 实现了接口 IActivitManager ,但并不真正实现这些方法,它只是一个代理类,真正动作的执行为 Stub 类 ActivityManagerService,ActivityManagerService 对象只有一个并存在于 system_process 进程中, ActivityManagerService 继承于 ActivityManagerNative 存根类。 3. 从前面分析知, ActivityManager 存在于用户进程中,由用户进程调用获取 Activity 管理的一些基本信息,但是 ActivityManager 类并不真正执行这些操作,操作的真正执行在 system_process 进程中的 ActivityManagerService,ActivityManagerService 作为一个服务在 system_process 启动时被加载,关于 ActivityManagerService 如何被加载这里不展开讨论,后面在讨论 android 系统启动时在探讨,那么从 ActivityManager 到 ActivityManagerService 中间经过一个环节,那就是进程通信,而 IActivityManager 以及实现接口的代理类 ActivityManagerProxy, 存根类 ActivityManagerNative 起着负责进程通信的作用,我在前面的 blog aidl 实现机制浅析中有对进程通信作了较深入的分析,虽然这里没有使用 aidl 文件定义进程通信接口 IActivityManager ,其实是一样的,我们可以把它看做是自己手动编译的 aidl 进程通信 java 类实现, ActivityManagerProxy 是代理类, ActivityManagerNative 是 Stub 类, IActivityManager 是 aidl 接口,这样就很容易理解了。 4.ActivityManager 提供了很少的方法,要能够使用 IActivityManager 接口提供的其他方法我们可以直接使用 ActivityManagerProxy 对象,如何获取? return ActivityManagerNative.getDefault() 不要被方法名称所迷惑,由于我们在用户进程调用,是不可能获取一个 ActivityManagerNative 对象的 ( 再说 ActivityManagerNative 是一个 abstract 类 ) ,我们实际获取的是一个 ActivityManagerProxy 对象 理解以上 ActivityManager 框架基本结构,后面深入研究它就要容易许多了
Android FrameWork——PackageManager 框架
1. 接着前面讲的 ActivityManager 框架,继续说一下系统另一个重要的框架, PackagerManager 同样先看一下静态类结构图:
大部分情况我们是在 Activity 中使用 getPackageManager 方法获取一个 ApplicationPackageManager 的对象, ApplicationPackageManager 实际上是包装了一个 IPackageManager.Stub.Proxy 的对象 由 IPackageManager.Stub.Proxy 代理执行 PackageManager 相关操作, IPackageManager.Stub.Proxy 实际代理的是 PackageManagerService, 2. 看了前面说的,可能你有点晕,我们再来重新理一下: 首先是 IPackageManager 是通过 IPackageManager.aidl 文件生成,同时生成了存根类 IPackageManager.Stub ,代理类: IPackageManager.Stub.Proxy 这个是 packageManager 进程通信的基本框架,我前面 blog 有说,不多加说明了 然后 PackageManagerService ,它继承了 IPackageManager.Stub, 它作为 PackageManager 动作的实际执行者,在 system_process 中存在 再是我们用户应用程序中的 ApplicationPackageManager, 先看它如何被获取的: ContextImpl.java中有一个方法: public PackageManager getPackageManager() { if (mPackageManager != null) { return mPackageManager; }
IPackageManager pm = ActivityThread.getPackageManager(); if (pm != null) { // Doesn’t matter if we make more than one instance. return (mPackageManager = new ApplicationPackageManager(this, pm)); }
return null; } ApplicationPackageManager 实际上是包装了一个 IPackageManager 对象 (IPackageManager.Stub.Proxy), 当我们调用 queryIntentActivities 时,实际通过代理对象去执行: public List<ResolveInfo> queryIntentActivities(Intent intent, int flags) { try { return mPM.queryIntentActivities(//mPM 是 IPackageManager.Stub.Proxy 对象 intent, intent.resolveTypeIfNeeded(mContext.getContentResolver()), flags); } catch (RemoteException e) { throw new RuntimeException(“Package manager has died”, e); } } 进过进程通信,在 PackageManagerService 执行对应操作: 3.PackageManagerService的构建与获取 –PackageManagerService的构建:在 system_process 进程加载时, PackageManagerService 被构建,在 SystemServer.ServerThread.run 中有如下一段代码,它就是加载 PackageManagerService 的: Slog.i(TAG, “Package Manager”); pm = PackageManagerService.main(context, factoryTest != SystemServer.FACTORY_TEST_OFF);// 启动 PackageManagerService ///PackageManagerService/// public static final IPackageManager main(Context context, boolean factoryTest) { PackageManagerService m = new PackageManagerService(context, factoryTest); ServiceManager.addService(“package”, m); return m; } –PackageManagerService 获取 : 先看前面在 ContextImpl.java->getPackagerManager 中: IPackageManager pm = ActivityThread.getPackageManager(); /ActivityThread public static IPackageManager getPackageManager() { if (sPackageManager != null) { //Slog.v(“PackageManager”, “returning cur default = ” + sPackageManager); return sPackageManager; } IBinder b = ServiceManager.getService(“package”); //Slog.v(“PackageManager”, “default service binder = ” + b); sPackageManager = IPackageManager.Stub.asInterface(b); //Slog.v(“PackageManager”, “default service = ” + sPackageManager); return sPackageManager; } 从 ServiceManager 中获取的服务 pakager, 该服务在 .PackageManagerService 的构建时被注册到 ServiceManager 中的, ServiceManager 机制暂时没有深入了解,后面再发 blog 专门说一下 ServiceManager
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/196506.html 原文链接:https://javaforall.net