这篇文章主要介绍了Jetpack Startup库怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Jetpack Startup库怎么使用文章都会有所收获,下面我们一起来看看吧。
nowinandroid项目作为目前google官方来演示MAD(现代Android开发技术)的示例项目,里面大量依赖运用了jetpack包下的各种库。
我们今天不讲原理,你只需知道这个库比之前用多个content provider去实现初始化更高效,更精确,更显性,也就是说能合并content provider提升app的启动速度,能准确的控制初始化顺序,能清晰的从代码知道依赖关系。仅仅这些可能jym会说,我们项目不在乎那点启动速度的提升,也没有很多三方库需要走初始化等,根本用不到这个库。
是的,我之前也是这么理解的,但是通过nowinandroid项目发现,有些jetpack内的其他库的初始化现在也交给Startup来完成了,这一点就很重要了。意味着我们可以少写很多样板代码,少写也意味着少犯错。
Startup
编写初始化的代码步骤很简单主要就分3步:
定义实现Initializer
接口的实现类
配置manifest
自动或手动调用初始化操作
OK了!就这简单3步,下面我们结合项目例子来看
先看第一步
object Sync { // This method is a workaround to manually initialize the sync process instead of relying on // automatic initialization with Androidx Startup. It is called from the app module's // Application.onCreate() and should be only done once. fun initialize(context: Context) { AppInitializer.getInstance(context) .initializeComponent(SyncInitializer::class.java) } } internal const val SyncWorkName = "SyncWorkName" /** * Registers work to sync the data layer periodically on app startup. */ class SyncInitializer : Initializer<Sync> { override fun create(context: Context): Sync { WorkManager.getInstance(context).apply { // Run sync on app startup and ensure only one sync worker runs at any time enqueueUniqueWork( SyncWorkName, ExistingWorkPolicy.KEEP, SyncWorker.startUpSyncWork(), ) } return Sync } override fun dependencies(): List<Class<out Initializer<*>>> = listOf(WorkManagerInitializer::class.java) }
定一个SyncInitializer
类实现了泛型为Sync
的Initializer
接口。需要重写接口定义的两个方法:
create()
方法, 它包含初始化组件所需的所有操作,并返回一个Sync
的实例.
dependencies()
方法, 返回当前初始化器需要依赖的其他初始化器集合,我们可以用这个方法来变相的实现各个初始化器的执行顺序。
所以在create
方法里面的执行WorkManager.getInstance(context)
方法是安全的。我们这篇只关注Startup所以我们只用知道在这个地方WorkManager做了些事情就行,后面会另开一篇单独讲WorkManager。为啥是安全的呢?因为在dependencies
方法里面先执行了WorkManagerInitializer::class.java
初始化。我们再来看看这个类。
public final class WorkManagerInitializer implements Initializer<WorkManager> { private static final String TAG = Logger.tagWithPrefix("WrkMgrInitializer"); @NonNull @Override public WorkManager create(@NonNull Context context) { // Initialize WorkManager with the default configuration. Logger.get().debug(TAG, "Initializing WorkManager with default configuration."); //这个地方已经完成了单例的构建,后面再调用WorkManager.getInstance(context)获取实例,否则报错 WorkManager.initialize(context, new Configuration.Builder().build()); return WorkManager.getInstance(context); } @NonNull @Override public List<Class<? extends androidx.startup.Initializer<?>>> dependencies() { //这里WorkManager的初始化不需要其他初始化构造器,所以返回的是个空集合 return Collections.emptyList(); } }
以上我们就把第一步走完了,现在再来看第二步
再看第二步
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <application> <provider android:name="androidx.startup.InitializationProvider" android:authorities="${applicationId}.androidx-startup" android:exported="false" tools:node="merge"> <!-- TODO: b/2173216 Disable auto sync startup till it works well with instrumented tests --> <meta-data android:name="com.google.samples.apps.nowinandroid.sync.initializers.SyncInitializer" android:value="androidx.startup" tools:node="remove" /> </provider> </application> </manifest>
这里需要注意的是tools:node="remove"
,在provider层级用的话是全局取消自动初始化,在meta-data层级用的话是单个组件取消自动初始化。例子展示的是单个组件取消自动初始化。另外注意的一点是被依赖的初始化组件是不需要再另外在manifest里面声明的,这就是为什么WorkManagerInitializer
没有声明。
最后一步
@HiltAndroidApp class NiaApplication : Application(), ImageLoaderFactory { override fun onCreate() { super.onCreate() // Initialize Sync; the system responsible for keeping data in the app up to date. Sync.initialize(context = this) } /** * Since we're displaying SVGs in the app, Coil needs an ImageLoader which supports this * format. During Coil's initialization it will call `applicationContext.newImageLoader()` to * obtain an ImageLoader. * * @see <a href="https://github.com/coil-kt/coil/blob/main/coil-singleton/src/main/java/coil/Coil.kt" rel="external nofollow" >Coil</a> */ override fun newImageLoader(): ImageLoader { return ImageLoader.Builder(this) .components { add(SvgDecoder.Factory()) } .build() } }
上面的代码是app的Application,我们今天的重点是Startup,所以我们先不管其他的。只用看onCreate
下的Sync.initialize(context = this)
方法。
object Sync { // This method is a workaround to manually initialize the sync process instead of relying on // automatic initialization with Androidx Startup. It is called from the app module's // Application.onCreate() and should be only done once. fun initialize(context: Context) { AppInitializer.getInstance(context) .initializeComponent(SyncInitializer::class.java) } }
AppInitializer.getInstance(context).initializeComponent(SyncInitializer::class.java)
传入SyncInitializer
类,实现手动初始化完成。
关于“Jetpack Startup库怎么使用”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“Jetpack Startup库怎么使用”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注亿速云行业资讯频道。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。