У меня проблема с тем, что намерение не доставляется IntentService
в рамках определенного потока действий: это сценарий:
- Рассмотрим 3 действия, Home, B и C. C имеет 2 фрагмента CF1 и CF2.
- B, CF1 и CF2 используют один и тот же класс IntentService, но с разными действиями.
- IntentService запускается с использованием
startService(Intent)
. (getActivity().startService(Intent) для фрагментов) - Когда IntentService запускается, я убеждаюсь, что он останавливается с помощью
stopService(intent)
, если он работает в Activity/FragmentonStop()
. - Если поток активности Home -> C -> CF1 -> CF2, все работает.
- Если поток действий Home -> B -> C -> CF1 -> CF2, то
onHandleIntent
никогда не вызывается после startService(Intent) из CF2. Намерения B и CF1 обрабатываются. Для отладки я попытался дождаться завершения IntentService в действии B, а затем перейти к CF1 -> CF2, но все та же проблема. У CF1 никогда не бывает проблем с запуском той же службы намерений. Когда я попытался создать новый классIntentService
для CF2, это сработало.
Насколько я понимаю, у IntentService есть очередь для намерений. Если служба запускается в первый раз, вызывается onStartCommand (который мы не должны обрабатывать для IntentService). Если служба уже запущена, onHandleIntent вызывается для каждого последующего вызова startService.
Очевидно, я делаю что-то не так, но не ясно, что именно. Я пытался изучить другие вопросы о стеке, но не помог. Код, который я использую, довольно прост:
AndroidManifest.xml
<service android:name=".service.ExampleIntentService" />
Действие Б
@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