设为首页 加入收藏

TOP

Android项目模块化/组件化开发(非原创)(二)
2019-08-24 00:11:08 】 浏览:102
Tags:Android 项目 模块化 组件 开发 原创
法:生命周期创建、生命周期停止以及生命周期的优先级设置。

public abstract class BizLifeCycle { private Application app; // 优先级,priority 越大,优先级越高 @IntRange(from = 0) private int priority = 0; public BizLifeCycle(@NonNull Application application) { this.app = application; } public Application getApp() { return app; } /** * 获取优先级,priority 越大,优先级越高 */ public int getPriority() { return priority; } public void setPriority(int priority) { this.priority = priority; } public abstract void onCreate(); public abstract void onTerminate(); } 

在每个组件中只要实现上述模型即可。
有了生命周期模型,我们还需要一个管理器,用于管理这些组件的生命周期模型,在这个管理器中,我们同样需要实现三个基础方法:生命周期模型的注册,生命周期模型的反注册以及执行已存在的生命周期模型。

public class BizLifeCycleManager { private static ArrayList<BizLifeCycle> sPinLifeCycleList; /** * 注册组件的生命周期 */ public static <T extends BizLifeCycle> void register(@NonNull T lifeCycle) { if (sPinLifeCycleList == null) { sPinLifeCycleList = new ArrayList(); } if (!sPinLifeCycleList.contains(lifeCycle)) { sPinLifeCycleList.add(lifeCycle); } } /** * 执行组件生命周期 */ public static void execute() { if (sPinLifeCycleList != null && !sPinLifeCycleList.isEmpty()) { // 冒泡算法排序,按优先级从高到低重新排列组件生命周期 BizLifeCycle temp = null; for (int i = 0, len = sPinLifeCycleList.size() - 1; i < len; i++) { for (int j = 0; j < len - i; j++) { if (sPinLifeCycleList.get(j).getPriority() < sPinLifeCycleList.get(j + 1).getPriority()) { temp = sPinLifeCycleList.get(j); sPinLifeCycleList.set(j, temp); sPinLifeCycleList.set(j + 1, temp); } } } for (BizLifeCycle lifeCycle : sPinLifeCycleList) { lifeCycle.onCreate(); } } } /** * 解除组件生命周期 */ public static <T extends BizLifeCycle> void unregister(@NonNull T lifeCycle) { if (sPinLifeCycleList != null) { if (sPinLifeCycleList.contains(lifeCycle)) { lifeCycle.onTerminate(); sPinLifeCycleList.remove(lifeCycle); } } } /** * 清除所有的组件生命周期 */ public static void clear() { if (sPinLifeCycleList != null) { if (!sPinLifeCycleList.isEmpty()) { for (BizLifeCycle lifeCycle : sPinLifeCycleList) { lifeCycle.onTerminate(); } } sPinLifeCycleList.clear(); } } } 

调用示例如下,直接在壳工程的Application中使用,因为生命周期模型中都设置有优先级,所以在设置了优先级的情况下,可以不必在意register的顺序。如此一来,将生命周期注册后,需要更改每个组件件的一些初始化工作,可以直接在组件的生命周期中修改,而不需要变更壳工程的Application。

override fun onCreate() { super.onCreate() BizLifeCycleManager.register(CommonBizLifeCycle(this)) BizLifeCycleManager.register(HttpBizLifeCycle(this)) BizLifeCycleManager.register(RouterBizLifeCycle(this)) BizLifeCycleManager.register(ThirdBizLifeCycle(this)) BizLifeCycleManager.execute() } 

6. 模块在调试与发布模式之间的切换

项目开发时,一般提供调试环境与正式发布环境。在不同的环境中,app的有些功能是不需要用到的,或者是有所不同的。另外,在模块化开发时,有些业务模块在调试时,可以作为单独的app运行调试,不必每次都编译所有的模块,极大的加快编译速度,节省时间成本。基于,以上种种原因,我们就必须对项目的调试与正式环境做不同的部署配置,然而如果全靠每次手动修改,当模块量达到数十时,则会非常麻烦,且容易出错。所以我们需要尽可能的用代码做好配置。

首先,来看如何配置module在app与library之间的切换,实现module在调试时作为app单独运行调试。看示例代码,这也是比较常见的方式:

在gradle.properties中,配置字段isAuthModule,控制auth模块是作为一个模块还是一个app

# true: 作为一个模块 # false: 作为一个app isAuthModule=true 

在auth模块的build.gradle文件中作如下配置:

// 获取 gradle.properties 文件中的配置字段值 def isApp = !isAuthModule.toBoolean() // 判断是否为 app,选择加载不同的插件 if (isApp) { apply plugin: 'com.android.application' } else { apply plugin: 'com.android.library' } ...... android { defaultConfig { // library 是没有 applicationId 的,只有为 app 时,才有 if (isApp) { applicationId "com.homeprint.module.auth" } ...... } sourceSets { main { // 作为app与模块时的AndroidMani
首页 上一页 1 2 3 4 下一页 尾页 2/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇Android 解决打包为apk文件时已设.. 下一篇使用HTTP协议访问网络(Android)

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目