Android中多個(gè)ContentProvider的初始化順序詳解
緣起:
利用 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)文章
Android 桌面圖標(biāo)右上角顯示未讀消息數(shù)字
本文主要介紹了Android 桌面圖標(biāo)右上角顯示未讀消息數(shù)字的方法。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-04-04Android中ListView結(jié)合CheckBox實(shí)現(xiàn)數(shù)據(jù)批量選擇(全選、反選、全不選)
這篇文章主要介紹了Android編程中ListView結(jié)合CheckBox實(shí)現(xiàn)批量選擇,包括實(shí)現(xiàn)全選、反選、全不選等操作,感興趣的小伙伴們可以參考一下2016-01-01Android BadgeView紅點(diǎn)更新信息提示示例代碼
本篇文章主要介紹了Android BadgeView紅點(diǎn)更新信息提示示例代碼,具有一定的參考價(jià)值,有興趣的可以了解一下。2017-01-01android中view手勢(shì)滑動(dòng)沖突的解決方法
本篇文章主要介紹了android中view手勢(shì)滑動(dòng)沖突的解決方法,主要解決方法有兩種,外部和內(nèi)部攔截。有需要的可以參考下。2016-11-11Android、iOS和Windows Phone中的推送技術(shù)詳解
這篇文章主要介紹了Android、iOS和Windows Phone中的推送技術(shù)詳解,推送技術(shù)的實(shí)現(xiàn)通常會(huì)使用服務(wù)端向客戶(hù)端推送消息的方式,也就是說(shuō)客戶(hù)端通過(guò)用戶(hù)名、Key等ID注冊(cè)到服務(wù)端后,在服務(wù)端就可以將消息向所有活動(dòng)的客戶(hù)端發(fā)送,需要的朋友可以參考下2015-01-01Android中TabLayout添加小紅點(diǎn)的示例代碼
本篇文章主要介紹了Android中TabLayout添加小紅點(diǎn)的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12