0

次の問題があります:

カスタムBroadcastReceiverを作成し、それをメインアクティビティonCreateハンドラーに登録します。

public class MainActivity extends ListActivity {
  private static final LogReceiver logReceiver = new LogReceiver();

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    LocalBroadcastManager.getInstance(this).registerReceiver(logReceiver, new IntentFilter(LogReceiver.ACTION_LOG));
  }
...
}

BroadcastReceiverクラス:

public class LogReceiver extends BroadcastReceiver {
  @Override
  public void onReceive(Context context, Intent intent) {
     Log.i("intent", "intent <-");
  }
}

次に、次のコードを使用して、ローカルサービスから複数のインテントを送信します。

Intent intent = new Intent(LogReceiver.ACTION_LOG).putExtra("log", logString);
localBroadcastManager.sendBroadcast(intent);
Log.i("intent", "intent ->");

ログは私には非常に奇妙に見えます:

  • 意図->
  • 意図<-
  • 意図->
  • 意図<-
  • 意図<-
  • 意図->
  • 意図<-
  • 意図<-
  • 意図<-
  • ..。

初めてLogReceiverが受信するインテントは1つだけで、これは正しいですが、次回は、送信されるよりも多くの等しいインテントを受信します。

プロジェクトでインテントアプローチから切り替えることができますが、なぜこれが発生するのか興味深いですか?

4

1 に答える 1

0

アクティビティの onDestroy でレシーバーの登録を解除する必要があります。さらに、このレシーバーが本当に静的である必要があるかどうかを確認する必要があります。

アプリケーション全体でレシーバーが必要な場合は、1 つのアクティビティではなく、別のシングルトン クラスまたはカスタム アプリケーション クラスに保存する必要があります。

その後、最初に開始されたアクティビティにレシーバーを登録できます。boolean registeredただし、LocalBroadcastManager に登録する前にチェックされるレシーバーにa を格納するなどして、一度だけ登録されるようにする必要があります。

于 2013-01-14T15:57:40.400 に答える