Android:了解如何使用一个具有多个操作的IntentService

Pra*_*nna 3 android intentservice

我有一个问题,意图没有交付给IntentService特定的活动流程:这是场景:

  1. 考虑3个活动,Home,B和C.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,onHandleIntent则从CF2的startService(Intent)之后永远不会调用.处理B和CF1意图.为了调试,我尝试等待IntentService在Activity B中完成,然后转到CF1 - > CF2,仍然是同样的问题.CF1在启动相同的意向服务时似乎没有任何问题.当我尝试IntentService为CF2 创建一个新类时,它起作用了.

我的理解是IntentService有一个意图队列.如果服务第一次运行,则调用onStartCommand(我们不应该为IntentService处理).如果服务已在运行,则会为每次后续的startService调用调用onHandleIntent.

显然,我做错了什么但不清楚是什么.我试过调查其他stackoverflow问题,但没有帮助.我正在使用的代码非常简单:

AndroidManifest.xml中

<service android:name=".service.ExampleIntentService" />
Run Code Online (Sandbox Code Playgroud)

活动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)
}
Run Code Online (Sandbox Code Playgroud)

片段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)
}
Run Code Online (Sandbox Code Playgroud)

片段CF2的代码完全相同

Com*_*are 6

我的理解是......如果服务第一次运行,则调用onStartCommand(我们不应该为IntentService处理).如果服务已在运行,则会为每次后续的startService调用调用onHandleIntent.

onStartCommand()被每startService()通话.除非你做一些改变正常行为的事情,否则onHandleIntent()会调用每次startService()调用.IntentServiceonStartCommand()

IntentService使用startService(Intent)开始.

您将命令发送到IntentService使用startService().

无论IntentService何处开始,我都确保使用stopService(intent)停止它

这是一个非常糟糕的主意.在处理IntentService所有startService()调用后,它将自行停止,如文档所述:

IntentService将接收Intents,启动工作线程,并根据需要停止服务.

  • @Prasanna:使用`IntentService`背后的一点是因为你*希望*工作继续"如果用户正在远离活动".如果你不想这样做,不要使用`IntentService` - 只需使用一个线程. (2认同)