Kotlin + Flow 实现Android 应用初始化任务启动库

特性

Kotlin + Flow 实现的 Android 应用初始化任务启动库。

  • 支持模块化,按模块加载任务
  • 可指定工作进程名称,main 表示仅在主进程运行,all 表示在所有进程运行,默认值all
  • 可指定任务仅在工作线程执行
  • 可指定任务仅在调试模式执行
  • 可指定任务在满足合规条件后执行
  • 可指定任务优先级,决定同模块内无依赖同步任务的执行顺序
  • 可指定依赖任务列表,能检测循环依赖
  • 使用 Flow 调度任务
  • 仅200多行代码,简单明了
  • 有耗时统计

引入依赖

项目地址:github.com/czy1121/ini…

repositories {
  maven { url "https://gitee.com/ezy/repo/raw/android_public/"}
}
dependencies {
  implementation "me.reezy.init:init:0.9.0"
  kapt "me.reezy.init:init-compiler:0.9.0" 

  // 使用 init-startup 代替 init 可以利用 Jetpack Startup 库自动初始化
  // 无需在 Application.onCreate 调用 InitManager.init()
  implementation "me.reezy.init:init-startup:0.9.0"
}

使用

在 AndroidManifest.xml 的 <application> 里添加模块

<meta-data android:name="modules" android:value="app" />

通过注解 @Init 和 InitTask 接口定义一个任务

@Init
class OneInit : InitTask {
  override fun execute(app: Application) {
    Log.e(TAG, "this is ${javaClass.simpleName} in ${Thread.currentThread().name}")
  }
}

通过注解 @Init 的参数配置任务信息

@Target(AnnotationTarget.CLASS)
@Retention(AnnotationRetention.SOURCE)
annotation class Init(
  val process: String = "all",    // 指定工作进程名称,main 表示仅在主进程运行,all 表示在所有进程运行
  val background: Boolean = false,  // 是否在工作线程执行任务
  val debugOnly: Boolean = false,   // 是否仅在 DEBUG 模式执行任务
  val compliance: Boolean = false,  // 是否需要合规执行
  val depends: Array<String> = [],  // 依赖的任务列表
  val priority: Short = 0       //
)

APT会按模块收集任务信息并生成任务加载器(InitLoader_$moduleName),任务加载器用于添加任务到TaskList

class Task(
  val name: String,          // APT收集的任务名称格式为 "$moduleName:${clazz.simpleName}"
  val background: Boolean = false,  // 是否在工作线程执行任务
  val priority: Int = 0,       // 进程运行的优先级,值小的先执行
  val depends: Set<String> = setOf(), // 依赖的任务列表,同模块只需指定"${clazz.simpleName}",跨模块需要指定 "$moduleName:${clazz.simpleName}"
  val block: () -> Unit = {},     // 待执行的任务
) {
  val children: MutableSet<Task> = mutableSetOf() // 子任务列表
}

核心类

  • TaskList 负责持有和添加任务
  • TaskManager 负责调度任务,支持添加开关任务(没有业务仅作为开关,可手动触发完成,并偿试执行其子任务)

无依赖的异步任务,在子线程并行执行
无依赖的同步任务,在主线程顺序执行
有依赖的任务,确保无循环依赖,且被依赖的任务先执行

  • InitManager 负责找到各模块的任务加载器并开始启动初始化,它使用了一个合规开关来使相关任务在确定合规后执行

可以不使用 InitManager 收集任务

val taskList = TaskList(app).apply {
  add("task1") {
  }
  add("task2", depends = setOf("t1")) {
  }
  add("task3", depends = setOf("task1")) {
  }
}

val manager = TaskManager(taskList, setOf("t1"))
manager.start()

// ...

// 完成开关任务t1
manager.trigger("t1")

以上就是Kotlin + Flow 实现Android 应用初始化任务启动库的详细内容,更多关于实现Android 应用初始化任务启动库的资料请关注我们其它相关文章!

(0)

