Ska*_*ePL 7 android android-contentresolver android-contentprovider android-syncadapter
据我所知,在SyncService中定义的一个SyncAdapter仅限于接收一个要处理的ContentProvider权限.
但是,与此同时,它可以访问ContentResolver,它允许在其他ContentProviders上运行查询.如果需要开发人员为SyncAdapter提供单一内容权限,我无法理解这个特定的设计概念,尽管如此,她仍然能够在她有权访问的任何ContentProvider上做任何她想做的事情.我的问题是:忽略onPerformSync的参数有什么后果:字符串权限和ContentProviderClient提供程序以及纯ContentResolver?
我的应用程序(实际上是它的SyncService)的想法很简单:查询日历服务器(在我的情况下为OwnCloud)不仅可以获取事件(与com.android.calendar同步),还可以获取VTODOS,然后可以在各种任务管理应用程序之间分配,我可以获取源代码和/或ContentProviderContract.我还想到了我自己的"Hub"ContentProvider,它具有基本的VTODO/Task结构,并且是与服务器相比唯一的一个.它应该能够与任务管理应用程序的不同内容提供程序同步2路,然后它与服务器同步.
我已阅读使用ContentProviderClient和ContentResolver访问内容提供商,我想我理解其中的区别.我现在感到困惑的是为什么Android SDK中有如此强烈的建议在单个SyncAdapter中使用单个ContentProvider但你可以使用ContentResolver来绕过这个限制.
我花了一整天的时间来搞清楚这一点并在此问题上搜索了数百个SO/Google资源(其中一些是多次).我还看到了有关使用一个SyncAdapter来同步多个ContentProviders的问题,但没有一个答案与使用ContentResolver的建议相近.
ContentResolver在 的上下文中使用时,对 的 API没有特殊限制SyncAdapter。ContentProviderClient恕我直言,该框架通过和authority的唯一原因onPerformSync()是方便以及向开发人员暗示其SyncAdapter预期工作方式。
这个事实在源代码中很容易看出AbstractThreadedSyncAdapter.SyncThread-ContentProviderClient传递给以onPerformSync()标准方式获得:
@Override
public void run() {
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
// Trace this sync instance. Note, conceptually this should be in
// SyncStorageEngine.insertStartSyncEvent(), but the trace functions require unique
// threads in order to track overlapping operations, so we'll do it here for now.
Trace.traceBegin(Trace.TRACE_TAG_SYNC_MANAGER, mAuthority);
SyncResult syncResult = new SyncResult();
ContentProviderClient provider = null;
try {
if (isCanceled()) {
return;
}
provider = mContext.getContentResolver().acquireContentProviderClient(mAuthority);
if (provider != null) {
AbstractThreadedSyncAdapter.this.onPerformSync(mAccount, mExtras,
mAuthority, provider, syncResult);
} else {
syncResult.databaseError = true;
}
} finally {
Trace.traceEnd(Trace.TRACE_TAG_SYNC_MANAGER);
if (provider != null) {
provider.release();
}
if (!isCanceled()) {
mSyncContext.onFinished(syncResult);
}
// synchronize so that the assignment will be seen by other threads
// that also synchronize accesses to mSyncThreads
synchronized (mSyncThreadLock) {
mSyncThreads.remove(mThreadsKey);
}
}
}
Run Code Online (Sandbox Code Playgroud)
因此, bootom 行:您可以根据需要ContentResolver在您的应用程序中使用 - 只需调用并访问任何导出的.SyncAdaptergetContext().getContentResolver()ContentProvider
| 归档时间: |
|
| 查看次数: |
961 次 |
| 最近记录: |