解决方案: 我忘了在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。
非常感谢你的帮助,我不知道我的问题在哪里:/
答案 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子句解决了问题。