随着业务越来越复杂,即便是Android项目也会解耦出很多子模块,把一些变动不大的,或者与业务逻辑几乎0耦合的代码抽离出来,单独创建module(下面我们称之为common module),以library的形式引入app module(即主模块),这也是组件化的必经之路。
但过程中遇到个小问题,我要在common里面使用上下文(Context)怎么办呢?由于library类型的module本身是不能创建Activity的,更不能继承实现Application,所以我们只好把主module的全局上下文在整个应用初始化时传过来。
具体步骤:
1、在common模块中新建一个普通类(姑且命名为CommonModule),当做与主module通信的接口,在此类中保存全局上下文的变量,供整个common module的其它代码使用:
public class CommonModule {
private static Context sAppContext;
/**
* 子模块和主模块需要共享全局上下文,故需要在app module初始化时传入
*/
public static void init(Context appContext) {
if(sAppContext == null) {
sAppContext = appContext.getApplicationContext();
}
}
public static Context getAppContext() {
return sAppContext;
}
}
我这里简化了一下,大家也可以把get方法写成单例。
2、然后我们在主module中的Application类里去进行初始化传递:
public class HostApp extends Application {
@Override
public void onCreate() {
super.onCreate();
CommonModule.init(this);
}
这样我们就可以在common模块中任意地获取到整个应用的全局上下文了。
3、哦,还别忘了在gradle配置里引入common模块:
dependencies {
...
implementation project(':common')
}
目前在公司项目的线上环境跑了一段时间,暂时没有发现问题,如果此方法有缺陷或者有更好的实践,欢迎大家指点。