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

本文解析了Android系统中ActivityManager的工作原理及其实现机制,重点介绍了ActivityManager与ActivityManagerService之间的交互过程,以及它们如何通过进程间通信进行协作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

这边内容还有更多内容,详细请参看ActivityManager.java ,ActivityMangaerNative.java 和SystemServcer.java 文件。
这几个的类的关系如下:   

    
        上图很清楚地描述了ActivityManager框架的几个主要类之间的关系,我们做应用开发接触很多的其实就是ActivityManager类,该类也在SDK中公布,应用可以直接访问,它提供了我们管理Activity的一些基本的方法

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. public List<RunningTaskInfo> getRunningTasks(int maxNum, int flags, IThumbnailReceiver receiver)  
  2.             throws SecurityException {  
  3.         try {  
  4.             return ActivityManagerNative.getDefault().getTasks(maxNum, flags, receiver);  
  5.         } catch (RemoteException e) {  
  6.             // System dead, we will be dead too soon!  
  7.             return null;  
  8.         }  
  9.     }  
  这些方法都是没有实现,而是调用了AcitvityManagerNative的getDefault()方法返回对象实现。

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.     * Retrieve the system's default/global activity manager. 
  3.     */  
  4.    static public IActivityManager getDefault() {  
  5.        return gDefault.get();  
  6.    }  
  7.   
  8.  private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {  
  9.        protected IActivityManager create() {  
  10.            IBinder b = ServiceManager.getService("activity");  
  11.            if (false) {  
  12.                Log.v("ActivityManager""default service binder = " + b);  
  13.            }  
  14.            IActivityManager am = asInterface(b);  
  15.            if (false) {  
  16.                Log.v("ActivityManager""default service = " + am);  
  17.            }  
  18.            return am;  
  19.        }  
  20.    };  
从上面的代码看出,从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的定义如下:

[java]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. static public IActivityManager asInterface(IBinder obj) {  
  2.        if (obj == null) {  
  3.            return null;  
  4.        }  
  5.        IActivityManager in =  
  6.            (IActivityManager)obj.queryLocalInterface(descriptor);  
  7.        if (in != null) {  
  8.            return in;  
  9.        }  
  10.   
  11.        return new ActivityManagerProxy(obj);  
  12.    }  
因此从以上代码可以看出 而这些操作都依赖于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接口,这样就很容易理解了。


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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值