Android 插件化:插件内部跳转
在Android 插件化(加载插件)中,简单的用一个demo 讲了如何加载一个插件,并使用插件里的资源。
那如果我们的插件中有多个页面呢,要怎么办?
其实,也是很简单,还是通过外部 PluginActivity
的 startActivity
来实现
一、LifeActivity
的 startActivity
在LifeActivity
这个插件类中定义一个 startActivity
方法,用宿主的 context 调用 startActivity
方法
public void startActivity(Intent intent) {
if (context != null) {
if (intent==null||intent.getComponent()==null)return;
Intent newIntent=new Intent();
String className=intent.getComponent().getClassName();
if (TextUtils.isEmpty(className))return;
Log.e("startActivity","className="+className);
newIntent.putExtra("className",intent.getComponent().getClassName());
context.startActivity(newIntent);
}
}
而对于第一个插件中的页面 TestActivity
可以看到,插件中的第一个页面 TestActivity
点击打开 插件页面 Test2Activity
时。写法跟我们在Android中的风格是一模一样的。其中的 findViewById
等,只要是用到上下文的,全部替换成宿主的,这里不多赘述了。
二、重写 PluginActivity
的 startActivity
注意:由于 Test2Activity
不是一个真正 Activity ,PluginActivity
的 startActivity
中,就不能打开这个页面,只能再重新打开一个PluginActivity
,并将Test2Activity
类的信息再重新加载实例化一次,跟我们第一个加载TestActivity
是一样的。
override fun startActivity(intent: Intent?) {
val className = intent?.getStringExtra("className")
if (className.isNullOrBlank()) return
val newIntent = Intent(this, PluginActivity::class.java)
newIntent.putExtra("className", className)
super.startActivity(newIntent)
}
传入进去的 className 就是 Test2Activity
,在PluginActivity 走生命周期onCreate
时,loadClassActivity
,至此就完成了插件内部的跳转,是不是非常简单。
三、同理,有 Activity
就会有其他组件
我们可以在插件中自己实现 service
、 ContentProvider
、 BroadcastReceiver
等等组件,并重写生命周期等方法。原理都非常简单,难的是思想,这些都是插件化中的冰山一脚,我自己的项目中的更加复杂。
由于这样的方式,需要手动创建生命周期管理,和后续Activity启动模式,入栈出栈的管理等等。其实可以使用ASM等字节码来转换,将四大组件转成普通类,这样,开发过程中容易调试,插件生成也相对简单。
四、动态加载
由于插件apk 是可以从外部sdk 等地方加载的,给我们带来很多便利。而且插件部分的资源都是动态的,可以做到热更新的效果,只要我修改了再重新打包下发就行了。后续可以自己实现一套插件管理,用于加载外部apk ,做到热插拔的作用。
作者:大强Dev
来源:juejin.cn/post/7209971268483825722
来源:juejin.cn/post/7209971268483825722