MVPArms源码分析
多module下全局Application的冲突和聚合问题
全局配置信息GlobalConfigModule
GlobalConfigModule使用建造者模式将App的全局配置信息封装进Module(使用Dagger注入到需要配置信息的地方)。
可以配置CacheFile,Interceptor等,甚至于Retrofit,Okhttp,RxCache都可以自定义配置因为使用的是建造者模式所以如您有其他配置信息需要使用Dagger注入,直接就可以添加进Builder并且不会影响到其他地方
Application聚合ConfigModule
ConfigModule 将各个module的相关配置信息注册到最终的宿主app中,用来给框架配置各种自定义属性和功能,配合 GlobalConfigModule 使用非常强大
快速开始
- 在上层module中,实现ConfigModule接口;
- 在上层module的,AndroidManifest中声明它
- ----- 所有module的AndroidManifest在打包期间会合并起来
- ----- [ManifestParser.class]底层的BaseApplication会解析AndroidManifest拿到所有的ConfigModule实现类的路径,并通过反射获取其Class
- ----- [AppDelegate.class]实例化所有的实现类,并调用其函数
public class GlobalConfiguration implements ConfigModule {
@Override
public void applyOptions(Context context, GlobalConfigModule.Builder builder) {
//使用builder可以为框架配置一些全局配置信息
builder.baseurl(Api.APP_DOMAIN)
.cacheFile(New File("cache"));
}
@Override
public void injectAppLifecycle(Context context, List<AppLifecycles> lifecycles) {
//向Application的生命周期中注入一些自定义逻辑
}
@Override
public void injectActivityLifecycle(Context context, List<Application.ActivityLifecycleCallbacks> lifecycles) {
//向Activity的生命周期中注入一些自定义逻辑
}
@Override
public void injectFragmentLifecycle(Context context, List<FragmentManager.FragmentLifecycleCallbacks> lifecycles) {
//向Fragment的生命周期中注入一些自定义逻辑
}
}
<meta-data
android:name="me.jessyan.mvparms.demo.app.GlobalConfiguration"
android:value="ConfigModule"/>
ConfigModule接口定义
public interface ConfigModule {
/**
* 使用{@link GlobalConfigModule.Builder}给框架配置一些配置参数
*
* @param context
* @param builder
*/
void applyOptions(Context context, GlobalConfigModule.Builder builder);
/**
* 使用{@link AppLifecycles}在Application的生命周期中注入一些操作
*
* @param context
* @param lifecycles
*/
void injectAppLifecycle(Context context, List<AppLifecycles> lifecycles);
/**
* 使用{@link Application.ActivityLifecycleCallbacks}在Activity的生命周期中注入一些操作
*
* @param context
* @param lifecycles
*/
void injectActivityLifecycle(Context context, List<Application.ActivityLifecycleCallbacks> lifecycles);
/**
* 使用{@link FragmentManager.FragmentLifecycleCallbacks}在Fragment的生命周期中注入一些操作
*
* @param context
* @param lifecycles
*/
void injectFragmentLifecycle(Context context, List<FragmentManager.FragmentLifecycleCallbacks> lifecycles);
}
AppDelegate(代理 Application 生命周期)
全局Activity管理 AppManager
AppManager用于管理所有的Activity,内部持有:
- 一个含有所有存活的Activity(未调用onDestroy)的List
- 一个当前在最前端的Activity(未调用onPause)
AppManager封装有多种方法,可以很方便的对它们进行操作,也可以在未持有AppManager的情况下,通过EventBus远程遥控它的所有方法,这样我们可以在整个app的任何地方对任何Activity进行全局操作,比如在app请求网络超时时让最前端的Activity显示连接超时的交互页面(这个逻辑不用写到当前请求的Activity里,可以在一个单例类里做全局的统一操作,因为可以随时通过AppManager拿到当前的Activity)