Android中的launchmode="singleTask"无法按预期工作

15
我有一个运行在后台的应用程序,通过通知系统显示错误消息。该通知具有一个待定意图,可以返回到应用程序的主屏幕。在这个主屏幕上,我设置了launchmode="singleTask"。据我从Android开发指南中了解到,这意味着我的主活动只会有一个实例。
然而,如果用户在此时查看该活动(或应用程序中的另一个活动),并去点击通知以将其清除,它将继续在堆栈上放置该活动的另一份副本,因此如果我按下返回按钮,它将再次返回到主屏幕(从主屏幕)。
为什么会这样做呢?
3个回答

20

您在问题中已经接近回答自己的问题了 ;)

尝试使用:

android:launchMode="singleInstance"

需要注意的是,如果你正在使用类似于startActivityForResult的操作,那么你将永远无法接收到结果!

更新:

如果你想要使用onNewIntent来接收新的意图数据:

public void onNewIntent(Intent intent)
{
    super.onNewIntent(intent);
    setIntent(intent);
}

当你使用getIntent()获取onNewIntent方法传递的新intent时,它将会改变应用程序返回的意图。


4
好的,我前进并尝试了singleInstance。不幸的是,它仍然以相同的方式行为。 - Ogre
在重新查看了文档之后,我在想是否需要在我的主活动中覆盖onNewIntent()方法,但我不知道该让它做什么。 - Ogre
Ogre - 请查看有关使用onNewIntent()的更新信息,并参考Android“single top”启动模式和onNewIntent方法 - Scoobler
1
好的,我在阅读后进行了一些测试。结果发现它从未调用onNewIntent。所以我唯一能得出的结论就是它根本不像文档所说的那样运行。 - Ogre
在这种情况下,我所做的一件事是创建一个单独的函数来处理从getIntent()中提取的bundle extras。实际上它非常简单。基本上我从onCreate()中将所有的逻辑都提取出来,并传入Intent。现在可以从onCreate()或onNewIntent()中调用此函数。 - Joe Plante
这很奇怪,但它不起作用。对于Android R,您无法避免创建一个活动的多个实例。当您打开分析器时,您会看到N个实例,而singleInstance和singleTask并不能帮助解决它。如果你知道如何解决它,请跟我联系。 - Georgiy Chebotarev

3
请查看activity.launchmode文档。
我曾遇到类似问题,通过android:launchMode="singleInstance"解决。

这也是对我来说的解决方案。 - Rohit Sharma

2
我觉得你想要以下行为,如果用户选择通知:
  • 如果应用程序已在任务中运行,请将该任务置于前台,并显示位于活动堆栈顶部的任何活动。

  • 如果应用程序尚未在任务中运行,则在新任务中启动应用程序的主活动。

如果这是你想要的行为,你不需要(也不希望)任何特殊的启动模式。请参阅我对此问题的回答:Notification to restore a task rather than a specific activity? 这应该可以满足你的需求。

当应用程序在后台运行时,我该如何从服务返回到应用程序? - yanivtwin
1
@yanivtwin Intent intent = getPackageManager().getLaunchIntentForPackage(getPackageName()); startActivity(intent); 这将把任务从后台带到前台,或者如果应用程序尚未运行,则启动新的应用程序。 - David Wasser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接