在 Android插件化(加载插件) 中,简略的用一个demo 讲了如何加载一个插件,并运用插件里的资源。

那假如咱们的插件中有多个页面呢,要怎么办?

其实,也是很简略,仍是经过外部 PluginActivitystartActivity来完成

一、LifeActivitystartActivity

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

Android 插件化(插件内部跳转)

能够看到,插件中的第一个页面 TestActivity 点击翻开 插件页面 Test2Activity 时。写法跟咱们在Android中的风格是一模一样的。其间的 findViewById 等,只要是用到上下文的,悉数替换成宿主的,这里不多赘述了。

Android 插件化(插件内部跳转)

二、重写 PluginActivitystartActivity

注意:由于 Test2Activity 不是一个真正 Activity ,PluginActivitystartActivity 中,就不能翻开这个页面,只能再从头翻开一个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 ,至此就完成了插件内部的跳转,是不是非常简略。

Android 插件化(插件内部跳转)

三、同理,有 Activity 就会有其他组件

咱们能够在插件中自己完成 serviceContentProviderBroadcastReceiver 等等组件,偏重写生命周期等方法。原理都非常简略,难的是思维,这些都是插件化中的冰山一脚,我自己的项目中的更加复杂。

由于这样的方式,需求手动创建生命周期办理,和后续Activity发动形式,入栈出栈的办理等等。其实能够运用ASM等字节码来转换,将四大组件转成一般类,这样,开发过程中简略调试,插件生成也相对简略。

四、动态加载

由于插件apk 是能够从外部sdk 等当地加载的,给咱们带来许多便利。而且插件部分的资源都是动态的,能够做到热更新的效果,只要我修改了再从头打包下发就行了。后续能够自己完成一套插件办理,用于加载外部apk ,做到热插拔的效果。