5

サーバーとのバックグラウンド同期を実行する Android のアプリを開発しています (SyncAdapter や認証などを使用)。

フォアグラウンド アプリ (UI 付き) が開始されると、バックグラウンド同期が進行中か、オプションで UI ボタン​​を介して同期が開始される場合があります。

進行中のバックグラウンド同期 (システムによって開始されたか、定期的な同期設定または UI によって開始されたか) に「プラグイン」し、フォアグラウンド アクティビティで進行状況を表示する方法が必要です。

ContentResolver のドキュメント (http://developer.android.com/reference/android/content/ContentResolver.html) には、javadoc へのリンクがなく、文書化されていない (私が見つけた) 謎の「SyncObserver」について言及されています。

それについて言及している他のページがいくつかあります(http://www.chinaup.org/docs/migrating/m5-0.9/changes/android.content.ContentResolver.html)が、それについて詳しく知ることはできません。

誰かがこの獣を実装しましたか?

そうでない場合、フォアグラウンド アクティビティでのバックグラウンド同期の進行状況を追跡するためのサンプル コードまたは推奨事項はありますか?

4

2 に答える 2

5

答えてくれてありがとう。

バックグラウンド同期の非同期の性質により、アプリ (アクティビティ) は、既に進行中のバックグラウンド同期で開始される可能性があります。これは、設定に保存されているステータスで検出されます。

私が行ったことは、SyncStatusObserver インターフェイスを実装する SyncObserver クラスを実装し、中断/再開時に作成/破棄することです。

syncObserverHandle = ContentResolver.addStatusChangeListener( ContentResolver.SYNC_OBSERVER_TYPE_ACTIVE, new SyncObserver() );

これにより、同期に関連するイベント(保留中、開始済みなど)が通知され、次を使用してステータスも確認します

ContentResolver.isSyncActive();

このための Android API は非常に基本的なものであり、UI スレッドで何が行われ、何が行われないかについてのルールを尊重する必要がありますが、誰かが私の実装を見たい場合は、質問を投稿してそれを指摘してください。喜び。

于 2011-06-06T14:41:43.697 に答える
3

私はこれと同じ問題を抱えていたので、1) SyncAdapter からのブロードキャストと、2) SharedPreferences を使用してステータスを示すことを組み合わせて実装することになりました。

SyncAdapter では、このようなもの:

public static final String START_SYNC = "com.whatever.sync.start";
public static final String STOP_SYNC = "com.whatever.sync.stop";
public static final String SYNC_PROGRESS = "syncProgress";


public void onPerformSync(Account account, Bundle extras, String authority,
    ContentProviderClient provider, SyncResult syncResult) {

        // Add an integer to the shared settings to indicate the status
        SharedPreferences settings = mContext.getSharedPreferences(Constants.PREFS, 0);
        SharedPreferences.Editor editor = settings.edit();
        editor.putInt(SyncAdapter.SYNC_PROGRESS, 0);
        editor.commit();

        Intent intent = new Intent();
        intent.setAction(START_SYNC);
        mContext.sendBroadcast(intent);


        //... do some stuff, setting SYNC_PROGRESS to other values and
        // sending more broadcasts as the state changes

        // When we are done, remove the "in progress" setting and store some
        // other data
        editor.putString(SyncAdapter.LAST_UPDATED, new Date().toString());
        editor.remove(SyncAdapter.SYNC_PROGRESS);
        editor.commit();

        Intent stopIntent = new Intent();
        stopIntent.setAction(STOP_SYNC);
        mContext.sendBroadcast(stopIntent); 
      }

このアクティビティでは、再開時に 2 つのことを行います。1) 同期が現在進行中であるかどうかの共有設定を確認します。2) 受信機でブロードキャストをリッスンするように登録します。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
// .. do some UI stuff

    mReceiver = new SyncReceiver(this);
}

@Override
public void onResume() {
    super.onResume();

    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction(SyncAdapter.START_SYNC);
    intentFilter.addAction(SyncAdapter.STOP_SYNC);
    registerReceiver(mReceiver, intentFilter);  

    showProgress();
}

public void showProgress() {
    SharedPreferences settings = getSharedPreferences(Constants.PREFS, 0);
    if (settings.contains(SyncAdapter.SYNC_PROGRESS)) {
        // ... set the UI to show that a sync is in progress
    } else {
        // ... set the UI to show that a sync is NOT in progress
    }
}

private class SyncReceiver extends BroadcastReceiver {

    private MyActivity mActivity;

    public SyncReceiver(MyActivity activity) {
        mActivity = activity;
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(SyncAdapter.START_SYNC)) {
            Log.i("@string/app_name", "Started sync");
            mActivity.showProgress();
        }
        else if (intent.getAction().equals(SyncAdapter.STOP_SYNC)) {
            Log.i("@string/app_name", "Started sync");
            mActivity.showProgress();
        }
    }
}

これは私にとってはうまくいくようです。ブロードキャストの非同期性のために、これにはいくつかの潜在的な問題があると感じていることを認めなければなりません。私のアプローチを改善するための意見をいただければ幸いです。

于 2011-05-25T03:28:43.097 に答える