Android中多個ContentProvider的初始化順序詳解
緣起:
利用 ContentProvider 來初始化你的 Library, 這個相信大家已經(jīng)不太陌生了,下面簡要說下。
1. 利用 ContentProvider 初始化 Library:
在日常開發(fā)過程中, 經(jīng)常會遇到 Library 都需要傳入 Context 參數(shù)以完成初始化,此時這個 Context 參數(shù)一般會從 Application 對象的 onCreate 方法中獲取。于是,很多 library 都會提供一個 init 方法,在Application Object中完成調(diào)用.
public class MyApplication extends Application {
@Override
public void onCreate() {
super.onCreate();
Library.init(this);
}
}
至此, 相信大家可以看到依賴第三方 library 的時候,你必須得寫一個自定義的 Application, 這樣的用戶體驗(yàn)可不太好。從 Android Debug Database, Firebase 中受到啟發(fā), 我們可以在 library 中創(chuàng)建一個 ContentProvider 來, 然后在 Manifest 中完成必要的注冊信息, 在應(yīng)用 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è)務(wù)需要用到多個自定義 ContentProvider,如 A、B、C, 但是自定義用來初始化的 provider 為D, 由于初始化流程在 provider D 中開始的, 那么 A、B、C 就必須在 D 之后起來才行,那么D ->A、B、C 順序怎么來定義呢?也就是如何保證 D 最先初始化。
為了定義 provider 的初始化順序,可以再 Manifest 中設(shè)置 initOrder 的值(值越大,最先初始化),同時如果 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 來調(diào)整自定義用來初始化的 ContentProvider, 要保證 D 在 A、B、C 之前來初始化。
總結(jié)
到此這篇關(guān)于Android中多個ContentProvider的初始化順序的文章就介紹到這了,更多相關(guān)Android ContentProvider初始化順序內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android仿支付寶笑臉?biāo)⑿录虞d動畫的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android仿支付寶笑臉?biāo)⑿录虞d動畫的實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2016-11-11
Android編程之DatePicker和TimePicke簡單時間監(jiān)聽用法分析
這篇文章主要介紹了Android編程之DatePicker和TimePicke簡單時間監(jiān)聽用法,結(jié)合具體實(shí)例形式分析了時間控件DatePicker和TimePicke布局與具體功能實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-02-02
android的ListView點(diǎn)擊item使item展開的做法的實(shí)現(xiàn)代碼
這篇文章主要介紹了android的ListView點(diǎn)擊item使item展開的做法的實(shí)現(xiàn)代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-12-12
Android中SQLite數(shù)據(jù)庫知識點(diǎn)總結(jié)
在本篇文章里小編給大家分享了關(guān)于Android中SQLite數(shù)據(jù)庫知識點(diǎn)總結(jié),有需要的朋友們跟著學(xué)習(xí)下。2019-02-02
Android編程單選項(xiàng)框RadioGroup綜合應(yīng)用示例
這篇文章主要介紹了Android編程單選項(xiàng)框RadioGroup用法,結(jié)合實(shí)例形式分析了Android單選按鈕組RadioGroup的定義與具體使用技巧,需要的朋友可以參考下2016-10-10
java,Android:在eclipse中的快捷鍵(經(jīng)典收藏)
下面的快捷鍵是常用的,本人就本身喜好且常用的收拾一下,現(xiàn)在曬出來與大家分享,感興趣的朋友可以了解小哦2013-01-01

