Android Application 多继承

首先,附上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。哈哈哈~~~

  接下来进入正题,由我来介绍一种比较高大上的方法来避免这种尴尬局面。首先看一下Application中的所有用得到的方法:

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

  要实现最后一点,还需要再看几张图:
在这里插入图片描述
  首先Application是继承ContextWrapper的,而ContextWrapper继承Context。如下图,ContextWrapper其实就是一个包装类,他的所有实现都在 成员变量 mBase 中,mBase是一个ContextIml类。而今天实现多继承的突破口就在这个mBase上。
在这里插入图片描述
  假如现在我们不继承SDK的Application,仅仅普通的把他们 new 出来,然后通过反射将自己Application 中的mBase 赋值给 SDK Application中的mBase,并且在自己的Application生命周期中调用SDKApplication的生命周期方法,那么SDK 不就相当于间接继承了我们的Application了吗?

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

  • 第一步:新建 Application 并在清单文件配置,在 attachBaseContext ()中创建 SDKApplication 并通过反射调用 它的 attachBaseContext()方法。
  • 第二步:重写Application方法,并在生命周期方法中依次调用SDKApplication的生命周期方法
  • 第三步:接下来就有意思了,我们再看个图:
    在这里插入图片描述
    Application中有三个集合,我们注册 ActivityLifecycleCallbacks 等生命周期回调就是添加到这些集合中了,想要SDKApplication中的这些回调生效,我们在SDKApplication中注册ActivityLifecycleCallbacks就必须注册到真正Application中。这里有个小技巧,可以通过修改图中三个集合来打到H
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值