android contentResolver与contentProvider怎么关联在一起的

android contentResolver与contentProvider如何关联在一起的看到一篇文章觉得不错,推荐给大家,希望大家喜

android contentResolver与contentProvider如何关联在一起的
看到一篇文章觉得不错,推荐给大家,希望大家喜欢android contentResolver与contentProvider怎么关联在一起的

Application是一个完整的应用,比如某个apk,它对应一个Application,它里面可能包含n个Activity。

涉及到的类froyo/frameworks/base/core/java/android/app/ApplicationContext.java

? ?? ?? ? froyo/frameworks/base/core/java/android/app/ActivityThread.java

? ?? ?? ? froyo/frameworks/base/services/java/com/android/server/am/ActivityManagerService.java


当我们启动手机之后,如果需要启动一个activity,ActivityThread,ActivityManagerService就开始发挥作用了,这里不做细述。

当我们真正的启动一个activity的时候,我们会把当前Application的ApplicationContext传进去,

ApplicationContext实例持有一个mContextResolver对象,该对象对应于ApplicationContext的

内部类ApplicationContentResolver.

当activity调用getContentResolver()时,我们实际调用的是当前ApplicationContext中的mContextResolver.

由于黑色的继承关系,我们可以得到红色的调用关系

代码片段如下:
Activity调用ContextWrapper的方法? ?? ?? ?? ?return null;
? ?? ???}
? ?? ???if (holder.permissionFailure != null) {
? ?? ?? ?? ?throw new SecurityException("Permission " + holder.permissionFailure
? ?? ?? ?? ?? ?? ???+ " required for provider " + name);
? ?? ???}

? ?? ???IContentProvider prov = installProvider(context, holder.provider,
? ?? ?? ?? ?? ? holder.info, true);
? ?? ???//Log.i(TAG, "noReleaseNeeded=" + holder.noReleaseNeeded);
? ?? ???if (holder.noReleaseNeeded || holder.provider == null) {
? ?? ?? ?? ?// We are not going to release the provider if it is an external
? ?? ?? ?? ?// provider that doesn't care about being released, or if it is
? ?? ?? ?? ?// a local provider running in this process.
? ?? ?? ?? ?//Log.i(TAG, "*** NO RELEASE NEEDED");
? ?? ?? ?? ?synchronized(mProviderMap) {
? ?? ?? ?? ?? ? mProviderRefCountMap.put(prov.asBinder(), new ProviderRefCount(10000));
? ?? ?? ?? ?}
? ?? ???}
? ?? ???return prov;
? ? } 复制代码到这里的话,ContentResovler与ContentProvider的关系就搞懂了,具体其他的细节,将分为不同的方面,分别讲述。