Android Application 多继承

Android Application 多继承AndroidAppli 多继承首先 附上 Demo 链接 https github com EshelGuo AppMultipleE tree master 众所周知 Java 里的继承都是单继承 而我们今天的话题是通过反射实现 Application 多继承 那么为什么非要 Application 多继承呢 想必大家在做项目的时候肯定集成很多 SDK 吧 也应该遇见过一部分 S


首先,附上Demo链接: https://github.com/EshelGuo/AppMultipleExtends

众所周知,Java里的继承都是单继承,而我们今天的话题是通过反射实现Application多继承。那么为什么非要Application多继承呢?想必大家在做项目的时候肯定集成很多SDK吧,也应该遇见过一部分SDK要求继承他们提供的Application吧,那假如我集成了两个SDK并且都要求集成他们提供的Application呢?

  我首先想到了Application串联继承,自定义Application继承SDK1的Application,然后让SDK1的Application继承SDK2的Application,但是一般三方SDK代码都是封装在jar包里的,想要修改SDK中Application的继承关系不太可能,该方法不可行。

  其实最简单的办法就是定义Application,查看SDK1 和SDK2中Application的代码,一般都是在onCreate中有一句或几句初始化SDK的代码,copy粘贴到自己的Application中就好了,但是该方法很容易将SDK初始化逻辑和自己APP初始化逻辑混在一起,加入项目比较大,Application代码比较多,维护起来不方便,并且假如SDK升级修改了初始化接口还要修改Application的代码。当然最重要的是这种方法复制粘贴太 low。哈哈哈~~~

一般我们用得到的只有 从onCreate()onTrimMemory()这些生命周期方法和 registerActivityLifecycleCallbacks() Activity生命周期的注册和取消(Api14 添加的方法)。也就是说,假如我们想要不继承 SDK1Application 就能让这个Application正常使用,首先需要让它的生命周期方法正常运行,其次SDK1Application中的 registerActivityLifecycleCallbacks 能正常使用,还有就是在SDK1Application中使用 this 或者 getApplicationContext() 去开启Activity Toast等必须有效。

  下面只说思路,想要看代码的话请到最上边github链接下载Demo。

  • 第一步:新建 Application 并在清单文件配置,在 attachBaseContext ()中创建 SDKApplication 并通过反射调用 它的 attachBaseContext()方法。
  • 第二步:重写Application方法,并在生命周期方法中依次调用SDKApplication的生命周期方法
  • 第三步:接下来就有意思了,我们再看个图:
    在这里插入图片描述
    Application中有三个集合,我们注册 ActivityLifecycleCallbacks 等生命周期回调就是添加到这些集合中了,想要SDKApplication中的这些回调生效,我们在SDKApplication中注册ActivityLifecycleCallbacks就必须注册到真正Application中。这里有个小技巧,可以通过修改图中三个集合来打到Hook这些回调的目的,首先三个集合都是ArrayList,我们定义 HookArrayList 继承ArrayList,重写add 和 remove方法,如下代码:




public class HookArrayList<E> extends ArrayList<E>{     private Application mApplication; public HookArrayList(Application application){     mApplication = application; } @Override public boolean add(E o) {     if(o instanceof Application.ActivityLifecycleCallbacks){     mApplication.registerActivityLifecycleCallbacks((Application.ActivityLifecycleCallbacks) o); }else if(o instanceof ComponentCallbacks){     mApplication.registerComponentCallbacks((ComponentCallbacks) o); }else if(o instanceof Application.OnProvideAssistDataListener){     if (Build.VERSION.SDK_INT >= 18/*Build.VERSION_CODES.JELLY_BEAN_MR2*/) {     mApplication.registerOnProvideAssistDataListener((Application.OnProvideAssistDataListener) o); } } return true; } public boolean remove(Object o) {     if(o instanceof Application.ActivityLifecycleCallbacks){     mApplication.unregisterActivityLifecycleCallbacks((Application.ActivityLifecycleCallbacks) o); }else if(o instanceof ComponentCallbacks){     mApplication.unregisterComponentCallbacks((ComponentCallbacks) o); }else if(o instanceof Application.OnProvideAssistDataListener){     if (Build.VERSION.SDK_INT >= 18/*Build.VERSION_CODES.JELLY_BEAN_MR2*/) {     mApplication.unregisterOnProvideAssistDataListener((Application.OnProvideAssistDataListener) o); } } return true; } } 

  下面介绍下Demo中多继承的用法,首先把Demo中com.eshel.deom.hookapp 的代码复制到项目中,然后继承 HookApplication,并重写 addApplication方法,代码如下:

public class MainApplication extends HookApplication { 
    public static Handler mHandler = new Handler(); @Override public void addApplications(AppConfig appConfig) { 
    appConfig.add(new SDK1Application()); appConfig.add(new SDK2Application()); } @Override public void onCreate() { 
    super.onCreate(); Toast.makeText(getApplicationContext(), "MainApp toast", Toast.LENGTH_SHORT).show(); } } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/227062.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午10:01
下一篇 2026年3月16日 下午10:02


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号