Android SyncAdapter实例化,但onPerformSync从未调用过

时间:2016-07-01 09:55:38

标签: java android android-syncadapter

解决方案: 我忘了在onBind方法中在我的服务中返回我的SyncAdapterBinder。

谢谢Selvin的帮助!

我试图解决这个问题已经两天了,基本上已经阅读了所有相关主题,但到目前为止还无法找到解决方案。 我写了一个Android SyncAdapter,我觉得我写的一切都是正确的。问题是,我永远不会调用方法onPerformSync中的代码。在我的手机的帐户设置中,显示了SyncAdapter,我可以触发它,但没有任何反应。它告诉我它会同步一段时间然后停止。我确实有一个有效的AccountAuthenticator,我用我的帐户连接我的权限:

ContentResolver.setIsSyncable(account, "de.mydomain.myapp.provider",1); ContentResolver.setSyncAutomatically(account,"de.mydomain.myapp.provider",true);

以下是我的一些代码片段:

DatabaseSyncAdapter.java

public class DatabaseSyncAdapter extends AbstractThreadedSyncAdapter {
private final AccountManager am;
private static final String TAG = "DatabaseSyncAdapter";

public DatabaseSyncAdapter(Context context, boolean autoInitialize) {
super(context, autoInitialize);
am = AccountManager.get(context);
Log.d(TAG, "DatabaseSyncAdapter() called with: " + "context = [" + context + "], autoInitialize = [" + autoInitialize + "]");

}

public DatabaseSyncAdapter(Context context, boolean autoInitialize, boolean allowParallelSync) {
    super(context, autoInitialize, allowParallelSync);
    am = AccountManager.get(context);

}

@Override
public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) {
    Log.d(TAG, "onPerformSync() called with: " + "account = [" + account + "], extras = [" + extras + "], authority = [" + authority + "], provider = [" + provider + "], syncResult = [" + syncResult + "]");
    //doing sync stuff
}

syncadapter.xml

<?xml version="1.0" encoding="utf-8"?>
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:contentAuthority="de.mydomain.myapp.provider"
android:accountType="de.mydomain.myapp.user"
android:userVisible="true"
android:allowParallelSyncs="false"
android:isAlwaysSyncable="true"
android:supportsUploading="true"/>

SyncService.java

    public class SyncService extends Service{


    private static final Object sSyncAdapterLock = new Object();

    private static DatabaseSyncAdapter sSyncAdapter = null;


    @Override

    public void onCreate() {

    synchronized (sSyncAdapterLock) {

    if (sSyncAdapter == null)

    sSyncAdapter = new DatabaseSyncAdapter(getApplicationContext(), true);

    }

    } 

    @Override

    public IBinder onBind(Intent intent) {
        return null;
    }

}

清单中的条目:

 <service
    android:name="de.mydomain.myapp.util.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>

<provider
    android:name="de.mydomain.myapp.util.StubProvider"
    android:label="SyncLabel"
    android:authorities="de.mydomain.myapp.provider"
    android:exported="false"
    android:syncable="true" />

我还有一个StubProvider类,但它只是Google的StubProvider示例。所有这些都是标准代码,但是当我调用ContentResolver.requestSync(...)时没有任何反应。我甚至不会收到错误,我知道,我必须更改我的Logcat过滤器以查看所有日志。我可以在实例化DatabaseSyncAdapter时看到日志。我确实使用常量来确保我的权限和我的帐户类型始终相同,并使用正确的参数调用requestSync。

非常感谢你的帮助,我不知道我的问题在哪里:/

1 个答案:

答案 0 :(得分:0)

对我来说这是一个非常类似的问题。对于遇到此问题的其他人:

if(intent.getAction().equals(Intent.ACTION_SYNC)) { //Do not do this!!!!
    // Return the communication channel to the service.
    return sSyncAdapter.getSyncAdapterBinder();
} else {
    return null;
}

所传达的意图没有我检查过的动作。而是android.content.SyncAdapter。 因此删除if子句解决了问题。