1

ブロードキャストインテントの順序は保証されていますか? つまり、もしそうなら、

sendBroadcast(intent1);
sendBroadcast(intent2);

レシーバーはインテント 2 の前にインテント 1 を取得することが保証されていますか? これに対する答えはノーだと思いますが、その場合、問題を解決する方法がよくわかりません。

デバイスがネットワーク上で話しているときにビジー状態を示し、ネットワーク通信が完了すると消えるアプリの「ビジー」インジケーターを作成しようとしています。すべてのネットワーク通信はインテント サービスで行われます。

これでの私の試みは、サービスでネットワーク通信を開始するときに BUSY_START インテントを送信し、ネットワーク通信が終了するときに BUSY_STOP を送信することでした。これはほとんど機能しているようですが、停止メッセージと開始メッセージの順序が間違っていることが時々あります。

この問題を解決するより良い方法はありますか?

ビジー インテントごとに ID を追加して、ペアリングできるようにしようと考えています。そうすれば、すでにストップを受け取ったスタートを受け取った場合、それを無視できます。または、おそらくもっと簡単に、整数のシーケンス番号を各ブロードキャストに追加します。現在のインテントのシーケンスが最後に受信したインテントのシーケンスよりも少ないブロードキャストを受信した場合は、無視してください。

4

2 に答える 2

0

Handlerオブジェクトを使用してバックグラウンドスレッドから通信することを検討しましたIntentServiceか?アプローチに対するハンドラーの利点は、ハンドラーがBroadcastReciverメッセージキューを使用してメッセージオブジェクトをシーケンス処理することです。

(私はあなたのサービスがアプリのメインスレッドと同じプロセスにあると仮定しています)。

于 2012-06-22T01:00:08.217 に答える
0

インテントに代わる実行可能な方法の少なくとも 1 つは、アプリケーション クラスを介してメッセージングを実行することです。

  1. リスナー インターフェイスを作成する
  2. アプリケーション内のリスナー オブジェクトのコレクションを管理する / リスナーを追加 / 削除するメソッドを提供する
  3. 関心のあるエンティティは、アプリケーション メソッドを呼び出して、リスナーとして自分自身を追加/削除します
  4. 登録された各リスナーで適切なリスナー インターフェイス メソッドを呼び出す「通知」メソッドをアプリケーションに追加します。
  5. サービスは、アプリケーションの通知メソッドを呼び出して、

例えば、

public class MyApplication extends Application {
  public interface MyListener {
    void onEvent();
  }

  private Set<MyListener> listeners = new HashSet<Listener>();

  public void addListener(MyListener l) {
    listeners.add(l);
  }

  public void removeListener(MyListener l) {
    listeners.remove(l);
  }

  public void sendEvent() {
    for (MyListener l: listeners) { l.onEvent(); }
  }
}

さて、アクティビティ (またはフラグメント) から、

public class MyActivity extends Activity implements MyListener {
    ...
    ...
    ...

    @Override
    public void onEvent() {
      // do something
    }

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

        ((MyApplication)getApplication()).addListener(this);
    }

    @Override
    protected void onPause() {
        super.onPause();

        ((MyApplication)getApplication()).removeListener(this);
    }
}

そしてあなたのサービスでは、

((MyApplication)getApplication()).sendEvent();

これにより、インテントや静的変数を使用せずに同期メッセージングが提供されます。

于 2012-06-25T20:32:40.247 に答える