- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在使用内置帐户系统(使用 AccountManager API)为 Android 应用程序实现登录系统。
在 Android 2.2+ 上一切都很好,但在 Android 2.1 上不包括 SyncAdapter 会导致帐户设置屏幕重新启动(参见 http://code.google.com/p/android/issues/detail?id=5009 和 AccountManager without a SyncAdapter?)
为了解决这个问题,我实现了一个 stub SyncAdapter,它只从 IBinder onBind(Intent intent)
返回 null
,并将相关内容添加到 list 中。这解决了 Android 2.1 上的重启问题。
然而,它引入了一个进一步的问题:添加帐户后,Android 系统将在一段时间后启动帐户同步。虽然没有发生错误(实际上我的 SyncAdapter 什么都不做,除非返回 null
,否则它无法导致错误),同步图标仍然停留在顶部的通知栏中。这导致 Android 同步系统保持永久唤醒锁定,防止设备休眠。
该帐户不会在帐户设置屏幕(在“数据和同步”标题下)中列出任何可同步的组件,并且始终在帐户列表中显示“同步已关闭”的同步状态(即使同步图标在通知栏中可见)。禁用帐户同步并不能解决问题。删除帐户可以解决问题。
我的猜测是我不应该返回 null。我应该返回 ThreadedSyncAdapter 的基本实现吗?非常感谢任何帮助在没有关联同步的情况下在 2.1 和 2.2+ 上正常工作的帐户系统。
最佳答案
因为这是我见过的唯一与此问题相关的问题,所以这是一个 > 晚了的答案。由于 android 系统自动同步我的自定义帐户,我还遇到了永久唤醒锁定问题。
处理此问题的最佳方法,它需要最少的代码并且实际上做到了,因此除非特别调用以在代码中同步,否则帐户永远不会同步:
ContentResolver.setIsSyncable(account, ContactsContract.AUTHORITY, 0);
现在这要求您在创建帐户时调用此静态方法。而第一个参数是为其设置此设置的帐户,第二个参数是使用的内容提供者的权限,第三个参数是设置为正数时启用同步的整数,设置为 0 时禁用同步,设置为其他任何值时使其不为人知。使用权限可以在您的“sync_something.xml”中的 contentAuthority 属性下找到,它由您的 SyncAdapter 使用:
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:contentAuthority="com.android.contacts"
android:accountType="com.myapp.account"/> <!-- This being your own account type-->
上述 xml 文件在 AndroidManifest.xml 的服务部分中指定:
<service android:name=".DummySyncAdapterService"
exported="true"
android:process=":contacts">
<intent-filter>
<action android:name="android.content.SyncAdapter" />
</intent-filter>
<meta-data android:name="android.content.SyncAdapter"
android:resource="@xml/sync_something" /> <!--This points to your SyncAdapter XML-->
</service>
这是我用来在 LoginActivity 中创建自定义帐户的代码 fragment :
Account account = new Account("John Doe", "com.myapp.account");
ContentResolver.setIsSyncable(account, ContactsContract.AUTHORITY, 0);
AccountManager am = AccountManager.get(LoginActivity.this);
boolean accountCreated = am.addAccountExplicitly(account, "Password", null);
Bundle extras = LoginActivity.this.getIntent().getExtras();
if(extras != null){
if (accountCreated) {
AccountAuthenticatorResponse response = extras.getParcelable(AccountManager.KEY_ACCOUNT_AUTHENTICATOR_RESPONSE);
Bundle result = new Bundle();
result.putString(AccountManager.KEY_ACCOUNT_NAME, "John Doe");
result.putString(AccountManager.KEY_ACCOUNT_TYPE, "com.myapp.account");
response.onResult(result);
}
}
其中很大一部分是当系统尝试同步服务时,它首先检查服务是否可同步,如果设置为 false 则取消同步。现在您不必创建自己的 ContentProvider
,您的 ContentProvider
也不会显示在数据和同步下。 但是,您确实需要有一个 AbstractThreadedSyncAdapter 的 stub 实现,它在它的 onBind 方法中返回一个 IBinder。最后但并非最不重要的一点是,它使用户无法启用同步或使用“立即同步” "此帐户的按钮,除非您已在您的应用程序中添加该功能。
关于android - 如何在没有 SyncAdapter 的情况下在 Android 上实现帐户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5358391/
我正在通过 SyncAdapter onPerformSync 发送几个改造调用,并且我试图通过通过 try/catch sleep 语句发送出去来调节 http 调用。但是,这会阻塞 UI,并且只有
如果账户 A 的 SyncAdapter A 在 ContactsContract.RawContacts 表中创建了原始联系人,那么账户 B 的 SyncAdapter B 是否可以更新 SyncA
Android SyncAdapter 不考虑主线程设置的静态变量值。由于静态变量在应用程序中持续存在,因此预计可以跨线程共享。但 SyncAdapter 不考虑主线程设置的那些值并采用默认值。帮助我
我在实现具有虚拟帐户和虚拟帐户身份 validator 的 Syncadapter 时遇到问题。 我的帐户 validator ,CNAuthenticator: public class CNAut
如果我通过“设置/帐户”屏幕选中复选框,我就会运行自动同步。如果我将 syncadapter.xml 中的 UserVisible 设置为 false,则无法选中该复选框。如何在没有设置屏幕选项的情况
我实现了一个简单的 syncadapter,它在 Moto G 上运行良好,但在 Nexus 7 上却不行(永远不会调用 onPerformSync) 为了测试,我像这样手动启动同步: Bundle
是否可以在应用程序未运行时在后台运行 SyncAdapter?如果服务器有任何变化,我想更新 sqlite 数据库,即使 android 应用程序没有运行? 最佳答案 这个用例的最佳实践可能是: 1)
如何从 Sync Adapter 服务(标红)获取最后更新日期? 最佳答案 很有趣。 API 将(几乎必须)在 android.content.ContentResolver 上,因为这是管理定期同步
我有一个应用程序,它使用 SyncAdapter 对远程服务器进行 REST 调用,然后使用内容提供程序将更新保存到本地 SQLLite 数据库。 我可以通过转到“帐户与同步”来触发调用,然后选择我的
我已经阅读了有关同步适配器的所有详细信息,并且我了解它是如何工作的,但是我找不到任何关于是否可以不让用户取消同步数据的信息。 例如,如果我使用 syncadapter 将我的应用程序的所有数据与服务器
我知道内容修改后 30 秒会自动同步。观察 logcat for fat 的时间更长,这证明自动同步没有发生。至少,不适用于我的自定义 SyncAdapter。 用户提供者: 用户同步适配器: 启
我已经尝试了很棒的谷歌示例来同步来自网络服务的联系人并且工作正常。这称为 SampleSyncAdapter,非常值得:http://developer.android.com/resources/s
我正在尝试编写一个 Android SyncAdapter 并且有点困惑。在同步期间(即在 onPerformSync() 中),我希望能够从远程服务器拉下数据,但也希望将数据推送到远程服务器(这是双
我们的 SyncAdapter 实现不与 android 版本 4.4.4 同步。适用于较低 API 的设备。 我们的应用使用 AbstractThreadedSyncAdapter与服务器通信。我已
我正在编写一个 Android Sync Adapter 并且基本上在无限循环中同步时遇到问题。一旦同步完成,它就会重新开始。 谢谢, 问候, 阿克谢 @Override public voi
我是 syncAdapter 的新手。我看过google IO video (讲座演示 here),我已经阅读了 2 个教程(here 和 here)。 我还尝试了教程的代码,但令人沮丧的是我无法弄清
我已经按照 SDK 中的 SimpleSyncAdapter 示例项目实现了 SyncAdapter、AccountManager 和私有(private) ContentProvider。一切正常。
我的应用程序允许人们使用和管理他们的数据,无论他们是否登录。尽管如此,由于我唯一地标识每台设备,我也想同步来 self 的匿名用户(未登录的用户)的数据。因此,我想知道在这种情况下创建匿名帐户是否是一
我正在尝试为我的 Android 应用程序创建一个 SyncAdapter,以显示来自一个特定 channel 的 YouTube 视频。这些视频是公共(public)领域的,所以我不希望用户登录、创
我目前正在开发一个依赖 SyncAdapter 从服务器刷新其内容的 android 应用程序。我基本上遵循了这些说明:https://developer.android.com/training/s
我是一名优秀的程序员,十分优秀!