子module与App主module共享Context的实践

随着业务越来越复杂,即便是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')
}

目前在公司项目的线上环境跑了一段时间,暂时没有发现问题,如果此方法有缺陷或者有更好的实践,欢迎大家指点。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值