5

プッシュ通知の受信時に UI の状態を更新しようとしています。これをAsyncTask行うには、いくつかのネットワーク操作を実行し、結果に基づいて UI を更新する を開始する必要があります。

のドキュメントによると、レシーバー内で非同期操作を実行することは安全ではありません。これは、そのプロセスに他の「アプリケーション コンポーネント」がないと仮定 BroadcastReceiverすると、それを実行しているプロセスが戻るとすぐに強制終了される可能性があるためです。onReceive()

BroadcastReceiver独自のプロセスで実行されていますか、それとも含まれているアクティビティと同じプロセスで実行されていますか? 更新する UI がある限り、タスクの完了のみを気にするのでAsyncTask、アクティビティが閉じられた場合に死ぬ心配はありません。BroadcastReceiver がアクティビティと同じプロセスにあると仮定すると、これにより、説明したタスクをレシーバー内から起動しても大丈夫/安全になりますか?

編集:

明確にするために、レシーバーをアクティビティonResume()に登録して登録解除しているonPause()ため、アクティビティが既にアクティブな場合にのみインテントを受信する必要があります。

4

4 に答える 4

6

ブロードキャスト レシーバーは独自のプロセスでは実行されておらず、UI スレッドで実行されています。

アプリで他のアクティビティやサービスが実行されていない場合にのみ、onReceive メソッドが返された後にプロセスが強制終了されます。

ブロードキャスト レシーバーが内部クラスのインスタンスであり、アクティビティがアクティブなときにのみ受信する場合、onReceive メソッドが返された後にプロセスが強制終了されることはありません。

于 2012-07-28T02:23:19.137 に答える
1

内にAsyncTaskコンテキストが必要な場合は、サービスの方が優れていると思います。そうでない場合は、使用に問題はありませんAsyncTask

于 2012-07-28T16:11:42.637 に答える
1

Honeycomb (API11) 以前は、サービスを使用する必要がありました。

Honeycomb (API11) 以降、goAsync()を使用できます。

これは、アプリケーションが onReceive(Context, Intent) で呼び出して、その関数から戻った後もブロードキャストをアクティブに保つことができます。これは、ブロードキャストに比較的応答する (10 秒以内に終了する) という期待を変えるものではありませんが、ディスク IO によるメイン UI スレッドの不具合を回避するために、実装がそれに関連する作業を別のスレッドに移すことを可能にします。

于 2014-03-16T07:40:04.960 に答える
0

私がお勧めするのはstartActivity(intent)、放送受信機からです。それで全部です。あなたが話しているイベント情報を提供する意図の中で、バンドルにパラメーターを設定するだけです。onStart()その後、アクティビティ内またはonCreate()呼び出された方でこれを調べることができます。旗がそこにあれば、ActivityキックオフからAsyncTask.

サービス アクティビティによるすべてのバインディングと通信の制限があるため、サービスを使用する必要はまったくありません。

あなたもできることを忘れないでくださいstartActivityForResult()。ブロードキャスト レシーバー内でパス アンド フォワード以外は何もしたくないと思います。

ところで、アクティビティに UI は必要ありません。顔のない活動があるかもしれません。

于 2012-07-28T03:09:00.050 に答える