luckybilly / CC

业界首个支持渐进式组件化改造的Android组件化开源框架,支持跨进程调用。Componentize your android project gradually.
https://luckybilly.github.io/CC-website/
Apache License 2.0
4.04k stars 636 forks source link

子模块如何在application子类的onCreate里进行初始化? #94

Closed docwei2050 closed 5 years ago

docwei2050 commented 5 years ago

在以app运行的时,子模块module需要在Application子类的oncreate里初始化(比如子module有文件复制到db的操作,此操作需要提前做),但是现在没法在Application子类里面引用到这个子模块,没法初始化。

luckybilly commented 5 years ago

类似于“子module需要有文件复制到db的操作”这种组件初始化的问题可以参考如下几种思路来解决,按实际需求来选用:

  1. 将这种组件的初始化逻辑封装成一个action: 1.1 在主app module的Application.onCreate中调用该组件初始化action 1.2 在组件的debug目录中创建DebugApplication,也在DebugApplication.onCreate中调用该组件初始化action
  2. 用自动注册的思路来解决: 2.1 在baseLib module中创建一个接口,如:IComponentInit{ void onInit(Application app);} 2.2 在有初始化需求的组件中创建这个接口的实现类,在onInit方法中完成初始化 2.3 通过配置自动注册,将所有接口实现类的对象都注册到Application中 2.4 在Application.onCreate中调用所有该接口实现类对象的onInit方法完成初始化 2.5 可以将Application中的初始化代码封装到BaseLib中去,主app module里的Application和组件里的DebugApplication都继承这个基类 2.6 这样,不管是组件单独运行还是集成打包运行,都会在application.onCreate中自动完成组件的初始化工作
  3. 在组件类的无参构造方法中调用组件初始化的逻辑 3.1 CC会自动调用组件类(IComponent接口的实现类)的无参构造方法来创建组件实例 3.2 组件实例在CC框架下可以看做是单例的(除非开发者另行创建了额外的组件实例) 3.3 CC框架在第一次进行CC调用时(ComponentManager类被虚拟机加载时)或者通过CC.init(app, true, true)初始化时,会创建所有组件实例 3.4 由此可以认为:初始化时CC时,会调用组件的无参构造方法,也就执行了初始化的逻辑
  4. 在组件第一次被调用时执行初始化逻辑:在onCall方法中调用初始化逻辑 4.1 如果组件的初始化逻辑没必要太早执行,可以选择这种方式 4.2 可以参考Demo_B里的IActionProcessor的初始化逻辑
l123456789jy commented 5 years ago

@luckybilly 可否参考AppJoint通过注解标记反射调用组件的Application反射方案这样就可以共用一个Application初始化逻辑不用在主APP和组件都要分别调用初始化了。