ContentProvider何时创建呢?这是一个值得深思的问题?
据我这两天的了解是在你要用到的时候才会调用ContentProvider的onCreate函数进行创建。你就会什么时候叫要用到的时候呢?比如你要查询或删除修改数据库的时候通过ContentResolver的quire或delete来操纵数据时就会调用ContentProvider的onCreate函数,若已经创建了数据库就不会再次创建。可以通过ContentResolver的源码来理解
public final Cursor query(Uri uri, String[] projection,
String selection, String[] selectionArgs, String sortOrder) {
IContentProvider provider = acquireProvider(uri);
if (provider == null) {
return null;
}
try {
Cursor qCursor = provider.query(uri, projection, selection, selectionArgs, sortOrder);
if(qCursor == null) {
releaseProvider(provider);
return null;
}
//Wrap the cursor object into CursorWrapperInner object
return new CursorWrapperInner(qCursor, provider);
} catch (RemoteException e) {
releaseProvider(provider);
return null;
} catch(RuntimeException e) {
releaseProvider(provider);
throw e;
}
}
ContentResolver中的acquireProvider(uri)来获得对应的Provider.通过uri中的Authority的字段知道是要用哪个provider.也就是为什么要在Provider的menifester.xml中<provider.. android:authority="">.
下面对android的几个已有的Provider的进行说明一下:
1,SettingsProvider
<!-- Permission to write Gservices in SettingsProvider -->
<permission android:name="android.permission.WRITE_GSERVICES"
android:label="@string/permlab_writeGservices"
android:description="@string/permdesc_writeGservices"
android:protectionLevel="signature" />
<application android:allowClearUserData="false"
android:label="Settings Storage"
android:icon="@drawable/ic_launcher_settings">
<provider android:name="SettingsProvider" android:authorities="settings"
android:process="system" android:multiprocess="false"
android:writePermission="android.permission.WRITE_SETTINGS"
android:initOrder="100" />
</application>
</manifest>
若你仔细查看SettingsProvider就会发现在它的manifester.xml中在android:process="system" 和android:sharedUserId="android.uid.system
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.android.providers.settings"
android:sharedUserId="android.uid.system">,我猜测它就是多了这两条语句使得系统加载完就加载它。若你注意开机的logcat就会发现
04-29 02:32:20.612: INFO/ActivityThread(79): Publishing provider settings: com.android.providers.settings.SettingsProvider通过ActivityThread开始往上追你就会发现
从SystemServer.java中的
Log.i(TAG, "Starting System Content Providers.");
ActivityManagerService.installSystemProviders();
到ActivityManagerService.java中的
public static final void installSystemProviders() {
[color=blue]ProcessRecord app = mSelf.mProcessNames.get("system", Process.SYSTEM_UID);[/color]
List providers = mSelf.generateApplicationProvidersLocked(app);
mSystemThread.installSystemProviders(providers);
}
再到ActivityThread.java:
public final void installSystemProviders(List providers) {
if (providers != null) {
installContentProviders(mInitialApplication,
(List<ProviderInfo>)providers);
}
}
private final void installContentProviders(
Context context, List<ProviderInfo> providers) {
final ArrayList<IActivityManager.ContentProviderHolder> results =
new ArrayList<IActivityManager.ContentProviderHolder>();
Iterator<ProviderInfo> i = providers.iterator();
while (i.hasNext()) {
ProviderInfo cpi = i.next();
StringBuilder buf = new StringBuilder(128);
buf.append("Publishing provider ");
buf.append(cpi.authority);
buf.append(": ");
buf.append(cpi.name);
Log.i(TAG, buf.toString());
IContentProvider cp = installProvider(context, null, cpi, false);
if (cp != null) {
IActivityManager.ContentProviderHolder cph =
new IActivityManager.ContentProviderHolder(cpi);
cph.provider = cp;
results.add(cph);
// Don't ever unload this provider from the process.
synchronized(mProviderMap) {
mProviderRefCountMap.put(cp.asBinder(), new ProviderRefCount(10000));
}
}
}
2,CalendarProvider
Manifester.xml
<receiver android:name="CalendarReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver> <provider android:name="CalendarProvider" android:authorities="calendar"
android:syncable="true" android:multiprocess="false"
android:readPermission="android.permission.READ_CALENDAR"
android:writePermission="android.permission.WRITE_CALENDAR" />
并不采用了SettingsProvider的方式而是通过了android.intent.action.BOOT_COMPLETED的方式:
CalendarReceiver.java
public class CalendarReceiver extends BroadcastReceiver {
static final String SCHEDULE = "com.android.providers.calendar.SCHEDULE_ALARM";
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
ContentResolver cr = context.getContentResolver();
CalendarProvider provider;
IContentProvider icp = cr.acquireProvider("calendar");
provider = (CalendarProvider) ContentProvider.
coerceToLocalContentProvider(icp);
if (action.equals(SCHEDULE)) {
provider.scheduleNextAlarm(false /* do not remove alarms */);
} else if (action.equals(Intent.ACTION_BOOT_COMPLETED)) {
provider.bootCompleted();
}
cr.releaseProvider(icp);
}
}
分享到:
相关推荐
ContentProvider是Android系统中的四大组件之一,它是Android应用程序间数据共享的主要机制。通过ContentProvider,一个应用可以将自己的数据暴露给其他应用,同时也能够访问其他应用公开的数据。在Android的封闭...
为了进一步了解这个例子,你需要查看并分析`CPTest`中的具体实现。 总结来说,ContentProvider监听的例子主要涉及了如何创建ContentProvider、在AndroidManifest.xml中声明Provider、使用ContentObserver监听数据...
- 分析源码有助于开发者深入理解ContentProvider的工作流程,提升数据管理能力。 6. APK 文件: - 提供的APK文件可能是包含该ContentProvider的示例应用,安装后可以实际操作和测试ContentProvider的功能,观察其...
ContentProvider的源码分析对于深入理解Android系统的数据管理机制至关重要。本文将详细探讨ContentProvider的工作原理、实现机制以及源码中的关键组件。 首先,ContentProvider的核心功能是为其他应用程序提供一个...
十、ContentProvider2-master项目分析 ContentProvider2-master可能是一个示例项目,用于演示如何创建和使用ContentProvider客户端。该项目可能包含一个自定义的ContentProvider实现,以及一个或多个客户端应用,...
在Android系统中,ContentProvider是一种核心组件,它允许应用程序之间共享数据。ContentProvider作为一个桥梁,使得其他应用...通过分析"ContentProviderDemo"中的代码,开发者可以更深入地了解这一组件的运作机制。
9. **实例分析** 博文链接中提到的"sunzone.iteye.com/blog/1884167"可能详细介绍了如何根据上述步骤创建一个自定义的ContentProvider。通过阅读这个博客,你可以获取具体的代码示例和实现细节。 10. **最佳实践**...
通过分析和学习这个“ContentProvider完整例子”,你可以了解到如何构建和使用ContentProvider,这对于实现跨应用的数据共享至关重要。同时,这也是一种提升应用可扩展性和模块化的好方式,因为数据的存储和访问被...
5. **Activity、Service、BroadcastReceiver和ContentProvider分析**:Androguard揭示了Android四大组件的定义和关联,帮助我们理解APK如何与其他应用和服务进行交互。 6. **Intent过滤器分析**:Androguard能解析...
通过分析和实践"ContentProviderDemo",你可以了解到如何创建自定义ContentProvider,如何结合SQLite数据库,以及如何在应用程序中使用ContentResolver进行数据操作。这将有助于提升你在Android开发中的数据管理能力...
分析这个文件,你可以了解应用是如何组织和存储数据的。通常,你可以使用一些数据库查看工具,如 DB Browser for SQLite,来打开并检查这个.db文件的内容。 总结起来,SQLite 和 ContentProvider 是 Android 应用中...
5. **示例代码分析** 压缩包中的示例代码应包含一个自定义ContentProvider的实现,展示了如何处理数据操作。同时,还有一个客户端应用,演示了如何使用ContentResolver查询和操作由ContentProvider提供的数据。 6....
六、ContentProvider源码分析 ContentProvider的源码中,`onCreate()`方法是在ContentProvider启动时调用,通常用来初始化数据库或进行其他设置。`query()`, `insert()`, `update()`, `delete()`方法根据传入的URI...
ContentProvider是Android系统中的四大组件之一,它是Android应用程序之间数据共享的...这个demo为我们提供了一个学习和实践ContentProvider的好机会,通过分析和运行代码,我们可以更深入地理解和掌握这一核心功能。
在Android开发中,ContentProvider是四大组件之一,它扮演着数据共享和访问的重要角色。...通过分析和实践这个例子,开发者能更好地理解和掌握ContentProvider的使用,提升应用程序的互操作性和数据管理能力。
在Android开发中,ContentProvider是系统提供的一种数据共享机制,它可以跨应用地访问和操作数据。而`AsyncQueryHandler`是Android系统提供的一个辅助类,用于在ContentProvider中执行异步查询操作,避免阻塞主线程...
ContentProvider是android的四大组件之一,同时与SharedPreferences、IO、SQLite、网络共同构成了五种android存储技术。是android定义的一个管理访问结构化数据机制。android支持的Sqlite是不支持跨进程、跨应用访问...
通过分析和学习这些代码,可以加深对Android ContentProvider机制的理解,掌握如何在实际项目中构建和使用ContentProvider。 总之,Android的ContentProvider是实现跨应用数据共享的关键组件。通过创建自定义的...