- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试实现在 Google IO 中讨论的 Content-Provider-Sync Adapter 模式。 - 幻灯片 26。我的内容提供程序正在工作,当我从 Dev Tools Sync Tester 应用程序触发它时,我的同步工作,但是当我从我的 ContentProvider 调用 ContentResolver.requestSync(account, authority, bundle) 时,我的同步从未被触发。
ContentResolver.requestSync(
account,
AUTHORITY,
new Bundle());
<service
android:name=".sync.SyncService"
android:exported="true">
<intent-filter>
<action
android:name="android.content.SyncAdapter" />
</intent-filter>
<meta-data android:name="android.content.SyncAdapter"
android:resource="@xml/syncadapter" />
</service>
<?xml version="1.0" encoding="utf-8"?>
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:contentAuthority="AUTHORITY"
android:accountType="myaccounttype"
android:supportsUploading="true"
/>
最佳答案
调用 requestSync()
仅适用于系统已知的 {Account, ContentAuthority} 对。您的应用需要通过多个步骤来告诉 Android 您能够使用特定类型的帐户同步特定类型的内容。它在 AndroidManifest 中执行此操作。
1.通知Android您的应用程序包提供同步
首先,在 AndroidManifest.xml 中,您必须声明您有一个同步服务:
<service android:name=".sync.mySyncService" android:exported="true">
<intent-filter>
<action android:name="android.content.SyncAdapter" />
</intent-filter>
<meta-data
android:name="android.content.SyncAdapter"
android:resource="@xml/sync_myapp" />
</service>
<service>
的name属性tag 是你用来连接同步的类的名称...我稍后会谈到这个。
ContentResolver
才能调用它)。
Intent
来自
ContentResolver
当你调用
ContentResolver.requestSync()
或相关的调度方法。)
<meta-data>
标签将在下面讨论。
public class mySyncService extends Service {
private static mySyncAdapter mSyncAdapter = null;
public SyncService() {
super();
}
@Override
public void onCreate() {
super.onCreate();
if (mSyncAdapter == null) {
mSyncAdapter = new mySyncAdapter(getApplicationContext(), true);
}
}
@Override
public IBinder onBind(Intent arg0) {
return mSyncAdapter.getSyncAdapterBinder();
}
}
Service
或其子类之一,必须实现
public IBinder onBind(Intent)
,并且必须返回
SyncAdapterBinder
当它被调用时...你需要一个
AbstractThreadedSyncAdapter
类型的变量.如您所见,这几乎是该类中的所有内容。它存在的唯一原因是提供一个服务,该服务为 Android 提供了一个标准接口(interface)来查询您的类,以了解您的
SyncAdapter
本身就是。
class SyncAdapter
实际执行同步。
onPerformSync()
方法在需要同步时被调用。我想你已经有了这个。
<meta-data>
我们服务中的标签是在 ContentAuthority 和帐户之间建立绑定(bind)的关键部分。它从外部引用了另一个 xml 文件(随便你怎么称呼它,与你的应用程序相关的东西。)让我们看看 sync_myapp.xml:
<?xml version="1.0" encoding="utf-8" ?>
<sync-adapter
xmlns:android="http://schemas.android.com/apk/res/android"
android:contentAuthority="com.android.contacts"
android:accountType="com.google"
android:userVisible="true" />
<service>
标签的 name 元素中调用的类,其中包括引用此文件的
<meta-data>
标签...)将使用 com 同步联系人。谷歌风格帐户。
ContentResolver.setSyncAutomatically(account, AUTHORITY, true);
ContentResolver.SYNC_EXTRAS_MANUAL
在 requestSync 的 extras 包中为 true 会要求 android 强制同步,即使全局同步已关闭(请在此处尊重您的用户!)
ContentResolver.setIsSyncable(Account account, String authority, int syncable)
可能对这里感兴趣。
setSyncAutomatically()
控制是否选中或取消选中帐户/权限对,而
setIsSyncable()
提供了一种取消选中和灰显该行的方法,因此用户无法打开它。您可以将一个帐户设置为可同步,而将另一个设置为不可同步 (dsabled)。
ContentResolver.notifyChange()
是
ContentProvider
使用的函数s 通知 Android 本地数据库已更改。这有两个作用,首先,它会导致跟随该内容 uri 的游标更新,然后重新查询和无效并重绘
ListView
等等...很神奇,数据库变了,你的
ListView
只是自动更新。太棒了。此外,当数据库更改时,Android 会为您请求同步,即使在您的正常计划之外,以便这些更改从设备上移除并尽快同步到服务器。也很棒。
ContentProvider
,它将尽职尽责地拨打
notifyChange()
android 会说:“哦,数据库更改了,最好将它们放在服务器上!” (Doh!)写得很好
ContentProviders
将进行一些测试以查看更改是来自网络还是来自用户,并将设置 bool 值
syncToNetwork
如果是这样,则标记为 false,以防止这种浪费的双同步。如果您将数据输入
ContentProvider
,你有必要弄清楚如何让这个工作 - 否则你最终会在只需要一个同步时执行两个同步。
关于android - 为什么 ContentResolver.requestSync 不触发同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5253858/
我正在制作一个具有 syncAdapter 的应用。 我希望能够执行 requestSync 以及一些将通过其 bundle 发送的参数。原因是我希望选择 syncAdapter 实例将执行的操作。
我正在尝试实现在 Google IO 中讨论的 Content-Provider-Sync Adapter 模式。 - 幻灯片 26。我的内容提供程序正在工作,当我从 Dev Tools Sync T
我正在尝试实现同步适配器,我已经关注了This guide. 但是 onPerformSync() 在 ContentResolver.requestSync() 调用之后没有被触发。 我也尝试了一些
我正在创建一个 Android 应用程序,它向用户提供一个按钮来刷新数据库,以便本地数据和服务器上的数据保持同步。 我已经创建了帐户验证器、内容提供器并通过服务绑定(bind)了它们。 Content
因此,我遵循了有关在没有真正的 ContentProvider 和帐户的情况下创建 SyncAdapter 的教程(来自 here),但遇到了一个我无法解决的问题。 当调用 ContentResolv
我正在尝试调用 ContentResolver.requestSync。它在文档中说我需要 3 个参数。第一个是一个帐户,其中说明: 应该同步哪个帐户 有 2 个帐户构造函数。除非有其他方式获得帐户,
我正在使用 SyncAdapter 和 GCM 将后端服务器上的不同类型的更改通知我的应用程序。例如,如果更改 A 在服务器上发生,我会使用名为 change_a 的字段发送推送通知,我通过 Cont
我使用 SyncAdapter 将我的数据与服务器同步。一切正常,但我很难向 SyncAdapter 发送额外内容。 在我的 ContentObserver 中,我使用以下代码向 SyncAdapte
我正在尝试实现 Contact Sync Adapter。当我从相应帐户下给出的同步选项进行同步操作时,它工作正常。但是,当我尝试调用 requestSync() 第一次 按钮点击时,SyncAdap
Google 建议在收到 GCM 推送通知时延迟执行 syncAdapter: Note: If you use GCM to trigger your sync adapter via a broa
我有自己的 ContentProvider 和 SyncAdapter,它们都可以正常工作。 我将它们设置为与此作品的 ContentResolver.setSyncAutomatically() 自
我正在尝试使用“StubProvider”和“StubAuthenticator”编写一个同步适配器,我遵循了官方指南,我的代码运行没有任何错误,但是“onPerformSync()”没有被调用,我尝
如果 ContentResolver.addPeriodicSync 没有触发 onPerformSync(...) 方法,可能是什么问题。 但是 ContentResolver.requestSyn
我刚刚为我的应用创建了一个帐户。 该帐户在设置中可见 我在我的 XML 中设置了 syncable="true" 我可以通过按设置 -> onPerformSync 来执行手动同步被称为 我可以通过调
我正在使用适用于 Android 的 google drive api 来访问 google drive 中的文件。上传新文件后,我的应用程序需要 3 到 15 分钟才能访问该文件。我尝试添加 req
我是一名优秀的程序员,十分优秀!