相关推荐

  • Android Studio使用Kotlin时,修改代码后运行不生效的解决方法

    问题现象 前段时间升级 Android Studio 3.1.3+ 版本后,决定尝试使用 Kotlin 做 APP 开发看看.结果却发现,修改 String 资源后,"运行",修改的内容没有生效.一开始以为只是 String 资源是这样,于是试了下 kt 文件,结果发现"运行"也不能生效. 但是先 clean 了,再"运行",却可以正常编译出来.查了好久发现是 New Module 后,Run/Debug Configurations不完整所致.

  • Android使用Kotlin实现多节点进度条

    时间轴主要使用Recyclerview来实现.开发语言使用Kotlin,代码相对java少了许多也简洁许多 源代码下载地址 效果图: MainActivity.kt package com.example.lee.linenode import android.annotation.SuppressLint import android.os.Build import android.support.v7.app.AppCompatActivity import android.os.Bundl

  • Android kotlin使用注解实现防按钮连点功能的示例

    SingleClick: @Retention(AnnotationRetention.RUNTIME) @Target(AnnotationTarget.FUNCTION) annotation class SingleClick( // 点击间隔时间,毫秒 val value: Long = 500 ) SingleClickAspect: import android.os.SystemClock import org.aspectj.lang.ProceedingJoinPoint im

  • Android Studio Kotlin代码和java代码相互转化实例

    1.java转成kotlin 方法1:快捷键:Ctrl+Shift+Alt+K 方法2:Code - Convert Java File To Kotlin File 2.kotlin转成java 1.Tools>Kotlin>Show Kotlin Bytecode 2.点击 Decompile 补充知识:Android Studio Kotlin插件的简单使用 1.新建一个Project "Kotlin" ,然后在app的build.gradle文件中添加配置,如图所示

  • Android Studio kotlin生成编辑类注释代码

    更新了AS 3.1.2之后,发现新建Kotlin类,类注释依然木有,没办法只有自己动手了. 方法很简单,编辑File Header就可以啦. 只需要编辑自己想要的模板就可以啦. /** * @Author ${USER} * @Date ${DATE}-${TIME} * @Email chrisSpringSmell@gmail.com */ 支持的动态命令不多,只有一些简单的命令. 新建类效果: 补充知识:Android Studio javadoc 生成注释文档 相信大家刚开始写代码的时候

  • Android kotlin+协程+Room数据库的简单使用

    Room Room是Google为了简化旧版的SQLite操作专门提供的 1.拥有了SQLite的所有操作功能 2.使用简单(类似于Retrofit),通过注解的方式实现相关功能.编译时自动生成实现类impl 3.LiveData,LifeCycle,Paging天然融合支持 导入 ... plugins { id 'com.android.application' id 'kotlin-android' id 'kotlin-android-extensions' id 'kotlin-kap

  • Android studio 生成带Kotlin文档的实现方式

    首先才项目的build.gradle 加入classpath 'org.jetbrains.dokka:dokka-android-gradle-plugin:0.9.16' (0.9.16是当前版本) dependencies { classpath 'org.jetbrains.dokka:dokka-android-gradle-plugin:0.9.15' } 然后再module的build.gradle中加入apply plugin: 'org.jetbrains.dokka-andr

  • 使用Android studio查看Kotlin的字节码教程

    Kotlin是一门JVM语言,它被google大力推广,现如今已经是Android官方推荐的开发语言了.为了更好的学习Kotlin,你必须要从字节码的角度来看待语法特点,这样可以更好的加深自己的理解.这篇文章就是教大家如何通过Android studio来查看Kotlin编译后的字节码. 1.首先选中你要显示字节码的文件,之后点击顶部工具栏中的 Tools ->选中 Kotlin ->在弹出菜单中点击 Show Kotlin Bytecode. 2.点击之后在Android studio最右侧

  • Android studio kotlin代码格式化操作

    Android 转kotlin语言后,格式化代码,自动换行问题,可能让一大批强迫症难受死. 如果不想换行或者想自定义换行规则,自行配置即可. Android studio ->Preference->Code Style->kotlin ->Wrapping and Braces 如图,前括号后换行,去掉勾选就可立马看到效果. 也可以选择荧光色框选部分,直接不用此项设置,就可以去掉这个规则的所有选项. 补充知识:android studio如何测试kotlin代码 andorid

  • 在Android中如何使用DataBinding详解(Kotlin)

    前言 本问主要介绍DataBinding在Android App中的使用方法.数据绑定是将"提供器"的数据源与"消费者"绑定并使其同步的一种通用技术. 1. Android应用程序使用数据绑定 1.1 介绍DataBinding Android通过DataBinding提供了编写声明型布局的支持.这样可以最大程度简化布局和逻辑相关联的代码. 数据绑定要求修改文件,外层需要包裹一个layout布局.主要通过@{} 或 @={}语法把布局中的元素和表达式的引用写入到属性

  • Android中AndroidStudio&Kotlin安装到运行过程及常见问题汇总

    工具:Android Studio 语言:Kotlin 1.Android Studio的安装与配置 AndoridStudio官方网址:直接点击即可进入AS官网下载页面 1.1.android studio的下载与安装 下载好AS的文件后,直接打开androidstudio的exe文件,弹出安装欢迎对话框如下图所示 点击Next 勾选Android Virtual Devide(AVD)安卓虚拟设备,这样之后可以在电脑上生成一个虚拟的安卓机以方便我们运行编写好的程序.如果准备用真机进行测试的,

  • Android Studio / IDEA kotlin 显示 var 真实类型操作

    File -> Settings -> Editor -> Inlay Hints -> Kotlin 勾选 Show local variable type hints 启用前 启用后 补充知识:Android Studio 编译: Program type already present: XXX 解决方案 情况1:个例 build.gradle 中 dependencies { classpath 'com.android.tools.build:gradle:3.1.1'

  • Android结合kotlin使用coroutine的方法实例

    最近入了Android坑,目前还处于疯狂学习的状态,所以很久都没有写博客了.今天记录一个小代码片段,在Android上使用coroutine 的小例子. 由于我自己是做一个记账软件来学习的,我用了gRPC,最开始我是使用线程来做网络请求的: thread { // 网络请求代码 runOnUiThread { // 更新UI的代码 } } 今天把这一套全部重写成用coroutine. 首先coroutine得有个调度器,英文叫做 "Dispatchers",有这么几个: Dispatc

随机推荐