Android 插件平台技术 基本介绍和direct-load-apk介绍

摘要

上一篇文章 http://blog.csdn.net/u011319826/article/details/49447755
为大家介绍了dynamic-load-apk的基本用法,本篇文章主要介绍directloadapk,利用自定义的instrumentation来改善一下原有工程在插件activity调起。
上一篇文章中,插件activity必须利用

startPluginActivity(...)

来进行调起,本文主要介绍如何让其使用startActivity即可调起。

方案二 direct-load-apk介绍

跟dynamic-load-apk相比,direct-load-apk最大的不同是,利用反射将宿主actvity的context神马的交给插件activity,这样,可以直接用context.startActivity来启动目标activity,而不用再去调用特别封装的方法,逼格微高啊。
我们这里也只对一些不同点进行介绍,就不详细讨论了,有需要的同学去看源码吧。

PluginActivityControl

public void dispatchProxyToPlugin() {
        try {
            //开始伪装插件为实体Activity
            pluginRef.set("mBase", 代理activity);
            ....... //用于将代理actvitiy的一些变量赋值给插件actitity,这样你在调用的时候就可以直接让代理activity来给你执行

这里的思路和dynamicloadapk思路一本一样,但是就是实现方法不太一样。(dynamicloadapk是封装一些函数给你调用,这里是直接改变量了)

时序图

Android 插件平台技术 基本介绍和direct-load-apk介绍_第1张图片

1.PluginLaunch 触发调起插件的动作。
2.LActivityProxy的onCreate中,会进行load插件activity的工作。load完成之后,会实例化一个PluginActivityControl对象(如步骤3)。
4.dispatchProxyToPlugin方法做的操作上面介绍了。
5.callOnCreate 调起插件activity的onCreate方法。
6.插件的onCreate被调起,这样,插件activity就被调用起来了。

让dynamicloadapk直接利用startActivity来调起

dynamicloadapk必须利用平台封装的方法才能调起,有时候难免插件研发会吐槽,为了让插件通过startActivity的方式调起,我么可以利用direct-load-apk中PluginActivityControl的dispatchProxyToPlugin()的一段代码

pluginRef.set("mWindow", mProxyActivity.getWindow()); 

Instrumentation instrumentation = proxyRef.get("mInstrumentation");

pluginRef.set("mInstrumentation", new LPluginInsrument(instrumentation));

pluginRef.set("mMainThread", proxyRef.get("mMainThread"));

利用上面的反射,可以将自定义的LPluginInsrument赋值给插件activity的mInstrumentation变量,这样在插件进行startActivity时,LPluginInsrument的execStartActivity就会被调用,这样的话,你就可以再启动一个代理activity,然后把插件activity运行起来就ok了。

小结

1.比较direct和dynamic的不同,其实基本思路都是一致的,只是利用context等获取资源等一些和安卓系统进行交互式,实现方式不一样。
2.个人觉得dynamic这种封装接口给组件调用的形式更好一些。因为可以规范一些,可以减少一些坑。但是为了兼容尽可能多的插件,可能两种方式会进行一定的结合,因为插件接入平台想要的是改动越少越好,全都要用平台封装的东西会导致代码改动过大,大家还是会吐槽,逼格就不高了。

Reference

1.https://github.com/melbcat/Direct-Load-apk
2.http://get.ftqq.com/987.get
3.其他网络文章。此处有遗漏,请见谅。

你可能感兴趣的:(安卓插件平台)