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);
                }
            }
    
   }

Logo

一站式 AI 云服务平台

更多推荐