Android Jetpack架构组件(十)— StartUp

计算机软件开发 2024-9-9 00:47:04 40 0 来自 中国
一、StartUp简介

应用步调启动库提供了一种在应用步调启动时初始化组件的简朴、高效的方法。库开发职员和应用步调开发职员都可以使用StartUp来简化启动序列并显式设置初始化次序。
StartUp允许您界说共享单个内容提供步调的组件初始化步调,而不是为每个必要初始化的组件界说单独的content provider。这可以显着收缩应用步调启动时间。
简朴的说就是通过一个公共的content provider来会合管理必要初始化的组件,从而提高应用的启动速率。
二、StartUp使用

1、在build.gradle中添加所需依靠

dependencies {    implementation "androidx.startup:startup-runtime:1.0.0"}2、创建初始化入口

每一个必要初始化的组件我们必要创建一个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()    }}只需实现两个方法:

  • create ()方法
    包罗初始化组件所需的全部利用,并返回T的实例。
  • dependencies()方法
    返回的是一个Initializer<T>的list,这个聚集当中包罗了当前的Initializer<T>所依靠的其他的Initializer<T>,由此可见该方法的作用是让我们可以控制在步调启动时的组件的初始化次序。(即必要依靠的Initializer初始化后,才会创建自己)
两个方法实行次序为dependencies() -> create ()
3、启动StartUp

StartUp为我们提供了两种方式来启动,一种是主动启动,一种是手动调用启动。
1.主动启动

我们只必要在AndroidManifest中对InitializationProvider添加对应声明:

  • 声明其原理中真正使用的ContentProvider类androidx.startup.InitializationProvider
  • authorities要携带${applicationId}来避免与其他App产生辩论
  • 要在这个provider下声明meta-data;
    Startup会去找自己Provider下声明的第一个meta-data所对应的类,来对他举行初始化,假如他声明白他有依靠项,那么他的依靠项也会被初始化。次序探求meta-data对应的类并依次初始化。
声明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>meta-data标签:


  • name:是Initializer的路径
  • value:必须为androidx.startup才可以被网络到,后续的触发是按照在Manifest中声明的次序举行的。
依靠链声明


  • 若存在依靠关系C -> B -> A,则只必要声明C即可,由于A和B可以通过C的dependencies()方法链式调用举行初始化。A,B,C的实行次序为:
C的dependencies() -> B的dependencies() -> A的dependencies() -> A的create () -> B的create () -> C的create () ->

  • 若A,B,C之间不存在依靠关系的话,则必要对每一个对应的Initializer举行声明。而A,B,C的实行次序则与我们的声明次序保持同等。
必要留意的是:
会使用Map mInitialized来确保每个类只会被初始化一次,而通过临时的initializing确保在依靠关系中不允许循环依靠
2.手动调用启动

(1)、声明中关闭主动初始化

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"/>(2)、在代码中举行初始化

class MainActivity : AppCompatActivity() {    override fun onCreate(savedInstanceState: Bundle?) {        super.onCreate(savedInstanceState)        setContentView(R.layout.activity_main)        //手动启动初始化        AppInitializer.getInstance(this).initializeComponent(DModuleInitializer::class.java)    }}三、源代码

AppInitializer类

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去存储已经被初始化过的组件。
参考:Jetpack StartUp详解
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 18:24, Processed in 0.145801 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表