同期アダプターを実装しましたが、アクティビティが終了したときにコールバックを取得したいと思います。 _ContentResolver.addStatusChangeListener
_ を使用してみましたが、同期が保留中/アクティブの場合にのみコールバックを受け取ります。これが私の活動からのいくつかの関連するコードです:
_@Override
protected void onResume() {
super.onResume();
final int mask = ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE | ContentResolver.SYNC_OBSERVER_TYPE_PENDING;
syncObserverHandle = ContentResolver.addStatusChangeListener(mask, syncStatusObserver);
}
@Override
protected void onPause() {
super.onPause();
if (syncObserverHandle != null) {
ContentResolver.removeStatusChangeListener(syncObserverHandle);
syncObserverHandle = null;
}
}
private SyncStatusObserver syncStatusObserver = new SyncStatusObserver() {
@Override
public void onStatusChanged(int which) {
AccountManager am = AccountManager.get(TodosActivity.this);
Account a = am.getAccountsByType(Const.ACCOUNT_TYPE)[0];
Log.d(Const.TAG, "Sync status changed: " + which);
if (!ContentResolver.isSyncActive(a, DataProvider.AUTHORITY) &&
!ContentResolver.isSyncPending(a, DataProvider.AUTHORITY)) {
Log.d(Const.TAG, "Sync finished, should refresh nao!!");
}
}
};
_
ただし、if
メソッドのonStatusChanged
は決して有効ではありません。この例は JumpNote demo から取ったもので、おそらくonResume()
で手動でも呼び出されるために機能するため、によって呼び出されることはおそらくありません。同期が終了したときのシステム。それともそれで、私は何か間違ったことをしていますか? logcatで取得するものは次のとおりです。
_D/MYAPP (10903): Sync status changed: 2
D/MYAPP (10903): Sync status changed: 2
D/MYAPP (10903): Sync status changed: 4
D/MYAPP (10981): --> DataSyncAdapter.onPerformSync()
D/MYAPP (10981): <-- DataSyncAdapter.onPerformSync()
D/MYAPP (10903): Sync status changed: 4
_
したがって、私はcould 2番目の_SYNC_OBSERVER_TYPE_ACTIVE
_(4)ステータスの変更に依存してデータを更新しているようですが、それは本当に醜い。何か案は?
私が見つけた解決策の1つは、ContentResolver
を完全に捨てて、独自のブロードキャストを実装することです。基本的に、これを同期アダプターのonPerformSync
の最後に追加します。
Intent i = new Intent(SYNC_FINISHED);
sendBroadcast(i);
そしてこれは活動の中で:
@Override
protected void onResume() {
super.onResume();
registerReceiver(syncFinishedReceiver, new IntentFilter(DataSyncService.SYNC_FINISHED));
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(syncFinishedReceiver);
}
private BroadcastReceiver syncFinishedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
Log.d(Const.TAG, "Sync finished, should refresh nao!!");
}
};
これは問題なく機能しているようですが、同期が終了したときに直接通知するものをSDKで見つけたいと思っていました。
奇妙なことに、それは私にとってはうまくいきます。
私のActivity
には、次のものがあります。
@Override
protected void onPause() {
super.onPause();
ContentResolver.removeStatusChangeListener(mContentProviderHandle);
}
@Override
protected void onResume() {
super.onResume();
mContentProviderHandle = ContentResolver.addStatusChangeListener(
ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE, this);
}
@Override
public void onStatusChanged(int which) {
AccountManager accountManager = AccountManager.get(this);
Account[] accounts = accountManager
.getAccountsByType(AuthenticatorActivity.PARAM_ACCOUNT_TYPE);
if (accounts.length <= 0) {
return;
}
updateRefresh(ContentResolver.isSyncActive(accounts[0],
MyContentProvider.AUTHORITY));
}
// Since onStatusChanged() is not called from the main thread
// I need to update the ui in the ui-thread.
private void updateRefresh(final boolean isSyncing) {
runOnUiThread(new Runnable() {
@Override
public void run() {
if (isSyncing) {
mRefreshMenu.setActionView(R.layout.menu_item_refresh);
} else {
mRefreshMenu.setActionView(null);
}
}
});
}
私は似たような作業をしていて、onStatusChanged関数の最後にもう1つのLog.dがあり、実行されていませんでした。
したがって、15分間のデバッグとエラーの試行の後、READ_SYNC_STATS権限を追加する必要があることに気付きましたが、すでにGET_ACCOUNTS権限を持っています。ですから、あなたが正しい許可を得ていることを確認してください。「if」が真にならないということではなく、常にベイルするということです。