欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Android中多個ContentProvider的初始化順序詳解

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

緣起:

利用 ContentProvider 來初始化你的 Library, 這個相信大家已經(jīng)不太陌生了,下面簡要說下。

1. 利用 ContentProvider 初始化 Library:

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

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

至此, 相信大家可以看到依賴第三方 library 的時候,你必須得寫一個自定義的 Application, 這樣的用戶體驗可不太好。從 Android Debug Database, Firebase 中受到啟發(fā), 我們可以在 library 中創(chuàng)建一個 ContentProvider 來, 然后在 Manifest 中完成必要的注冊信息, 在應用 Application 起來的時候會自動去初始化 library 中定義的 ContentProvider,現(xiàn)在就可以從 ContentProvider 中的 onCreate 里面得到 context 來初始化自己的 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;
    }
    ......
}
``` 
這里順便說一下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è)務需要用到多個自定義 ContentProvider,如 A、B、C, 但是自定義用來初始化的 provider 為D, 由于初始化流程在 provider D 中開始的, 那么 A、B、C 就必須在 D 之后起來才行,那么D ->A、B、C 順序怎么來定義呢?也就是如何保證 D 最先初始化。

為了定義 provider 的初始化順序,可以再 Manifest 中設置 initOrder 的值(值越大,最先初始化),同時如果 Library 中有多進程, 那么也需要設置 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 來調整自定義用來初始化的 ContentProvider, 要保證 D 在 A、B、C 之前來初始化。

總結

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

相關文章

最新評論