Android 使用ContentProvider初始化你的Library、获取ApplicationContext
Manifest<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.zhangyu.testcontentprovider"><applicationandroid:name=".Ap
·
Manifest
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.zhangyu.testcontentprovider">
<application
android:name=".App"
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<provider
android:name=".MyContentProvider"
android:authorities="MyContentProvider"
android:enabled="true"
android:exported="true" />
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
App (Application)
public class App extends Application {
private static final String TAG = "App";
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate: " + getApplicationContext());
}
}
MyContentProvider (ContentProvider)
通过Android Studio 快速创建一个ContentProvider
public class MyContentProvider extends ContentProvider {
private static final String TAG = "MyContentProvider";
public MyContentProvider() {
}
/**
* 通过ContentProvider获取ApplicationContext
*/
private static Context context;
public static Context getApplicationContext() {
return context;
}
@Override
public boolean onCreate() {
Log.e(TAG, "AppProvider onCreate" );
context = getContext();
return false;
}
...
}
ContentProvider中获取到的getContext就是Application的getApplicationContext,并且ContentProvider先于Application初始化
D/MyContentProvider: onCreate: com.zhangyu.testcontentprovider.App@e9cb574
D/App: onCreate: com.zhangyu.testcontentprovider.App@e9cb574
ContentProvider在Application.onCreate之前
- ActivityThread.handleBindApplication
其中有这么一段代码可以看出,先创建了ContentProvider然后在执行Application.onCreate
private void handleBindApplication(AppBindData data) {
// don't bring up providers in restricted mode; they may depend on the
// app's custom Application class
if (!data.restrictedBackupMode) {
if (!ArrayUtils.isEmpty(data.providers)) {
installContentProviders(app, data.providers);
}
}
try {
mInstrumentation.callApplicationOnCreate(app);
} catch (Exception e) {
if (!mInstrumentation.onException(app, e)) {
throw new RuntimeException(
"Unable to create application " + app.getClass().getName()
+ ": " + e.toString(), e);
}
}
}
更多推荐




所有评论(0)