非侵入試獲取Context進(jìn)行SDK初始化
1、在一個(gè)library或者一個(gè)model中獲取context,來(lái)完成一些初始化的工作,可以使用
ContentProvider
ContentProvider是Android四大組件之一,一般用于不同應(yīng)用中的數(shù)據(jù)交互和共享。并且這個(gè)組件會(huì)在程序運(yùn)行時(shí)進(jìn)行初始化調(diào)用我們可以利用這個(gè)組件去獲取Context和進(jìn)行一些SDK的初始化,并且可以全局獲取Context;
ContentProvider的onCreate剛好處于Application#attachBaseContext()和Application#onCreate()中間,并且也能獲取Context,也具備了初始化SDK的能力。
public class ApplicationProvider extends ContentProvider {
@SuppressLint("StaticFieldLeak") static Context context;
@Override
public boolean onCreate() {
context = getContext();
//其他需要初始化實(shí)現(xiàn)的代碼
....
return true;
}
在SDK的AndroidManifest.xml注冊(cè)ApplicationProvider
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ifaa.mno" >
<application>
<provider
android:name=".ApplicationProvider"
android:authorities="${applicationId}.contextprovider"
android:exported="false" />
</application>
</manifest>
2、對(duì)于SDK的初始化,也可以這么搞,外界不需要手動(dòng)在Application進(jìn)行初始化
優(yōu)點(diǎn):
- 對(duì)于固定的初始化配置,可以使用ContextProvider方案減少調(diào)用方的配置對(duì)于介入方來(lái)說(shuō)無(wú)感,也避免上了好多對(duì)接上的錯(cuò)誤。降低耦合度,抽離代碼方便。
缺點(diǎn):
- 不能執(zhí)行耗時(shí)操作,否者會(huì)讓app啟動(dòng)變慢,并且接入方無(wú)法進(jìn)行優(yōu)化。對(duì)于耗時(shí)操作應(yīng)該由接入方?jīng)Q定合適做初始化操作。
- 多個(gè)SDK使用ContentProvider初始化,無(wú)法保證不同SDK初始化循序。
- 注意暴露風(fēng)險(xiǎn),聲明provider的時(shí)候,配置exported為false。