APK动态加载框架
优点:
---简化宿主程序的大小,动态加载模块功能,减小原始apk包大小,解决R文件中int定义超过65535问题。
限制性:
---插件和宿主app之间必须受某种规范的约束,才能将其装载,进而在一个进程内相互传值。
---目前只支持动态注册广播。首次调用apk时不支持加载Fragment,必须是context形式的启动类。
解释 一下:是通过反射找到apk启动的Context来唤起apk的。
--插件中.so文件还不支持调用!
调用插件的实现流程:
第一步:
1、在插件apk中引入lib文件,在插件apk中add宿主工程
![](https://i-blog.csdnimg.cn/blog_migrate/24f58826305ba8a046d6a662b11b09fa.png)
插件apk的启动context(service或者Activity)必须继承至
DLBasePluginService、DLBasePluginActivity或者DLBasePluginFragmentActivity
第二步:
插件apk,以下简称plug要重写onCreate()方法
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
第三步:
使用that作为代理Context的实例(为什么这样做?先不管,后面做解释)
比如toast时这样定义:
Toast.makeText(that, "HostExtra----->" +HostExtra, Toast.LENGTH_SHORT ).show();
第四步:
*调用传值
1、宿主向plug传值:
DLPluginManager pluginManager = DLPluginManager.getInstance(this);
DLIntent dlIntent= new DLIntent(
packageInfo.packageName , item.launcherActivityName);//目标插件启动类(以启动activity为例)
dlIntent.putExtra( "HostExtra", "TestIntent--->HostExtra" );
pluginManager.startPluginActivity( this,dlIntent);
2、plug接受传值:
String HostExtra;
if(this.getIntent()!= null){
HostExtra =this.getIntent().getStringExtra("HostExtra");
Log. w("HostExtra----->", HostExtra);
Toast. makeText(that, "HostExtra----->" +HostExtra , Toast.LENGTH_SHORT).show();
}
3、plug向宿主传值与上面方法相同。
4、plug调用宿主中的方法:
Button button=;
button.setOnClickListener( new OnClickListener() {
@Override
public void onClick(View v) {
TestHostClass testHostClass = new TestHostClass();//宿主中类(前提是第一步中add宿主工程)
testHostClass.testMethod( that);
}
});
--宿主中该类是这样定义的:
![](https://i-blog.csdnimg.cn/blog_migrate/74690062921154a4fefc5631bf04e578.png)
public class TestHostClass {
public void testMethod(Context context) {//context是上面的that
Toast. makeText(context, "Successed invoke host method", Toast.LENGTH_SHORT).show();
}