在 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 ,做到热插拔的效果。