码迷,mamicode.com
首页 > 移动开发 > 详细

Android的Framework分析---5 ActivityManager分析

时间:2017-05-05 21:43:57      阅读:232      评论:0      收藏:0      [点我收藏+]

标签:框架   系统启动   net   ram   fonts   work   asi   framework   running   

 

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很多了。

 

Android的Framework分析---5 ActivityManager分析

标签:框架   系统启动   net   ram   fonts   work   asi   framework   running   

原文地址:http://www.cnblogs.com/cxchanpin/p/6814931.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!