要解决的问题:不安装APK,插件式开发,加载插件APK当中的activity,service等组件,或者其中的resource
背景知识:Dex可以被Dalvik直接加载,APK包含Dex,所以也可以被Dalvik加载
主要用到的API:
- DexClassLoader,他可以加载未安装的APK,Dex,Jar。另外还有两个API不是很合适:PathClassLoader,URLClassLoader,前者只能加载安装的APK,后者jar并不能给Dalvik直接识别,需要用工具转成Dex
宿主启动插件activity的主要思路:
- 使用ProxyActivity作为插件APK的activity的容器
- 如果宿主application想启动插件APK中的Activity,实际上是宿主application首先启动proxyactivity,并将插件的路径信息通过intent传递给proxyactivity,再由proxyactivity在onCreate()函数中根据插件的路径细心,分析出所需要加载的插件activity的class信息,并最终通过DexClassLoader去加载这个class,然后再通过反射创建这个class的实例,以及通过反射来调用他的生命周期函数。
- 同时,插件Activity也要握有proxyactivity的reference,因为这个proxyactivity将是他和宿主的桥梁
插件activity的逻辑怎么执行:
- 最关键的是插件activity要持有proxyactivity,这个是通过插件activity的构造函数,由宿主传递给插件activity的
- 插件activity的所有view,都是要set到proxyactivity中去:
@Override
public void setContentView(View view, LayoutParams params) {
if (mProxyActivity == this) {
super.setContentView(view, params);
} else {
mProxyActivity.setContentView(view, params);
}
}
- 当然,插件activity也可以是一个普通的activity,只要让他的proxyactivity是它自己就可以了
- 其余的事件处理,注册应该和普通的activity一样
插件activity如何启动另一个插件activity...还没搞懂