StartUp介绍以及优化
2021-10-16 本文已影响0人
愈强
An Startup helper for Android module develop.
Startup介绍
androidx.startup 是为Library提供的用于自动初始化的插件。
接入方法
implementation "androidx.startup:startup-runtime:1.1.0"
在Library中实现Initializer接口并添加初始化逻辑,并在Manifest中进行注册,即可完成自动初始化操作。
其中[Initializer full name]是Initializer实现类的全名,其他部分固定不变。
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge" >
<meta-data
android:name="[Initializer full name]"
android:value="androidx.startup" />
</provider>
实现原理
startup插件利用了ContentProvider的特性:ContentProvider的onCreate方法先于Application的onCreate方法执行。
他们的执行顺序是这样的:
MyApplication.attachBaseContext -> ContentProvider.onCreate -> Application.onCreate
同时,在ContentProvider中可以通过getContext方法获取到Context。
Startup内部代码会解析Manifest中的注册信息,获取到已注册的初始化接口列表并进行初始化。
XStartup介绍
github地址:https://github.com/CyanFlxy/XStartup
XStartup基于 startup 进行了二次开发,针对国内官方要求以及应用启动模型进行优化修改。
支持的新特性
- 初始化时添加debug开关状态。
- 支持推迟执行敏感操作。
- 支持推迟执行非重要操作。
- 支持IdleHandler和子线程两种延时执行方案。
使用方法
Library中
在Manifest中进行注册Initializer接口实现:
<provider
android:name="com.cyanflxy.xstartup.InitializationProvider"
android:authorities="${applicationId}.xstartup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="[InitializerImpl]"
android:value="xstartup"/>
</provider
宿主App中
XStartup中的初始化逻辑(Initializer接口)被拆分为了三个方法,其作用分别如下:
- init1-仅对Context、debug开关等进行简单初始化操作。
- init2-可以执行敏感操作,必须执行重要操作。
- init3-可以执行耗时操作,可以执行不重要操作。
但是在XStartup SDK中,只有init1是自动执行的,另外两个需要宿主App触发执行。可以参考如下规则:
- 在用户同意《用户协议》之后执行XStartup.init2方法。
- 在主界面的onWindowFocusChanged方法中执行XStartup.init3方法。
备注
工信部要求,一些敏感操作必须在征得用户同意之后执行。敏感行为包括但不限于以下内容:
- 读取imei、imsi、oaid等设备信息
- 读取应用安装列表
- 进行联网操作