我有一个问题,在特定的活动流下,我的意图没有被传递到IntentService
:这是一个场景:
- 考虑3个活动,Home、B和C.C有2个片段CF1和CF2
- B、 CF1和CF2使用相同的IntentService类,但具有不同的操作
- IntentService使用
startService(Intent)
启动。(片段的getActivity().startService(Intent)) - 无论IntentService在哪里启动,如果它在Activity/Fragment的
onStop()
中运行,我都会确保它使用stopService(intent)
停止 - 如果活动流程为Home->C->CF1->CF2,则一切正常
- 如果活动流为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,启动工作线程,并根据需要停止服务。