官方文档
https://developer.android.google.cn/jetpack/getting-started
https://developer.android.google.cn/jetpack/androidx/versions#version-table
https://developer.android.google.cn/jetpack/androidx/releases/startup
如何实现组件的自动初始化
我们可以为组件写一个ContentProvider,ContentProvider的onCreate函数会在application的attachBaseContext之后而onCreate之前执行。初始化一个ContentProvider需要2ms,如果初始化的组件过多,就会导致启动慢。
Startup组件让组件公用一个provider(androidx.startup)
这样就加快程序的启动。
1、引入库
implementation "androidx.startup:startup-runtime:1.0.0"
2、我们先定义两个组件
package com.yuanxuzhen.testlibrary;
import android.util.Log;
public class TestManager {
private static volatile TestManager instance;
public static TestManager getInstance(){
if(instance == null){
synchronized (TestManager.class){
if(instance == null){
instance = new TestManager();
}
}
}
return instance;
}
private TestManager() {
}
public void init(){
Log.e("JetPackDemo", "TestManager init");
}
}
package com.yuanxuzhen.testlibrary;
import android.util.Log;
public class TestManagerv1 {
private static volatile TestManagerv1 instance;
public static TestManagerv1 getInstance(){
if(instance == null){
synchronized (TestManagerv1.class){
if(instance == null){
instance = new TestManagerv1();
}
}
}
return instance;
}
private TestManagerv1() {
}
public void init(){
Log.e("JetPackDemo", "TestManagerv1 init");
}
}
3、我们实现Initializer
package com.yuanxuzhen.testlibrary;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.startup.Initializer;
import java.util.ArrayList;
import java.util.List;
public class TestManagerInitializer implements Initializer<TestManager> {
@NonNull
@Override
public TestManager create(@NonNull Context context) {
TestManager.getInstance().init();
return TestManager.getInstance();
}
@NonNull
@Override
public List<Class<? extends Initializer<?>>> dependencies() {
List<Class<? extends Initializer<?>>> list = new ArrayList<>();
return list;
}
}
package com.yuanxuzhen.testlibrary;
import android.content.Context;
import androidx.annotation.NonNull;
import androidx.startup.Initializer;
import java.util.Arrays;
import java.util.List;
public class TestManagerV1Initializer implements Initializer<TestManagerv1> {
@NonNull
@Override
public TestManagerv1 create(@NonNull Context context) {
TestManagerv1.getInstance().init();
return TestManagerv1.getInstance();
}
@NonNull
@Override
public List<Class<? extends Initializer<?>>> dependencies() {
return Arrays.asList(TestManagerInitializer.class);
}
}
dependencies 方法表示组件初始化以前需要先初始化那个组件
4、Manifest注册
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.yuanxuzhen.testlibrary"
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"
>
<meta-data android:name="com.yuanxuzhen.testlibrary.TestManagerV1Initializer"
android:value="androidx.startup" />
<meta-data android:name="com.yuanxuzhen.testlibrary.TestManagerInitializer"
android:value="androidx.startup" />
</provider>
</application>
</manifest>
5、application代码我们用来验证执行顺序
package com.yuanxuzhen.jetpackdemo;
import android.app.Application;
import android.content.Context;
import android.util.Log;
public class JetpackDemoApplication extends Application {
@Override
public void onCreate() {
Log.e("JetPackDemo", "onCreate");
super.onCreate();
}
@Override
protected void attachBaseContext(Context base) {
Log.e("JetPackDemo", "attachBaseContext");
super.attachBaseContext(base);
}
}
执行结果
2021-07-14 20:57:14.510 6629-6629/com.yuanxuzhen.jetpackdemo E/JetPackDemo: attachBaseContext
2021-07-14 20:57:14.521 6629-6629/com.yuanxuzhen.jetpackdemo E/JetPackDemo: TestManager init
2021-07-14 20:57:14.522 6629-6629/com.yuanxuzhen.jetpackdemo E/JetPackDemo: TestManagerv1 init
2021-07-14 20:57:14.535 6629-6629/com.yuanxuzhen.jetpackdemo E/JetPackDemo: onCreate
通过上面的执行我们看到组件已经初始化,也能够知道初始化就是在provider中执行的。
源码地址