## 单模块自动初始化能力介绍 - 支持单模块独立初始化 - 支持懒加载初始化 - 独立初始化允许多任务依赖(参考Gradle Task) - 支持编译期循环引用检测 - 支持自定义业务初始化时机 **常用场景**:模块化开发时,可能每个模块都有自己需要初始化的一些代码。以前的做法是把这些代码都在`Application`里声明,但是这样可能随着业务变动每次都需要修改`Application`所在模块。`TheRouter`的单模块自动初始化能力就是为了解决这样的情况,可以只在当前模块声明初始化方法后,将会在业务场景时自动被调用。 ## 使用介绍 无需担心循环依赖造成的问题,框架会在编译期构建`有向无环图`,监测循环依赖情况,如果发现会在编译期直接报错。 可以在当前模块中,任意类中声明一个任意方法名的方法,给方法添加上`@FlowTask` 的注解即可。 `@FlowTask` 注解参数说明: - **taskName**:当前初始化任务的任务名,必须全局唯一,建议格式为:`moduleName_taskName` - **dependsOn**:参考`Gradle` Task,任务与任务之间可能会有依赖关系。如果当前任务需要依赖其他任务先初始化,则在这里声明依赖的任务名。可以同时依赖多个任务,用英文逗号分隔,空格可选,会被过滤:dependsOn = "mmkv, config, login",默认为空,应用启动就被调用 - **async**:是否要在异步执行此任务,默认false。 ``` /** * 将会在异步执行 */ @FlowTask(taskName = "mmkv_init", dependsOn = TheRouterFlowTask.APP_ONCREATE, async = true) public static void test2(Context context) { System.out.println("异步=========Application onCreate后执行"); } @FlowTask(taskName = "app1") public static void test3(Context context) { System.out.println("main线程=========应用启动就会执行"); } /** * 将会在主线程初始化 */ @FlowTask(taskName = "test", dependsOn = "mmkv,app1") public static void test3(Context context) { System.out.println("main线程=========在app1和mmkv两个任务都执行以后才会被执行"); } ``` ## 内置初始化节点 框架默认支持了两个生命周期类任务,可在使用时直接引用 - **TheRouterFlowTask.APP_ONCREATE**:当`Application`的`onCreate()`执行后初始化 - **TheRouterFlowTask.APP_ONSPLASH**:当应用的首个`Activity.onCreate()`执行后初始化 ### 自定义业务节点初始化 支持定义业务节点,例如**隐私协议**通过以后才初始化某些方法: 事实上框架默认的两个生命周期任务也是通过这个能力完成的。 ``` // 假设隐私协议任务名为:AgreePrivacyCache /** * 同意隐私协议后初始化录音SDK */ @FlowTask(taskName="initRecord", dependsOn="AgreePrivacyCache") fun init(context:Context) = initRecordAudioSDK() // 当用户同意隐私协议时,调度依赖隐私协议的所有任务执行 TheRouter.runTask("AgreePrivacyCache") ``` ### 编译期配置 `@FlowTask`的`dependsOn`参数声明了一个不存在的任务,通常情况下是由于任务名书写错误,建议设置为`error`,尽早在编译期发现问题。 可在`local.properties`配置编译期属性(warning输出日志,error直接报错) - `CHECK_FLOW_UNKNOW_DEPEND=warning` warning/error可选 ## 初始化方法的限制 标注`FlowTask`的方法需要遵循如下限制: - 如果是 java,方法必须是 public static 修饰 - 如果是 kotlin,建议写成 top level 的函数 - 参数有且必须只有`Context`,入参为`Application`