我按照此标题Why does ContentResolver.requestSync not trigger a sync?,但同步方法未出现在设置屏幕中的帐户和同步中。我认为没有调用 onPerformSync()。我尝试调试但没有找到错误日志。这是我的代码:
syncAdapter.xml
<sync-adapter xmlns:android="http://schemas.android.com/apk/res/android"
android:accountType="@string/ACCOUNT_TYPE"
android:contentAuthority="@string/AUTHORITY"
android:userVisible="true"
android:isAlwaysSyncable="true"
/&GT;
SyncService.java
public class CalendarSyncService extends Service{
private static SyncAdapterImpl sSyncAdapter = null;
private static String list_event_ids;
private static Requestor requestor;
public void onCreate(){
super.onCreate ();
if (sSyncAdapter == null)
sSyncAdapter = new SyncAdapterImpl(this);
}
@Override
public IBinder onBind(Intent arg0) {
// TODO Auto-generated method stub
return sSyncAdapter.getSyncAdapterBinder();
}
public class SyncAdapterImpl extends AbstractThreadedSyncAdapter {
Context context;
public SyncAdapterImpl(Context context) {
super(context, true);
// TODO Auto-generated constructor stub
this.context = context;
}
@Override
public void onPerformSync(Account arg0, Bundle arg1, String arg2,
ContentProviderClient arg3, SyncResult arg4) {
// TODO Auto-generated method stub
Log.e("thuutai", "Perform Sync Call");
try {
CalendarSyncService.performSync(context);
} catch (DOMException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserConfigurationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (SAXException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ParserException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
我在这里打电话
public void onClick(View arg0) {
Bundle params = new Bundle();
params.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, false);
params.putBoolean(ContentResolver.SYNC_EXTRAS_DO_NOT_RETRY, false);
params.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, false);
ContentResolver.addPeriodicSync(selectedAccount, getString(R.string.AUTHORITY), params, 3600);
ContentResolver.setSyncAutomatically(selectedAccount, getString(R.string.AUTHORITY), true);
ContentResolver.requestSync(selectedAccount, getString(R.string.AUTHORITY), params);}
的Manifest.xml
<service android:name=".service.CalendarSyncService" 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>
我在Nexus S Android 4.0中测试过。 感谢您的阅读!
答案 0 :(得分:8)
由于正在进行类似的同步,有时不会调用此方法。您可以使用以下代码进行检查并取消:
if (ContentResolver.isSyncPending(yourAccount, yourAuthority) ||
ContentResolver.isSyncActive(yourAccount, yourAuthority)) {
Log.i("ContentResolver", "SyncPending, canceling");
ContentResolver.cancelSync(yourAccount, yourAuthority);
}
答案 1 :(得分:1)
您可以尝试的是:
ContentResolver.setSyncAutomatically(account, AUTHORITY, true);
我尝试设置isAlwaysSyncable
标记,但它对我不起作用(尽管这可能是另一个问题)。
答案 2 :(得分:-1)
您必须强制手动同步。
Bundle params = new Bundle();
params.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
params.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
ContentResolver.requestSync(selectedAccount, getString(R.string.AUTHORITY), params);