亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android中多個(gè)ContentProvider的初始化順序詳解

 更新時(shí)間:2022年04月28日 16:05:46   作者:Sivan  
在日常Android開(kāi)發(fā)中經(jīng)常會(huì)寫(xiě)一些sdk來(lái)供他人或者自己調(diào)用,一般這些sdk都涉及到初始化,下面這篇文章主要給大家介紹了關(guān)于Android中多個(gè)ContentProvider的初始化順序的相關(guān)資料,需要的朋友可以參考下

緣起:

利用 ContentProvider 來(lái)初始化你的 Library, 這個(gè)相信大家已經(jīng)不太陌生了,下面簡(jiǎn)要說(shuō)下。

1. 利用 ContentProvider 初始化 Library:

在日常開(kāi)發(fā)過(guò)程中, 經(jīng)常會(huì)遇到 Library 都需要傳入 Context 參數(shù)以完成初始化,此時(shí)這個(gè) Context 參數(shù)一般會(huì)從 Application 對(duì)象的 onCreate 方法中獲取。于是,很多 library 都會(huì)提供一個(gè) init 方法,在Application Object中完成調(diào)用.

public class MyApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        Library.init(this);
    }
}

至此, 相信大家可以看到依賴(lài)第三方 library 的時(shí)候,你必須得寫(xiě)一個(gè)自定義的 Application, 這樣的用戶(hù)體驗(yàn)可不太好。從 Android Debug Database, Firebase 中受到啟發(fā), 我們可以在 library 中創(chuàng)建一個(gè) ContentProvider 來(lái), 然后在 Manifest 中完成必要的注冊(cè)信息, 在應(yīng)用 Application 起來(lái)的時(shí)候會(huì)自動(dòng)去初始化 library 中定義的 ContentProvider,現(xiàn)在就可以從 ContentProvider 中的 onCreate 里面得到 context 來(lái)初始化自己的 library。

public class FirstProvider extends ContentProvider {
    @Override
    public void attachInfo(Context context, ProviderInfo info) {
        super.attachInfo(context, info);
    }
    @Override
    public boolean onCreate() {
        context = getContext();
        // 這里可以初始化你需要的代碼
        return true;
    }
    ......
}
``` 
這里順便說(shuō)一下Application, ContentProvider 初始化的順序:
```java
Application.attachBaseContext(super before) -> Application.attachBaseContext(super after) -> ContentProvider.attachInfo(super before) -> ContentProvider.onCreate() -> ContentProvider.attachInfo(super after) -> Application.onCreate(super before) -> Application.onCreate(super after)

2. 自定義 ContentProvider 初始化順序:

如果 library 中有業(yè)務(wù)需要用到多個(gè)自定義 ContentProvider,如 A、B、C, 但是自定義用來(lái)初始化的 provider 為D, 由于初始化流程在 provider D 中開(kāi)始的, 那么 A、B、C 就必須在 D 之后起來(lái)才行,那么D ->A、B、C 順序怎么來(lái)定義呢?也就是如何保證 D 最先初始化。

為了定義 provider 的初始化順序,可以再 Manifest 中設(shè)置 initOrder 的值(值越大,最先初始化),同時(shí)如果 Library 中有多進(jìn)程, 那么也需要設(shè)置 android:multiprocess,具體如下:

<provider
android:authorities="com.sivan.DContentProvider"
            android:exported="false"
            android:multiprocess="true"
            android:initOrder="100"
            android:name=".DContentProvider" />

如此在 Demo 中定義了 FirstProvider,SecondProvider 以及 ThirdProvider 的 initOrder 的值:

<provider
        android:authorities="com.sivan.FirstProvider"
        android:exported="false"
        android:initOrder="100"
        android:name=".FirstProvider" />
<provider
        android:authorities="com.sivan.SecondProvider"
        android:exported="false"
        android:initOrder="50"
        android:name=".SecondProvider" />
<provider
        android:authorities="com.sivan.ThirdProvider"
        android:exported="false"
        android:name=".ThirdProvider" />

最后得到的日志信息如下:

MyApplication: attachBaseContext 0 pid = 3725
MyApplication: attachBaseContext 1 pid = 3725
FirstProvider: attachInfo 0 com.sivan.FirstProvider
FirstProvider: onCreate pid =3725
FirstProvider: attachInfo 1 com.sivan.FirstProvider
SecondProvider: attachInfo 0 info = com.sivan.SecondProvider
SecondProvider: onCreate  pid = 3725
SecondProvider: attachInfo 1 info = com.sivan.SecondProvider
ThirdProvider: attachInfo 0 info = com.sivan.ThirdProvider
ThirdProvider: onCreate  pid = 3725
ThirdProvider: attachInfo 1 info = com.sivan.ThirdProvider
MyApplication: onCreate 0 pid = 3725
MyApplication: onCreate 1 pid = 3725

可以看出初始化流程:FirstProvider -> SecondProvider -> ThirdProvider

所以我們需要根據(jù) android:initOrder 來(lái)調(diào)整自定義用來(lái)初始化的 ContentProvider, 要保證 D 在 A、B、C 之前來(lái)初始化。

總結(jié)

到此這篇關(guān)于Android中多個(gè)ContentProvider的初始化順序的文章就介紹到這了,更多相關(guān)Android ContentProvider初始化順序內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論