requestSync函数完成后收到通知

use*_*143 0 android android-widget android-emulator android-intent android-layout

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

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);
Run Code Online (Sandbox Code Playgroud)

我想要一种方式,所以我可以知道同步完成,所以我可以从日历中读取数据,我尝试这样做

while (ContentResolver.isSyncActive(accounts[0], "com.android.calendar")) {
System.out.println("looping: " + i);
}

readLocalCalendar();
readLocalEvents();
Run Code Online (Sandbox Code Playgroud)

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

谢谢

pab*_*sco 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();
    }
}
Run Code Online (Sandbox Code Playgroud)

在SyncAdapter内部完成后使用:

getContext().sendBroadcast(new Intent(UpdateableActivity.ACTION_FINISHED_SYNC));  
Run Code Online (Sandbox Code Playgroud)

您也可以在启动或更新同步状态时使用它;)

更新:更新代码以避免泄漏并确保活动仍处于活动状态(onResume/onPause)