3

IntentService特定のアクティビティ フローでインテントが配信されないという問題があります。これはシナリオです。

  1. ホーム、B、C の 3 つのアクティビティを考えてみましょう。C には 2 つのフラグメント CF1 と CF2 があります。
  2. B、CF1、および CF2 は同じ IntentService クラスを使用しますが、アクションは異なります。
  3. IntentService は を使用して開始されstartService(Intent)ます。(フラグメントの getActivity().startService(Intent))
  4. IntentService がどこで開始さstopService(intent)れても、Activity/Fragment で実行されている場合は使用を停止するようにしonStop()ます。
  5. アクティビティ フローが Home -> C -> CF1 -> CF2 の場合、すべてが機能します。
  6. アクティビティ フローが Home -> B -> C -> CF1 -> CF2 の場合、CF2onHandleIntentからの startService(Intent) の後に呼び出されることはありません。B および CF1 インテントが処理されます。デバッグのために、アクティビティ B で IntentService が完了するのを待ってから、CF1 -> CF2 に移動しましたが、同じ問題が発生しました。CF1 は、同じインテント サービスを開始する際に問題があるようには見えません。CF2 用の新しいIntentServiceクラスを作成しようとしたところ、うまくいきました。

私の理解では、 IntentService にはインテントのキューがあります。サービスが初めて実行される場合、onStartCommand が呼び出されます (これは IntentService で処理することは想定されていません)。サービスがすでに実行されている場合は、以降の startService の呼び出しごとに onHandleIntent が呼び出されます。

明らかに、私は何か間違ったことをしていますが、何が何であるかは明確ではありません。他のスタックオーバーフローの質問を調べてみましたが、役に立ちませんでした。私が使用しているコードは非常に簡単です。

AndroidManifest.xml

<service android:name=".service.ExampleIntentService" />

アクティビティ B

@Override
public void onCreate(Bundle savedInstanceState)
{
       .......
       intent = new Intent(getApplicationContext(), ExampleIntentService.class);
       intent.setAction(StringConstants.ACTION_B);
       serviceRunning = true; //set to false in onReceiveResult 
       startService(intent);
}

@Override
public void onStop()
{
      if(serviceRunning && intent != null)
          stopService(intent)
}

フラグメント CF1

@Override
public void onResume()
{
    super.onResume();

    intent = new Intent(getActivity(), ExampleIntentService.class);
    intent.setAction(StringConstants.ACTION_CF1);
    serviceRunning = true; //set to false in onReceiveResult 
    startService(intent);
}

@Override
public void onStop()
{
      if(serviceRunning && intent != null)
          stopService(intent)
}

フラグメント、CF2 のコードはまったく同じです。

4

1 に答える 1

6

私の理解では...サービスが初めて実行されている場合、onStartCommandが呼び出されます(これはIntentServiceで処理することは想定されていません)。サービスがすでに実行されている場合は、以降の startService の呼び出しごとに onHandleIntent が呼び出されます。

onStartCommand()コールごとに番号が呼び出されstartService()ます。通常の動作を変更するために何らかの操作を行わない限り、onHandleIntent()が呼び出されるたびに がstartService()呼び出されます。IntentServiceonStartCommand()

IntentService は startService(Intent) を使用して開始されます。

IntentServiceを使用してコマンドを送信しますstartService()

IntentService がどこで開始されても、必ず stopService(intent) を使用して停止するようにします

それは非常に悪い考えです。ドキュメントに記載されているように、すべての呼び出しが処理されるIntentServiceと停止します。startService()

IntentService はインテントを受け取り、ワーカー スレッドを起動し、必要に応じてサービスを停止します。

于 2013-02-17T19:42:18.983 に答える