使用ContentProvider初始化你的Library

參考:
A

B
我們做項(xiàng)目的時(shí)候會(huì)用到很多庫(kù),不論是三方庫(kù)還是或者是自己寫(xiě)的,不可避免的會(huì)要去初始化它們,一般都是在Application的oncreate里,那么我們現(xiàn)在會(huì)在Application里這么寫(xiě):

@Override
public void onCreate() {
    super.onCreate();
    MyLib.init(this);
}

通過(guò)init方法傳遞一個(gè)Application進(jìn)去并持有它。

這樣做沒(méi)什么錯(cuò),但是在我看來(lái)是不太好的。

如果你使用過(guò)Lifecycle或者Firebase,你會(huì)發(fā)現(xiàn)你根本不用寫(xiě)哪怕一行的初始化代碼就可以使用它,那么它們是怎么做的呢?

以Lifecycle為例:
我們?nèi)タ碙ifecycle的Manifest,其中會(huì)注冊(cè)一個(gè)ContentProvider:

<provider
    android:name="android.arch.lifecycle.LifecycleRuntimeTrojanProvider"
    android:authorities="xx.xx.xxxx.lifecycle-trojan"
    android:exported="false"
    android:multiprocess="true" />

而這個(gè)Provider的實(shí)現(xiàn)非常的簡(jiǎn)單:

public class LifecycleRuntimeTrojanProvider extends ContentProvider {
    @Override
    public boolean onCreate() {
        LifecycleDispatcher.init(getContext());
        ProcessLifecycleOwner.init(getContext());
        return true;
    }

    @Nullable
    @Override
    public Cursor query(@NonNull Uri uri, String[] strings, String s, String[] strings1,
            String s1) {
        return null;
    }
    ...
   //return null or 0;
}

原理:我們都知道ContentProvider的onCreate的調(diào)用時(shí)機(jī)介于Application的attachBaseContext和onCreate之間,Provider的onCreate優(yōu)先于Application的onCreate執(zhí)行,并且此時(shí)的Application已經(jīng)創(chuàng)建成功,而Provider里的context正是Application的對(duì)象,Lifecycle這么做,把init的邏輯放到庫(kù)內(nèi)部,讓調(diào)用方完全不需要在Application里去進(jìn)行初始化了,十分方便。

注意點(diǎn):
使用ContentProvider初始化的方式,我們需要注意一下幾點(diǎn):
首先,在Manifest里設(shè)置ContentProvider的時(shí)候要設(shè)置一個(gè)authorities,這個(gè)authorities相當(dāng)于ContentProvider的標(biāo)識(shí),是不能重復(fù)的,為了保證不重復(fù),我們?cè)僭O(shè)置這個(gè)值的時(shí)候最好不要硬編碼,而是使用以下的這種方式:使用appid+xxx

<provider
    android:authorities="${applicationId}.xxprovider"
    android:name=".MyLibRuntimeProvider"
    android:exported="false"/>

由ActivityThread的handleBindApplication方法可以看到,是先調(diào)用installContentProviders方法,然后調(diào)用mInstrumentation.callApplicationOnCreate方法的。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容