ActivityManager 讲解

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框架的几个主要类之间的关系,我们做应用开发接触很多的其实就是ActivityManager类,该类也在SDK中公布,应用可以直接访问,它提供了我们管理Activity的一些基本的方法
如下:
        public void testgetRecentTasks()
                //
获取最近的应用,最后启动的排前
        public void testgetRunningTasks()
                //
获取当前运行的Activity应用
        public void testgetRunningServices()
                //
获取当前运行的service应用
        public void testgetRunningAppProcesses()
                //
获取所用系统运行的进程
       
而这些操作都依赖于ActivityManagerProxy代理类的实现,IActivitManager接口定义了所有ActivityManager框架的操作,ActivityManagerProxy实现了接口IActivitManager,但并不真正实现这些方法,它只是一个代理类,真正动作的执行为StubActivityManagerService,ActivityManagerService对象只有一个并存在于system_process进程中,ActivityManagerService继承于ActivityManagerNative存根类。
        3.
从前面分析知,ActivityManager存在于用户进程中,由用户进程调用获取Activity管理的一些基本信息,但是ActivityManager类并不真正执行这些操作,操作的真正执行在system_process进程中的ActivityManagerService,ActivityManagerService作为一个服务在system_process启动时被加载,关于ActivityManagerService如何被加载这里不展开讨论,后面在讨论android系统启动时在探讨,那么从ActivityManagerActivityManagerService中间经过一个环节,那就是进程通信,而IActivityManager以及实现接口的代理类ActivityManagerProxy,存根类ActivityManagerNative起着负责进程通信的作用,我在前面的blog aidl实现机制浅析中有对进程通信作了较深入的分析,虽然这里没有使用aidl文件定义进程通信接口IActivityManager,其实是一样的,我们可以把它看做是自己手动编译的aidl进程通信java类实现,ActivityManagerProxy是代理类,ActivityManagerNativeStub类,IActivityManageraidl接口,这样就很容易理解了。
        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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • CAS 单点登录/登出 系统「建议收藏」

    CAS 单点登录/登出 系统「建议收藏」前言:  在我们的实际开发中,更多的是采用分布式系统。那么问题来了,对于分布式系统的登录问题,我们如何解决呢?  如果说我们在每一个系统中都要进行一次登录,那么用户体验度也就差的没法用了。以京东商城为例,如果用户在登录京东商城的时候需要登录一次,在查询商品的时候还有在登录一次,加入购物车是还要重新登录,…(注意,每跳过一个页面都是进入了一个新的系统,请看他的url地址的变化)…

    2022年5月9日
    251
  • 1.7-工控上位机软件开发平台介绍

    1.7-工控上位机软件开发平台介绍一、前言前面几章一直没有提到上位机的另一个主要使用场合,即“工业上位机软件”。主要是因为本人没有接触过,不敢贸然发表见解类的文章。最近在机缘巧合下,对“工业上位机软件”有了一些初步的了解。在这里和大家分享一下。注意本节的内容还不够专业全面,只适合对“工控软件”进行一个初步的了解。二、工业“自动化”控制系统的组成在工业生产过程中,最重要的是安全,其次是稳定。工业生产环境中可以常见大如“吊车”般的设备、有毒气体、强碱、强酸、几千度的高温、易燃易爆气体、高压水蒸气。所以容不得半点错误,出错就意味着要死人,因

    2022年5月31日
    82
  • linux安装启动nginx_centos7 安装

    linux安装启动nginx_centos7 安装环境:VMware16pro,centos7解决:安装nginx前的准备安装gcc环境:在官网下载的nginx源码需要编译,所以需要gcc环境。yuminstallgcc-c++安装PCREpcre-develNginx的Rewrite模块和HTTP核心模块会使用到PCRE正则表达式语法。这里需要安装两个安装包pcre和pcre-devel。第一个安装包提供编译版本的库,而第二个提供开发阶段的头文件和编译项目的源代码。安装命令如下:yuminstall-ypcr

    2022年10月5日
    2
  • Ubuntu 卸载postgresql「建议收藏」

    Ubuntu 卸载postgresql「建议收藏」#####1.卸载当前所有Postgresql相关的Package:apt-getremovepostgresql*ThefollowingpackageswillbeREMOVED:postgresql*postgresql-9.1*postgresql-client-9.1*postgresql-client-common*postgresql-common*…

    2022年5月22日
    41
  • Vagrant 基本使用操作

    Vagrant 基本使用操作OthersVagrant基本使用操作Vagrant是什么?Vagrant安装Vagrant快速上手安装CentOSVagrant基本命令小结Vagrantfile文件Vagrant基本使用操作Vagrant是什么?Vagrant是一款支持自动化虚拟机暗转、可配置流程的用于管理虚拟机的软件.主要的优势在于可以提供一个可配置、可移植和复用的虚拟机环境(通过定义Vagr…

    2025年7月29日
    3
  • 放弃pycharm,选择vscode或者sublime之路「建议收藏」

    放弃pycharm,选择vscode或者sublime之路「建议收藏」我已经对pycharm忍无可忍了。打算换一个编辑器,我参考了网上很多大佬的意见。https://www.zhihu.com/question/41857899中有一位大神总结了以下三款比较不错的编辑器,不过Atom直接放弃,因为真的是不行。 考虑sublime和vscode,看到追求打开小文件的速度的话,可以选择sublime,不过更新有点慢。vsocde打开大文件比较快,总之对比一…

    2022年8月28日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号