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在哪里启动,如果它在Activity/Fragment的onStop()中运行,我都会确保它使用stopService(intent)停止
  5. 如果活动流程为Home->C->CF1->CF2,则一切正常
  6. 如果活动流为Home->B->C->CF1->CF2,则在从CF2启动Service(Intent)之后,永远不会调用onHandleIntent。B和CF1意图被处理。对于调试,我尝试在活动B中等待IntentService完成,然后转到CF1->CF2,仍然存在相同的问题。CF1在启动相同的意向服务时似乎从未遇到任何问题。当我尝试为CF2创建一个新的IntentService类时,它成功了

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

很明显,我做错了什么,但不清楚是什么。我试着去研究其他的stackerflow问题,但没有帮助。我使用的代码非常简单:

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

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

没有。对于每个CCD_ 8调用都调用CCD_。除非您在onStartCommand()中做了一些更改正常行为的操作,否则对IntentService的每次startService()调用都会调用onHandleIntent()

IntentService使用startService(Intent)启动。

您可以使用startService()IntentService发送命令。

无论IntentService在哪里启动,我都会使用stopService(intent)确保它停止

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

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

最新更新