0

さまざまな場所 (アプリのアクティビティとバックグラウンド サービス) から非同期 HTTP 要求を行うアプリケーションがあります。メイン アクティビティ内で応答イベントをキャッチし、いくつかのビューを変更したいと考えています。これは、メイン アクティビティ内で匿名クラス BroadcastReceiver を使用することによって実現されます。ブロードキャストレシーバーの登録/登録解除はonResume()/内にありonPause()ます。

問題は、画面がオフで、アクティビティがフォアグラウンドにない場合、レシーバーが登録されていないため、イベントがキャッチされないことです。BroadcastReceiverの登録/登録解除の一貫性を維持しながら、バックグラウンドでもすべてのイベントをキャッチする方法は?

4

3 に答える 3

2

ここでの最善の策は、永続的なバックグラウンド サービスを開始することです (ローカル ブロードキャスト レシーバーを使用)。

ここにいくつかの出発点があります:

  • あなたのサービスonStartCommand()はすべきreturn START_STICKYなので、OSによって殺されることはありません。
  • ブロードキャスト レシーバを保持する Service 内にローカル変数を作成し、このレシーバをonStart()に登録し、 で登録解除する必要がありonDestroy()ます。
  • 適切であると判断した場合はいつでもサービスを開始します (たとえばonCreate()、アプリケーションのライフサイクルごとに 1 回だけ呼び出され、特定のアクティビティに関連付けられていないため)。

この答えが役立つかもしれません。

画面がオフになると、 onPause 信号がすべてのアクティビティに送信され、ローカルブロードキャストレシーバーが自動的に登録解除されるため、既存のアプローチは機能しません (そうあるべきです)。

于 2016-01-08T12:15:51.330 に答える
1

2つの選択肢があります

  1. サービスを実行し、代わりに受信者を登録します。

  2. マニフェストにブロードキャスト レシーバーを登録し、そこで処理できます。レシーバーはメイン スレッドで実行されることに注意してください。そのため、実行中のサービス (おそらく単一のタスクを実行するサービス) に通知する必要があります。

単一のタスクを実行するサービスは、IntentServiceを使用して実装できます。これは、サービスにラップされた非同期タスクのようなものです。

于 2016-01-08T12:07:26.837 に答える
0

EventBus libを追加して問題を解決しました。ハンドラーはメイン アクティビティ内に実装され、アクティビティは でイベントをサブスクライブし、 でサブスクライブをonCreate()解除しonDestroy()ます。EventBus lib は標準の Java コンポーネントに基づいて構築されているため、ガベージ コレクターがonDestroy()呼び出されなくても自動的にすべてをクリーンアップすることを期待しています。

さらにWeakReference、予期しないエラーを防ぐために、アクティビティが既に破棄されているかどうかを確認できるビューに使用しました。

これは最善の解決策ではないかもしれませんが、今のところ機能しており、他の提案された回答よりも実装がはるかに簡単です。

于 2016-01-08T17:02:50.797 に答える