专栏首页大话swiftAndroid组件前奏---App+module的启动

Android组件前奏---App+module的启动

一个App里面默认都有一个单例那就是Application,而组件化的过程中除了app这个壳工程的启动是我们时长需要设置一些默认的参数配置等操作,其实对于附加启动的module也是需要一些附加的启动或者对自身所在module做处理。那么我们怎么来实现module的Application随App一起启动做初始化操作呢?

我们分析一下通常会遇到的情况

我们组件化中会有多个独立Module,那么需要随App进行同时进行配置的可能会有多个,那么在我们是不需要一个统一的模版规范让读个module走循序呢?

根据上面我们可以做如下拆分 1 做一个抽象的基类继承于Application,内部做成模版流程,App以及Module的Application均继承于此

public abstract class BaseApp extends Application {    /**     * Application 初始化     */    public abstract void initModuleApp(Application application);
    /**     * 所有 Application 初始化后的自定义操作     */    public abstract void initModuleData(Application application);    public void afterModuleAndBeforeData(Application application) {
    }
    @Override    public void onCreate() {        super.onCreate();        this.initModuleApp(this);        this.afterModuleAndBeforeData(this);        this.initModuleData(this);    }}
//登陆modulepublic class LoginApp extends BaseApp {    @Override    public void initModuleApp(Application application) {
    }
    @Override    public void initModuleData(Application application) {
    }
    @Override    public void afterModuleAndBeforeData(Application application) {        super.afterModuleAndBeforeData(application);        ServiceFactory.getInstance().setAccountService(new AccountService());    }}

2 壳工程中的Application

对于壳工程此时需要的就是实现整个App启动前的初始化以及对应加载Module启动

2.1 自身配置的启动

public class MainApp extends BaseApp {    @Override    public void onCreate() {        // 初始化 ARouter        if (BuildConfig.DEBUG) {           // 这两行必须写在init之前,否则这些配置在init过程中将无效            ARouter.openLog();     // 打印日志            ARouter.openDebug();   // 开启调试模式(如果在InstantRun模式下运行,必须开启调试模式!线上版本需要关闭,否则有安全风险)        }        ARouter.init(this);        super.onCreate();    }
    @Override    public void initModuleApp(Application application) {           }
    @Override    public void initModuleData(Application application) {
    }
    @Override    public void afterModuleAndBeforeData(Application application) {        super.afterModuleAndBeforeData(application);
    }}

2.2 需要初始化配置的Module动态加载

对于需要启动的module我们可以通过在壳工程中声明Module中Application的包名采用反射的方式来实现同时将壳工程的Application传递值Moudle

 // for (String moduleApp : Components.moduleApps) {            try {                Class clazz = Class.forName(moduleApp);                BaseApp baseApp = (BaseApp) clazz.newInstance();                baseApp.initModuleApp(this);            } catch (ClassNotFoundException e) {                e.printStackTrace();            } catch (IllegalAccessException e) {                e.printStackTrace();            } catch (InstantiationException e) {                e.printStackTrace();            }        }

至此我们完成了App的启动,一个按照模版的方式完成多个Module的动态初始化加载

本文分享自微信公众号 - 大话swift(gh_ca2266b7cab0),作者:YuLongLi

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-03-07

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • gin框架之参数获取

    http://127.0.0.1:8080/get/query?b=2&e=1&e=2&f[a]=1&f[b]=2

    大话swift
  • 怎么将golang部署到docker

    我们都知道go能够这么火是因为他是docker官方标准语言,当然了docker也将go的性能发挥到了极致,可谓是相辅相成,交相辉映。而最近学洗go的过程中很多项...

    大话swift
  • WKWebview 与App交互辅助工具类

    之前lz公众号写个关于UIWebView的JS与App通信的文章,但是最新iOS审核规定需要替换掉UIWebView使用WKWebView才可以过审。但是之前有...

    大话swift
  • Netty入门篇

    2、Netty简介: netty是一个异步的,基于事件驱动的网络应用框架。可以快速地开发高性能的服务器端和客户端,像dubbo和elasticsearch底层...

    贪挽懒月
  • 结构型设计模式:装饰器(者)模式实例介绍

    我觉得装饰者模式是在已有功能的基础之上,动态地添加更多 功能的一种方式,这些新加的代码装饰了原有类的 核心职责或主要行为。

    程序你好
  • Go语言基础:深入理解 struct 内嵌 inteface

    对于 struct 内嵌 inteface 的使用,我是研究好半天才搞懂,这里记录下我疑问: 1. 如何更好的理解匿名接口 // 匿名接口可以被用作变量或者...

    李海彬
  • 不报错地调用空指针类的成员函数

      前两个应该都会段错误才对的呀,怎么都运行正常了。其实上述的行为都由this指针左右结果。

    Qt君
  • Silverlight与WPF中BeginInvoke的差异

    Silverlight/WPF中,如果要在多线程中对界面控件值做修改,用Dispatcher对象的BeginInvoke方法无疑是最方便的办法 ,见:温故而知新...

    菩提树下的杨过
  • PWM实现ADC采集电量原理

    对于没有ADC的主控芯片来说,如果要实现ADC的功能,可以用两个GPIO和一个运算放大器解决该问题。对于某些国产芯片来说,其内部没有ADC,所以在有些方案上采用...

    bigmagic
  • 成为优秀Java程序员的10大技巧

    Java程序员有许多应遵循的守则或最佳实践方式。本文概述了每个开发者最应该遵循的10条守则或戒律,如果不遵循它们,将会导致灾难性后果。

    Java后端工程师

扫码关注云+社区

领取腾讯云代金券