requestSync函数完成后收到通知

时间:2012-02-24 15:49:56

标签: android android-layout android-intent android-emulator android-widget

我尝试使用此代码以编程方式启动日历同步

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();

但系统在同步结束前退出循环,我仍然可以在状态栏看到同步标志,所以任何帮助,所以我可以在同步完成后读取日历事件??

感谢

4 个答案:

答案 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)

使用addStatusChangeListener实际上对我有用。

here's参考。

不要忘记添加所需的权限。

答案 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

      }

}
祝你好运!