非侵入试获取Context进行SDK初始化
1、在一个library或者一个model中获取context,来完成一些初始化的工作,可以使用
ContentProvider
ContentProvider是Android四大组件之一,一般用于不同应用中的数据交互和共享。并且这个组件会在程序运行时进行初始化调用我们可以利用这个组件去获取Context和进行一些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();
//其他需要初始化实现的代码
....
return true;
}
在SDK的AndroidManifest.xml注册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、对于SDK的初始化,也可以这么搞,外界不需要手动在Application进行初始化
优点:
- 对于固定的初始化配置,可以使用ContextProvider方案减少调用方的配置对于介入方来说无感,也避免上了好多对接上的错误。降低耦合度,抽离代码方便。
缺点:
- 不能执行耗时操作,否者会让app启动变慢,并且接入方无法进行优化。对于耗时操作应该由接入方决定合适做初始化操作。
- 多个SDK使用ContentProvider初始化,无法保证不同SDK初始化循序。
- 注意暴露风险,声明provider的时候,配置exported为false。
网友评论