当用户在"帐户和同步"中选择"添加帐户"或想要使用该应用程序但尚未登录时,我正在尝试让我的应用程序显示我的登录活动.我已经非常密切地关注示例SampleSyncAdapter,但无法使其工作并收到以下异常:
No Activity found to handle Intent { act=android.accounts.AccountAuthenticator }  
我的身份验证服务包含:
public IBinder onBind(Intent intent) {
    IBinder ret = null;
    if (intent.getAction().equals(android.accounts.AccountManager.ACTION_AUTHENTICATOR_INTENT)){
        ret = getAuthenticator().getIBinder();
    }
    return ret;
}
我的AndroidManifest.xml:
<service android:name=".auth.MyAuthService"
         android:exported="true" 
         android:process=":auth">
    <intent-filter>
        <action android:name="android.accounts.AccountAuthenticator" />
    </intent-filter>
    <meta-data android:name="android.accounts.AccountAuthenticator"
               android:resource="@xml/authenticator" 
    />
我的主要活动:
startActivity(new Intent(android.accounts.AccountManager.ACTION_AUTHENTICATOR_INTENT));
我试过这两个:
Intent svc = new Intent(this, CreazaAuthService.class);
startService(svc);
和:
bindService(new Intent(android.accounts.AccountManager.ACTION_AUTHENTICATOR_INTENT), null, BIND_AUTO_CREATE);
在startActivity()通话之前,它仍然找不到该意图的活动.如果我尝试通过帐户添加帐户并同步我的应用程序崩溃ActivityNotFoundException.
我究竟做错了什么?
编辑
 
我已经检查了c99的last.fm应用程序,该应用程序定义了一个自定义操作并使用基于该操作的意图而不是android.accounts.AccountManager.ACTION_AUTHENTICATOR_INTENT.这是一个更好的方法吗?有没有办法让它与Accounts&Sync一起使用?
为同步定义的ContentProvided是虚拟的(根据这种方法).
android frequency android-contentprovider android-syncadapter
不知怎的,我不明白查询参数CALLER_IS_SYNCADAPTER的工作概念.其默认值为false,如果设置,则不会自动设置DIRTY标志.那它究竟意味着什么呢?根据我的理解,联系人的每次更改都会导致将脏标志设置为1.在同步适配器完成作业后,使用插入/更新/删除CALLER_IS_SYNCADAPTER,插入/更新和删除的记录的脏标志应为0 , 是对的吗?
但是,如果我使用该可选参数调用查询,则条目将保留为标志1.
还有什么我必须做的,或者我理解它应该如何运作错误?或者有什么东西告诉系统同步已成功完成设置标志?
有没有人有进一步阅读的样本或建议?
我在我的应用程序中广泛使用syncadaptor来实现其核心功能.我还使用了syncadaptor提供的定期刷新.因此,在手机上禁用"帐户和同步",我的应用程序将毫无用处.使用ContentResolver.setMasterSyncAuto(true)来打开同步被认为是一种不好的做法或粗鲁.只是做一个ContentResolver.setIsSyncable没有帮助,因为如果主帐户和同步被禁用,那么定期同步不起作用.处理此方案的常用方法是什么?
提前致谢,
-V-
我已经阅读了很多关于Sync Adapter的教程,例如http://www.c99.org/2010/01/23/writing-an-android-sync-provider-part-1上的教程以及SampleSyncAdapter示例Android开发者网站上的代码.但我不明白服务器端如何处理身份验证和同步查询.我可以使用php从mySQL服务器数据库进行查询吗?
尝试为我的内容提供商设置同步适配器/服务.内容提供商工作正常,能够毫无问题地存储数据.
我有一个内容观察器,它在我的内容解析器中注册,并且在数据更改后调用onChange方法.
但是,在我调用observer.onChange之后,日志中没有任何内容出现.在observer.onChange中,我调用了contentResolver.requestSync,但是没有调用同步适配器中的onPerformSync方法.
想法?
syncadapter.xml
<sync-adapter
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:contentAuthority="....contentproviderexample.provider"
    android:accountType="....contentproviderexample"
    android:userVisible="false"
    android:supportsUploading="false"
    android:allowParallelSyncs="false"
    android:isAlwaysSyncable="true"/>
authenticator.xml
<account-authenticator
    android:label="@string/app_name"
    android:smallIcon="@mipmap/ic_launcher"
    android:icon="@mipmap/ic_launcher"
    android:accountType="....contentproviderexample"
    xmlns:android="http://schemas.android.com/apk/res/android"/>
观察者改变:
@Override
        public void onChange(boolean selfChange, Uri uri) {
            Log.d(PERSON_OBSERVER_TAG, "onChange:  Calling requestSync");
            contentResolver.requestSync(newAccount, PersonContract.CONTENT_AUTHORITY, Bundle.EMPTY);
        }
表现:
<service android:name=".datasync.AuthenticatorService">
            <intent-filter>
                <action android:name="android.accounts.AccountAuthenticator"></action>
            </intent-filter>
            <meta-data
                android:name="android.accounts.AccountAuthenticator"
                android:resource="@xml/authenticator"/>
        </service>
        <service android:name=".datasync.SyncService"
            android:exported="true"
            android:process=":sync">
            <intent-filter>
                <action android:name="android.content.SyncAdapter"/>
            </intent-filter>
            <meta-data
                android:name="android.content.SyncAdapter"
                android:resource="@xml/syncadapter">
            </meta-data>
        </service>
以前可以使用 IntentService 或带 WakeLock 的 SyncAdapter 来确保一系列更新。
现在有了新的 Doze 模式和节省电池的限制,WakeLock 是否仍然足够可靠,还是应该使用 WorkManager 在 IntentService 或 SyncAdapter 中启动更长的进程?
WorkManager api 也可以生产了吗?
我正在设计一个应用程序,用于从Web服务中获取一些数据,例如REST API,并将其显示给用户:
我正在考虑将同步适配器与Content Provider API结合使用:
我的问题是,如果远程应用程序具有服务器推送支持(使用Socket.IO左右),我应如何设计该应用程序以利用此功能?因为据我了解,SyncAdapter的运行时间由SyncManager决定。因此,我无法确保仅在服务器推送时才完成同步。我想知道是否有可能,即使没有在前台或后台运行应用程序也是如此。即,仅在运行同步适配器的情况下。
预先感谢您的任何答复。
PS:我才刚刚开始设计android应用,所以如果我错了,请原谅/纠正我。
跟进: