gpt4 book ai didi

Android:了解将一个 IntentService 用于多个操作

转载 作者:太空宇宙 更新时间:2023-11-03 12:37:42 26 4
gpt4 key购买 nike

我有一个问题,在特定的 Activity 流程下, Intent 没有被传送到 IntentService:这是场景:

  1. 考虑 3 个 Activity ,Home、B 和 C。C 有 2 个 fragment CF1 和 CF2。
  2. B、CF1 和 CF2 使用相同的 IntentService 类但具有不同的操作。
  3. IntentService 使用 startService(Intent) 开始。 ( fragment 的 getActivity().startService(Intent))
  4. 无论 IntentService 在何处启动,如果它正在 Activity/Fragment 的 onStop() 中运行,我都会确保使用 stopService(intent) 停止它。
  5. 如果 Activity 流程是 Home -> C -> CF1 ->CF2,一切正常。
  6. 如果 Activity 流是 Home -> B -> C -> CF1 -> CF2,则在 CF2 的 startService(Intent) 之后永远不会调用 onHandleIntent。处理 B 和 CF1 Intent 。为了调试,我尝试等待 IntentService 在 Activity B 中完成,然后转到 CF1 -> CF2,仍然是同样的问题。 CF1 在启动相同的 Intent 服务时似乎从来没有任何问题。当我尝试为 CF2 创建一个新的 IntentService 类时,它成功了。

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

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

AndroidManifest.xml

<service android:name=".service.ExampleIntentService" />

Activity 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)
}

fragment 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)
}

fragment 的代码完全相同,CF2

最佳答案

My understanding was... If the service is running for first time , onStartCommand is invoked (which we are not supposed to handle for IntentService). If the service is already running, onHandleIntent is invoked for every subsequent call of startService.

没有。 onStartCommand()每个 startService() 都被调用称呼。 onHandleIntent()每个 startService() 都被调用调用 IntentService ,除非你在 onStartCommand() 中做某事改变正常行为。

IntentService gets started using startService(Intent).

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

Wherever IntentService gets started, I make sure it gets stopped using stopService(intent)

这是一个非常糟糕的主意。 IntentService将在所有 startService() 时自行停止已处理调用,如 the documentation 中所述:

IntentService will receive the Intents, launch a worker thread, and stop the service as appropriate.

关于Android:了解将一个 IntentService 用于多个操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14925063/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com