Android 源码的代理模式

Android 源码的代理模式

代理模式介绍

代理模式(Proxy Pattern)也称为委托模式,是结构型设计模式的第一个模式。

代理模式的定义

为其他对象提供一种代理以控制对这个对象的访问。

代理模式的使用场景

当无法或不想直接访问某个对象或访问某个对象存在困难时,可以通过一个代理对象来间接访问,为了保证客户端使用的透明性,委托对象与代理对象需要实现相同的接口。

Android 源码中的代理模式实现

当应用通过 ActivityManager 访问 ActivityManagerService 的接口方法时,本质上是通过 IActivityManager 生成的代理对象访问的,是一种典型的代理模式。

与自定义的 aidl 文件类似,IActivityManager.java 也是通过 IActivityManager.aidl 生成的,只不过 IActivityManager.aidl 是系统 Framework 定义的 aidl 文件。

IActivityManager

IActivityManager 位于 frameworks/base/core/java/android/app/IActivityManager.aidl。

IActivityManager 接口定义如下:

...
/**
 * System private API for talking with the activity manager service.  This
 * provides calls from the application back to the activity manager.
 *
 * {@hide}
 */
interface IActivityManager {
    ...
    @UnsupportedAppUsage
    int startActivity(in IApplicationThread caller, in String callingPackage, in Intent intent,
            in String resolvedType, in IBinder resultTo, in String resultWho, int requestCode,
            int flags, in ProfilerInfo profilerInfo, in Bundle options);
    ...
}

ActivityManagerService

接口真正的实现都在 ActivityManagerService 类。

public class ActivityManagerService extends IActivityManager.Stub
        implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback {
    ...
}

可以看出 ActivityManagerService 继承了 IActivityManager.Stub 类。IActivityManager.Stub 是 IActivityManager.aidl 生成的 java 文件的内部抽象类。

ActivityManagerService 实现的 startActivity 方法如下:

    @Override
    public final int startActivity(IApplicationThread caller, String callingPackage,
            Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
            int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) {
        return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
                resultWho, requestCode, startFlags, profilerInfo, bOptions,
                UserHandle.getCallingUserId());
    }

ActivityManager getService

ActivityMangerService 的本地代理是 ActivityManager 通过 getService() 方法得到的 IActivityManager 对象。

    public static IActivityManager getService() {
        return IActivityManagerSingleton.get();
    }

    private static final Singleton<IActivityManager> IActivityManagerSingleton =
            new Singleton<IActivityManager>() {
                @Override
                protected IActivityManager create() {
                    final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
                    final IActivityManager am = IActivityManager.Stub.asInterface(b);
                    return am;
                }
            };

首先通过 IActivityManagerSingleton 的 get 方法获取一个 IActivityManager 的单例。IActivityManager 通过 ServiceManager 的 getService 方法得到代理的 IBinder 对象,然后通过 IActivityManager.Stub.asInterface 方法将代理的 IBinder 转化为 IActivityManager 接口。

因此,使用 IActivityManager 接口就像直接调用 ActivityMangerService 一样。但实际上,调用代理 IActivityManager 时,会将数据打包跨进程传递给 Server 端的 ActivityMangerService 处理并返回结果。这些过程都在 IActivityManager.java 的内部实现中完成,所以看上去调用代理时隐藏了内部 transact 的细节。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android码设计模式解析与实践是一本关于Android系统中的设计模式的书籍,旨在通过解析Android码中的实际案例来理解和应用设计模式。 Android系统是一个庞大而复杂的开项目,其中包含了大量的设计模式。这些设计模式不仅帮助Android系统实现了高效、稳定、易于扩展的特性,也可以为Android开发者提供参考和借鉴的经验。 本书首先介绍了设计模式的概念和基本原理,包括单例模式、工厂模式、观察者模式、策略模式等。然后,结合Android码中的具体实例,详细讲解了这些设计模式在Android系统中的应用场景和实践方法。 例如,书中通过分析Android系统中的Activity、Fragment、View等核心组件的码,解析了它们是如何应用观察者模式和状态模式来实现界面更新和事件传递的。又如,书中通过分析Android系统中的Handler、Looper、MessageQueue等核心类的码,讲解了它们是如何应用责任链模式来实现线程间通信和消息处理的。 此外,本书还探讨了Android系统中的一些特殊设计模式,如MVC模式、MVP模式、MVVM模式等,帮助读者理解和应用这些模式来构建更加优雅和可维护的Android应用程序。 总之,通过学习和实践本书中介绍的Android码设计模式,读者可以更深入地了解Android系统的设计原则和实践经验,提升自己的Android开发技能,并能够更加高效地开发出高质量的Android应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值