は、私は行われる必要があるいくつかのタスクを実行IntentServiceをトリガーBroadcastReceiverを設定することが冗長になることを意味
だけではなく、必ずしも冗長ではない、それは非常に一般的であるということですパターン。
この解釈は正しいですか?
号
それは間違っていたときの例を与えてください。
Intent
はsendBroadcast()
またはstartService()
と一緒に使用されますか。 Intent
をsendBroadcast()
と一緒に使用すると、サービスが直接応答することはできません。同様に、Intent
をstartService()
と一緒に使用すると、受信者が直接応答することはできません。したがって、誰かがIntent
を使用するコードを書いた場合、そのコードの使用方法に合わせる必要があります。 Intent
が使用されている一方的に「チャンネルを変更する」ことはできません。
さらに、BroadcastReceiver
のonReceive()
は、常にメインアプリケーションスレッドで呼び出されます。 UIがフォアグラウンドにあるとUIがフリーズしてしまうので、ここで意味のある時間を取ることは望ましくありません。また、onReceive()
が返されると、マニフェストに登録された受信者のインスタンスは破棄され、その後すぐにプロセスが終了する可能性があります。したがって、BroadcastReceiver
が独自のバックグラウンドスレッドをフォークするのは安全ではありません。アンドロイドはそのスレッドを無視してプロセスを終了させるからです。システムが送信するブロードキャストに応答するための一般的なパターンは、BroadcastReceiver
を使用してから、IntentService
に作業を委任することです。一挙では、両方の問題を解決する:
IntentService
は、それがその仕事をしながら実行してもOSに通知します持つ、Service
であるため、バックグラウンドスレッド
- に呼び出され、
onHandleIntent()
での力仕事を行いますあなたがIntent
を作成一つであり、あなたがそのIntent
を派遣一つであり、あなたがそのIntent
を消費一つであり、あなたがあなたのコードの使用を持つようにしたい場合は、あなたのプロセスは、今より長く
ながら少し生きるようにするにはstartService()
を直接呼び出してIntentService
を呼び出すと、それは完璧です。