前言
组件化开发过程中,各个模块内往往需要感知Application的生命周期,以获取context完成初始化工作等,业务上模块间或存在初始化顺序要求,比较常规的做法有:
有需要大厂面经和面试技巧思维导图的朋友可以点进去了解一下,点击——【传送门】——即可!
在common模块定义 AppLifecycleCallback
interface AppLifecycleCallback { fun getPriority(): Int = 0 fun onCreate(context: Context) } 复制代码
各个模块实现 AppLifecycleCallback ,如Home模块
class HomeAppLifecycle : AppLifecycleCallback { override fun getPriority(): Int = 0 override fun onCreate(context: Context) { //todo } } 复制代码
然后在 MainApplication 中实现生命周期分发
class MainApplication : Application() { private val callbacks = mutableListOf<AppLifecycleCallback>() override fun onCreate() { super.onCreate() callbacks.add(HomeAppLifecycle()) callbacks.add(UserAppLifecycle()) // add whatever you want // 排序实现模块顺序分发 callbacks.sortBy { it.getPriority() } callbacks.forEach { it.onCreate(this) } } } 复制代码
这样能实现需求,但每增加一个模块,就得回到MainApplication中添加一个,不够优雅不够装,这时候就可以用上 APT + Transform
实现原理
- 各模块创建AppLifecycleCallback实现类,添加注解,apt为其生成代理类,以"_Proxy"结尾
- 构造 AppLifecycleManager 对外API,统一管理Proxyc allbacks
- gradle transform遍历.class文件,找到"_Proxy"的所有类,保存类路径,使用 asm 将代理类“加入”到AppLifecycleManager中
此方案主要是为了解学习apt,gradle transform,实际上有更好的实现方案。各位大佬畅所欲言,提出此方案的短板
实现过程
一、 AppLifecycle API
创建android-library,定义 AppLifecycleCallback 、 AppLifecycleManager