Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SyncAdapters.requestSync和Android SyncManager_Android_Android Syncadapter - Fatal编程技术网

SyncAdapters.requestSync和Android SyncManager

SyncAdapters.requestSync和Android SyncManager,android,android-syncadapter,Android,Android Syncadapter,我想了解SyncAdapters的工作原理。我查看了从广播接收器接收GCM通知时的代码。我们想通过调用requestSync强制SyncAdapter立即同步,因为GCM告诉我的应用程序有新数据可获取 我从这个链接中得到了下面的代码: 现在我从这里了解了SyncAdapter:),他们提到: SyncAdapter只是由同步管理器启动的服务, 这又维护了一个SyncAdapter队列 如果我的手机有两个不同的SyncAdapter,它们与不同的应用程序(Facebook、Twitter等)相关,

我想了解SyncAdapters的工作原理。我查看了从广播接收器接收GCM通知时的代码。我们想通过调用requestSync强制SyncAdapter立即同步,因为GCM告诉我的应用程序有新数据可获取

我从这个链接中得到了下面的代码:

现在我从这里了解了SyncAdapter:),他们提到:

SyncAdapter只是由同步管理器启动的服务, 这又维护了一个SyncAdapter队列

如果我的手机有两个不同的SyncAdapter,它们与不同的应用程序(Facebook、Twitter等)相关,并且它们都有需要同步的项目(例如,Facebook或Twitter上的新帖子),那么看起来所有这些SyncAdapter都会被放入队列,等待SyncManager批准同步所有这些SyncAdapter

如果我的应用程序调用命令sync now-ContentResolver.requestSync(),这是否意味着所有其他应用程序(Facebook、Twitter等)也会同时同步

我查看了requestSync方法的定义:

,java.lang.String,android.os.Bundle)

公共静态void requestSync(帐户、字符串权限、, 捆绑附加服务)

启动异步同步操作。如果你想 监视同步进程您可以注册SyncObserver

公共静态无效请求同步(SyncRequest请求)

使用SyncManager注册同步。这些请求是使用 SyncRequest.Builder


requestSync是否正在调用SyncManager同步其所有syncadapter?

如果使用代码显式强制运行syncadapter,则所有帐户都将同步

Bundle bundle = new Bundle();
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
//deprecated in API level 5
//bundle.putBoolean(ContentResolver.SYNC_EXTRAS_FORCE, true);
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
ContentResolver.requestSync(null, MyContentProvider.getAuthority(), bundle);
SyncAdapter可自动同步,但不能立即同步。换句话说,除非您强制同步适配器运行,否则很难估计它运行的确切时间。

对于初学者,请务必阅读和

请注意,
SyncAdapter
同步由授权字符串标识的单个
ContentProvider
的数据。例如,在许多与请求或取消运行SyncAdapter相关的
ContentResolver
方法中,您将看到权限的字符串参数。标识请求应用于的ContentProvider的

你问:

如果我的应用程序调用命令立即同步- ContentResolver.requestSync(),这是否意味着所有其他应用程序 (Facebook、Twitter等)也会同时同步

否。您的同步请求将包含ContentProvider的授权字符串,例如:“com.example.myprovider”。您正在使用指定的计划选项(现在、定期、数据更改、网络消息)请求仅同步该特定提供商

根据您请求同步时使用的选项,您的适配器可能会与其他应用程序的适配器同时运行。但这不在您的控制之下,它只是系统批量同步的结果,以最大限度地减少电池消耗和计量数据使用。如果另一个应用程序已请求每天一次的定期同步,并且您立即(很快)请求适配器同步,则您的适配器运行不会影响另一个适配器每天一次的计划

requestSync是否调用SyncManager来同步其所有 同步适配器

不,只是您的--您用authority参数指定的。我还没有通过实验验证,但我非常怀疑该系统是否允许应用程序请求或取消对其他应用程序拥有的内容提供商的同步。想象一下,如果一个流氓应用程序被允许控制其他应用程序适配器的运行,会造成多大的破坏


关于帐户:我的理解是,帐户信息提供给SyncAdapter,以允许其登录到与之同步的服务器。

但是帐户(如帐户类中的帐户)会同步还是所有应用程序(Facebook、Twitter)都会同步?由于使用了“同步附加手册”,我们将立即同步所有设备帐户,即使后台数据被禁用(感谢“同步附加手册”)!是的,其他应用程序也会同步。任何使用SyncAdapters的应用程序都必须使用帐户,因此将进行同步。顺便说一句,在API级别5中,不推荐使用sync_EXTRAS_FORCE。请改用同步附加手册。
Bundle bundle = new Bundle();
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
//deprecated in API level 5
//bundle.putBoolean(ContentResolver.SYNC_EXTRAS_FORCE, true);
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
ContentResolver.requestSync(null, MyContentProvider.getAuthority(), bundle);