3

我有一个问题,意图没有被传递到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 意图。为了调试,我尝试在Activity B中等待IntentService完成,然后转到CF1 -> CF2,仍然是同样的问题。CF1 在启动相同的意图服务时似乎从来没有任何问题。当我尝试IntentService为 CF2 创建一个新类时,它起作用了。

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

显然,我做错了什么,但不清楚是什么。我曾尝试研究其他 stackoverflow 问题,但没有帮助。我使用的代码非常简单:

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()调用 an时都会调用它IntentService,除非您采取onStartCommand()措施改变正常行为。

IntentService 使用 startService(Intent) 开始。

您将命令发送到IntentServiceusing startService()

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

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

IntentService 将接收 Intent,启动工作线程,并酌情停止服务。

于 2013-02-17T19:42:18.983 回答