0

startService(service)を使用して BroadcastReceiver から開始される IntentService があります。BroadcastReceiver で新しい情報を取得すると、新しい情報はstartService(service)のインテントを介して IntentService に再度プッシュされますが、その後サービスが再開されます。これを防ぐことはできますか?新しい情報を言い換えずに IntentService にプッシュしたい。

4

2 に答える 2

1

インテントサービスは、インテントで開始され、ジョブを実行して終了することを目的としています。この観点からは、これらは非同期タスクに似ています。これが、インテントサービスが再起動する理由です。

onHandleIntentいくつかの作業を行って終了する必要があります。いくつかのトリックを実行してブロックすることもできますが、それはインテント サービスの性質に反します。

あなたがすべきことは、古典的なサービスを持つことです。ANR エラーが発生している場合は、スレッド内またはサービス自体内でホストされている asynctask 内で、時間のかかる操作をすべて実行する必要があります。

于 2013-03-18T21:37:12.173 に答える
0

サービス内で後続のインテントを処理するために、何らかの状態を共有する必要があると思います。2 つの解決策があります。

  1. IntentService を使用し、onHandleIntent 内でこの状態を保存して復元します。
  2. 開始された Service を使用し、この状態を Service クラス内のフィールドとして保持します。ANR を防ぐには、 IntentServiceと同様に、UI スレッドの外で Intent を処理します。サービスを実行し続けるには、 handleMessage からstopSelf呼び出しを削除するだけです

処理された各インテントの状態を復元して保存することができる場合は、最初のソリューションがより安全です。これは、メモリが不足した場合にサービスが OS によって強制終了される可能性があるためです。

于 2013-03-18T21:22:50.050 に答える