IntentService
特定のアクティビティ フローでインテントが配信されないという問題があります。これはシナリオです。
- ホーム、B、C の 3 つのアクティビティを考えてみましょう。C には 2 つのフラグメント CF1 と CF2 があります。
- B、CF1、および CF2 は同じ IntentService クラスを使用しますが、アクションは異なります。
- IntentService は を使用して開始され
startService(Intent)
ます。(フラグメントの getActivity().startService(Intent)) - IntentService がどこで開始さ
stopService(intent)
れても、Activity/Fragment で実行されている場合は使用を停止するようにしonStop()
ます。 - アクティビティ フローが Home -> C -> CF1 -> CF2 の場合、すべてが機能します。
- アクティビティ フローが Home -> B -> C -> CF1 -> CF2 の場合、CF2
onHandleIntent
からの 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 のコードはまったく同じです。