我们也知道如果不要求对插件代码无侵入性,也不要求插件能独立安装运行,实际上是可以把让插件Activity不用继承系统Activity了,就简单继承一个普通类就行了。这个普通类上定义一些跟系统Activity类一样的生命周期方法,实现成空实现,然后这些生命周期方法可以设置成public的,这样壳子Activity以这个普通类类型持有插件Activity就可以直接调用插件Activity的生命周期方法了。这样实现既不用反射也不用私有API。
而我们实际上是不需要插件的apk能独立安装运行的,我们希望插件能独立安装运行的本质目的是节省人力,不要维护两套代码。所以看起来,这里只要引入AOP手段,通过AOP编程修改插件Activity的父类,把插件Activity的父类从系统Activity改成我们想要的普通类就行了。
我们先不说这个AOP手段怎么实现,因为问题还没彻底搞清。我们是真的想让A持有B,A收到什么调用就转调B的什么调用吗?这是我们的真正目的吗?不是的。单纯的只是让插件Activity中的super.onCreate()
调用失效,并不完美。因为这跟插件Activity正常安装运行时还有点不一样。现在插件Activity的onCreate方法的代码就相当于是壳子Activity的onCreate方法的代码的一部分了。比如:
class ShadowActivity {
public void onCreate(Bundle savedInstanceState) {
}
}
class PluginActivity extends ShadowActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.out.println(“Hello World!”);
}
}
class ContainerActivity extends Activity {
ShadowActivity pluginActivity;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
pluginActivity.onCreate(savedInstanceState);
}
}
上面的ShadowActivity
就是我们前面说的普通类。仔细看一下是不是就相当于ContainerActivity
原本就实现成这样:
class ContainerActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
System.out.println(“Hello World!”);
}
}
只要PluginActivity
是动态加载的,就相当于ContainerActivity
的实现是动态的。但是如果原本PluginActivity
的代码是这样的呢?
class PluginActivity extends ShadowActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
savedInstanceState.clear();
super.onCreate(savedInstanceState);
}
}
显然这种代码在正常安装运行时和插件环境运行时就不一样了。因为变成了:
class ContainerActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
savedInstanceState.clear();
}
}
这说明我们要的不是插件Activity的super.onCreate()
调用不执行,我们是希望插件Activity的super.onCreate()
能够直接指挥壳子Activity什么时候调用super.onCreate()
。而且再想想,这是不是继承关系很像?假如PluginActivity是继承自ContainerActivity的,运行时系统调用的是PluginActivity的实例,那么PluginActivity的super.onCreate()
就会直接指导ContainerActivity什么时候调用super.onCreate()
了。所以我们在这里的真正需求是如何把原本的继承关系用持有关系实现了。所以Shadow是这样实现的:
class ShadowActivity {
ContainerActivity containerActivity;
public void onCreate(Bundle savedInstanceState) {
containerActivity.superOnCreate(savedInstanceState);
}
}
class PluginActivity extends ShadowActivity {
@Override
public void onCreate(Bundle savedInstanceState) {
savedInstanceState.clear();
super.onCreate(savedInstanceState);
}
}
class ContainerActivity extends Activity {
ShadowActivity pluginActivity;
@Override
protected void onCreate(Bundle savedInstanceState) {
pluginActivity.onCreate(savedInstanceState);
}
public void superOnCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}
结尾
好了,今天的分享就到这里,如果你对在面试中遇到的问题,或者刚毕业及工作几年迷茫不知道该如何准备面试并突破现状提升自己,对于自己的未来还不够了解不知道给如何规划,可以来看看同行们都是如何突破现状,怎么学习的,来吸收他们的面试以及工作经验完善自己的之后的面试计划及职业规划。
这里放上一部分我工作以来以及参与过的大大小小的面试收集总结出来的一套进阶学习的视频及面试专题资料包,主要还是希望大家在如今大环境不好的情况下面试能够顺利一点,希望可以帮助到大家~
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
5688023833)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!