应用程序启动库提供了一种在应用程序启动时初始化组件的简单、高效的方法。库开发人员和应用程序开发人员都可以使用StartUp来简化启动序列并显式设置初始化顺序。
StartUp允许您定义共享单个内容提供程序的组件初始化程序,而不是为每个需要初始化的组件定义单独的content provider。这可以显著缩短应用程序启动时间。
简单的说就是通过一个公共的content provider来集中管理需要初始化的组件,从而提高应用的启动速度。
dependencies {
implementation "androidx.startup:startup-runtime:1.0.0"
}
每一个需要初始化的组件我们需要创建一个class去实现Initializer<T>接口
class AModuleInitializer : Initializer<AModule> {
override fun create(context: Context): ASdk {
Log.i("xjm","AModuleInitializer create()方法执行" )
return AModule.getInstance()
}
override fun dependencies(): MutableList<Class<out Initializer<*>>> {
Log.i("xjm","AModuleInitializer dependencies()方法执行" )
return mutableListOf()
}
}
只需实现两个方法:
两个方法执行顺序为dependencies() -> create ()
StartUp为我们提供了两种方式来启动,一种是自动启动,一种是手动调用启动。
我们只需要在AndroidManifest中对InitializationProvider添加对应声明:
声明ContentProvider类其基本原理就是依靠ContentProvider的onCreate会在应用初始化时被自动调用;
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="com.alanmyapplication. CModuleInitializer"
android:value="androidx.startup" />
<meta-data
android:name="com.alan.myapplication.DModuleInitializer"
android:value="androidx.startup"
tools:node="remove"/>
</provider>
C的dependencies() ->
B的dependencies() ->
A的dependencies() ->
A的create () ->
B的create () ->
C的create () ->
需要注意的是:
会使用Map mInitialized来确保每个类只会被初始化一次,而通过临时的initializing确保在依赖关系中不允许循环依赖
tools:node="remove"这个标签的作用是为了防止在其他引用的三方库中有对相同组件的一个初始化,保证该组件的自动初始化真正的被关闭。
<provider
android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
android:exported="false"
tools:node="merge">
<meta-data
android:name="com.alan.myapplication.DModuleInitializer"
android:value="androidx.startup"
tools:node="remove"/>
</provider>
关闭startup的所有组件的自动初始化,除了在<meta-data>标签上一个个添加之外,还可以统一关闭:
<provider android:name="androidx.startup.InitializationProvider"
android:authorities="${applicationId}.androidx-startup"
tools:node="remove"/>
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//手动启动初始化
AppInitializer.getInstance(this).initializeComponent(DModuleInitializer::class.java)
}
}
public final class AppInitializer {
private static AppInitializer sInstance;
/**
* Guards app initialization.
*/
private static final Object sLock = new Object();
@NonNull
final Map<Class<?>, Object> mInitialized;
@NonNull
final Context mContext;
/**
* Creates an instance of {@link AppInitializer}
*
* @param context The application context
*/
AppInitializer(@NonNull Context context) {
mContext = context.getApplicationContext();
mInitialized = new HashMap<>();
}
/**
* @param context The Application {@link Context}
* @return The instance of {@link AppInitializer} after initialization.
*/
@NonNull
@SuppressWarnings("UnusedReturnValue")
public static AppInitializer getInstance(@NonNull Context context) {
synchronized (sLock) {
if (sInstance == null) {
sInstance = new AppInitializer(context);
}
return sInstance;
}
}
...
}
Map<Class<?>, Object> 用map去存储已经被初始化过的组件。