Android框架分析之ActivityManager

 Android源码是最好的学习教材,理解了源码中的设计模式和设计思想对于编程能力的提升大有帮助,本文就从ActivityManager入手开始学习Android源码。 一。ActivityManager的作用是为系统中所有运行着的Activity提供交互的接口,主要的接口围绕着运行中的进程信息,任务信息,服务信息等。ActivityManager相关的结构类图如下:

 类图中描述的ActivityManager机制采用的是代理模式,将自己要实现的功能委托给别人实现,使得结构更加简洁,

职责更加清晰,不用关心其他本职责以外的事物,降低了与其他类之间的耦合。同时也起到了保护代理对象和被代理对象

的作用,以及有利于后期的扩展等作用。这里以获取正在运行的服务信息为例进行说明,函数的源码为: ActivityManager.java

 public List<RunningServiceInfo> getRunningServices(int maxNum) throws SecurityException {
        try {
            return (List<RunningServiceInfo>)ActivityManagerNative.getDefault().getServices(maxNum, 0);
        } catch (RemoteException e) {
            // System dead, we will be dead too soon!
            return null;
        }
    }

 ActivityManagerNative.java

static public IActivityManager asInterface(IBinder obj){
               ...
        return new ActivityManagerProxy(obj);
    }
    static public IActivityManager getDefault(){
               ...
        IBinder b = ServiceManager.getService("activity");
        gDefault = asInterface(b);
        return gDefault;
    }

ActivityManager调用getRunningServices()函数,但其自己并未实现该功能,而是进而调用了ActivityManagerProxy代理类

getServices()函数,该类是ActivityManagerNative的代理类,这两个类都实现了IActivityManager接口,这就是代理模式

的结构。调用ActivityManagerProxy代理类的getServices()函数时,会去调用ActivityManagerNative中的相应函数,但该

类也没有真正的实现具体的功能,而是通过Binder进程通信机制去调用ActivityManagerService中的getServices()函数,

ActivityManagerService中实现了具体的功能。调用的时序图如下:


 其中的transact()函数和onTransact()函数是Binder机制提供的,实现跨进程的通信,这里暂不讨论。这样将上层的

功能转移给了代理,由代理再转移给底层去实现,层次分明,功能明确,同时也提高了设计的安全性。

(一点愚见,欢迎指正。)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值