我尝试使用此代码以编程方式启动日历同步
Bundle bundle = new Bundle();
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_EXPEDITED, true);
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_FORCE, true);
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_MANUAL, true);
bundle.putBoolean(ContentResolver.SYNC_EXTRAS_IGNORE_SETTINGS, true);
ContentResolver.requestSync(accounts[0], "com.android.calendar", bundle);
我想要一种方式,这样我就可以知道同步完成时所以我可以从日历中读取数据 我试过这个
while (ContentResolver.isSyncActive(accounts[0], "com.android.calendar")) {
System.out.println("looping: " + i);
}
readLocalCalendar();
readLocalEvents();
但系统在同步结束前退出循环,我仍然可以在状态栏看到同步标志,所以任何帮助,所以我可以在同步完成后读取日历事件??
感谢
答案 0 :(得分:10)
另一个选择是注册一个广播接收器,告诉你同步完成的时间如下:
public class UpdateableActivity extends Activity {
public static final String ACTION_FINISHED_SYNC = "your.package.ACTION_FINISHED_SYNC";
private static IntentFilter syncIntentFilter = new IntentFilter(ACTION_FINISHED_SYNC);
private BroadcastReceiver syncBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// update your views
}
};
@Override
protected void onResume() {
super.onResume();
// register for sync
registerReceiver(syncBroadcastReceiver, syncIntentFilter);
// do your resuming magic
}
@Override
protected void onPause() {
unregisterReceiver(syncBroadcastReceiver);
super.onPause();
}
}
在SyncAdapter内部完成后使用此功能:
getContext().sendBroadcast(new Intent(UpdateableActivity.ACTION_FINISHED_SYNC));
您也可以在启动或更新同步状态时使用它;)
更新:更新了代码以避免泄漏并确保活动仍处于活动状态(onResume / onPause)
答案 1 :(得分:1)
答案 2 :(得分:0)
使用ContentResolver.addStatusChangeListener (int mask, SyncStatusObserver callback)
通知同步状态的变化。 docs
请不要永远循环,它的设计非常糟糕。使用上面的方法,一切都是异步的,所以你不要浪费任何cpu周期。
您还可以使用ContentResolver.registerContentObserver (Uri uri, boolean notifyForDescendents, ContentObserver observer)
docs通知特定URI的更改(例如日历的URI)
答案 3 :(得分:-3)
尝试AsyncTask:
private class CustomTask extends AsyncTask<Void, Void, Void>{
@Override
protected Void doInBackground(Void... params) {
// TODO sync your calendar
}
protected void onProgressUpdate(Void... progress) {
//TODO display a spinner or something else to show progress
}
protected void onPostExecute(Void t){
//TODO what you want when doInBackground has finished
}
}
祝你好运!