zoukankan      html  css  js  c++  java
  • Android的Framework分析---5 ActivityManager分析

     

    Android系统开发交流群:484966421 OSHome。

    微信公众号:oshome2015



    ActivityManager是android框架的一个重要部分。它负责一新ActivityThread进程创建,Activity生命周期的维护,管理系统中的Acitvity的状态切换。

    这边内容还有很多其它内容,具体请參看ActivityManager.java ,ActivityMangaerNative.java 和SystemServcer.java 文件。
    这几个的类的关系例如以下:   

        
            上图非常清楚地描写叙述了ActivityManager框架的几个主要类之间的关系。我们做应用开发接触非常多的事实上就是ActivityManager类,该类也在SDK中发布。应用能够直接訪问,它提供了我们管理Activity的一些主要的方法

    public List<RunningTaskInfo> getRunningTasks(int maxNum, int flags, IThumbnailReceiver receiver)
                throws SecurityException {
            try {
                return ActivityManagerNative.getDefault().getTasks(maxNum, flags, receiver);
            } catch (RemoteException e) {
                // System dead, we will be dead too soon!
                return null;
            }
        }
      这些方法都是没有实现,而是调用了AcitvityManagerNative的getDefault()方法返回对象实现。

     /**
         * Retrieve the system's default/global activity manager.
         */
        static public IActivityManager getDefault() {
            return gDefault.get();
        }
    
      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;
            }
        };
    从上面的代码看出,从ServiceManager获取名字为activity的service。从AcitvityManagerService中有这么一句话

     ActivityManagerService m = mSelf;

     ServiceManager.addService(Context.ACTIVITY_SERVICE, m, true);而public static final String ACTIVITY_SERVICE = "activity";

    因此IBinder b 事实上就是ActivityManagerService.

    然而在ActivityManagerNative中asInterface的定义例如以下:

     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);
        }
    
    因此从以上代码能够看出 而这些操作都依赖于ActivityManagerProxy代理类的实现,IActivitManager接口定义了全部ActivityManager框架的操作,ActivityManagerProxy实现了接口IActivitManager。但并不真正实现这些方法,它仅仅是一个代理类,真正动作的运行为Stub类ActivityManagerService,ActivityManagerService对象仅仅有一个并存在于system_process进程中,ActivityManagerService继承于ActivityManagerNative存根类。

            从前面分析知,ActivityManager存在于用户进程中。由用户进程调用获取Activity管理的一些基本信息,可是ActivityManager类并不真正运行这些操作,操作的真正运行在system_process进程中的ActivityManagerService,ActivityManagerService作为一个服务在system_process启动时被载入,关于ActivityManagerService怎样被载入这里不展开讨论,后面在讨论android系统启动时在探讨,那么从ActivityManager到ActivityManagerService中间经过一个环节,那就是进程通信。而IActivityManager以及实现接口的代理类ActivityManagerProxy,存根类ActivityManagerNative起着负责进程通信的作用,尽管这里没有使用aidl文件定义进程通信接口IActivityManager。事实上是一样的。我们能够把它看做是自己手动编译的aidl进程通信java类实现,ActivityManagerProxy是代理类。ActivityManagerNative是Stub类,IActivityManager是aidl接口。这样就非常easy理解了。


            理解以上ActivityManager框架基本结构,后面深入研究它就要easy很多了。

     

  • 相关阅读:
    费曼学习法
    Ubuntu修改系统默认编码
    如何在Ubuntu 18.04上安装和使用PostgreSQL
    Bash简介 & Bash是如何处理命令的
    ubuntu环境变量的三种设置方法
    psql 工具详细使用介绍
    使用ubuntu server18.04 搭建odoo12运行环境
    Ubuntu修改时区和更新时间
    Ubuntu18.04修改apt-get源
    对表内数据间隔特定的长度求和
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/6814931.html
Copyright © 2011-2022 走看看