App Startup正规军:Jetpack之App Startup
2023-12-06 19:02:07
1. 前言
相信不少做Android开发的朋友或多或少接触过一些SDK,也了解到,为了让调用方调用起来更爽,很多SDK在定义方法的时候,都会尽量少让调用方传入Context参数。原因很简单,首先,这使得方法看起来很笨重;其次,传给你的Context如果使用不当,很可能造成内存泄漏。基于这两点考虑,相信各位在调用SDK的时候,一定对那些只传入Activity或Fragment的便捷API赞不绝口。
然而,问题随之而来。当你接入这些SDK时,初始化工作一般需要在Application中完成,但是这个时候Application还没有创建,SDK又不能依赖Application。为了解决这个问题,SDK作者一般会有两种思路:
- 反射调用 :应用启动后,SDK会在Application的onCreate方法中通过反射,将Context对象更新到自身已有的对象中;
- 自定义启动方案 :让SDK自己创建自己的Application对象,然后在AndroidManifest.xml中通过
<application>
的 android:name 属性替换掉系统的Application,SDK再利用自定义Application的onCreate回调方法进行初始化。
这两种方案从原理上来说,其实并没有什么本质的区别,都是为了在Application对象创建之前完成初始化。方案1似乎更优雅,因为它不需要我们做任何改动,但是因为需要利用反射,性能难免会有一些影响。
那么就到方案2吗?仔细想想其实也没有那么简单。既然你的SDK已经定义了自己的Application,那么在同一个应用中可能就无法再使用其它的SDK,导致模块间无法组合使用,应用的整体架构也会显得比较混乱。
2. App Startup 正式登场
显然,上述两种方案都不是特别完美的解决方案。因此,Jetpack团队在App Startup 1.0版本中引入了全新的App Startup机制来解决这个问题。简单来说,App Startup为每个需要初始化的任务定义了一个App Startup对象,所有的App Startup对象在Application创建后立即执行初始化。也就是说,使用App Startup,你就可以在不修改Application的情况下,在应用启动时异步初始化任意的任务,而无需担心影响应用的冷启动性能。
App Startup的API使用起来也非常简单,只需要简单的四步即可:
- 在清单文件中注册App Startup任务
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.startup"
android:exported="false" >
<meta-data
android:name="androidx.startup"
android:value="com.example.MyInitializer" />
</provider>
- 实现Initializer接口
public class MyInitializer implements Initializer<Void> {
// 同步或者异步初始化工作
// 返回值表示Initializer执行完毕后是否将任务从列表中移除
// true 表示移除,false 表示保留
@Override
public Result<Void> initialize() {
// 同步初始化工作
// ...
// 异步初始化工作
CompletableFuture<Void> future = new CompletableFuture<>();
AsyncTask.THREAD_POOL_EXECUTOR.execute(() -> {
// ...
future.complete(null);
});
return Result.futuresResult(future);
}
}
- 将App Startup模块引入到项目中
implementation "androidx.startup:startup-runtime:1.1.0"
- 在AndroidManifest.xml中对App Startup进行配置
<application
...
android:name="androidx.startup.AppInitializer">
...
</application>
需要注意的是,在App Startup 1.1版本中,为了保持App Startup与AndroidX Test Compatibility模块之间的兼容性,App Startup不再作为Library来使用,而是通过在AndroidManifest.xml中指定Application类,将App Startup的逻辑注入到应用中。
3. 优势和限制
优势 :
- 无需修改Application :App Startup不需要对Application做任何改动,就可以完成初始化工作;
- 并发初始化 :App Startup支持并发初始化,可以显著提升应用的启动速度;
- 无感知的清理工作 :App Startup会自动管理初始化任务的生命周期,无需我们手动清理。
限制 :
- 兼容性问题 :App Startup要求API Level >= 28,因此不支持较早版本的Android系统;
- 初始化顺序无法控制 :App Startup中的初始化任务会并发执行,因此无法保证任务之间的执行顺序;
- 自定义Application无法使用 :由于App Startup会自动替换Application,因此在使用App Startup时无法使用自定义的Application。
4. 结语
总体来说,App Startup为我们提供了一种非常方便且高效的方案来处理应用的初始化工作。它不仅可以减轻开发者的工作量,还可以提升应用的启动速度。如果你正在开发一个需要在启动时完成大量初始化工作的应用,那么强烈推荐你使用App Startup。
到此为止,关于Jetpack App Startup的简单介绍就结束了,更多详细内容大家可以自行查阅官方文档。希望这篇文章对大家有所帮助。如果有什么疑问或建议,欢迎在评论区留言讨论。