Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android launchmode=";“单一任务”;没有按预期工作_Android - Fatal编程技术网

Android launchmode=";“单一任务”;没有按预期工作

Android launchmode=";“单一任务”;没有按预期工作,android,Android,我有一个在后台运行的应用程序,并通过通知系统显示错误消息。此通知有一个悬而未决的内容,可引导回应用程序的主屏幕。在这个主屏幕上,我设置了launchmode=“singleTask”。正如我在《Android开发指南》中所理解的,这意味着我的主要活动将只有一个实例 但是,如果用户当时正在查看该活动(或应用程序中的另一个活动),并触摸通知以清除该活动,它会继续并将该活动的另一个副本放在堆栈上,因此如果我点击“后退”按钮,它将再次返回主屏幕(从主屏幕) 它为什么会这样做?在问题中,你几乎回答了你自己

我有一个在后台运行的应用程序,并通过通知系统显示错误消息。此通知有一个悬而未决的内容,可引导回应用程序的主屏幕。在这个主屏幕上,我设置了launchmode=“singleTask”。正如我在《Android开发指南》中所理解的,这意味着我的主要活动将只有一个实例

但是,如果用户当时正在查看该活动(或应用程序中的另一个活动),并触摸通知以清除该活动,它会继续并将该活动的另一个副本放在堆栈上,因此如果我点击“后退”按钮,它将再次返回主屏幕(从主屏幕)


它为什么会这样做?

在问题中,你几乎回答了你自己的问题;)

尝试使用:

android:launchMode="singleInstance"
不过,请注意,如果您正在执行startActivityForResult之类的操作,您将永远不会收到结果

更新:

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

public void onNewIntent(Intent intent)
{
    super.onNewIntent(intent);
    setIntent(intent);
}
这会将使用getIntent()时应用程序返回的意图更改为传递给onNewIntent的新意图。

检查的文档


我遇到了一个类似的问题,并用android:launchMode=“singleInstance”解决了它。我觉得如果用户选择通知,您需要以下行为:

  • 如果应用程序已经在任务中运行,只需将该任务放到前台,并显示活动堆栈顶部的所有活动

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

如果这是您所追求的行为,那么您不需要(或想要)任何特殊的启动模式。见我对这个问题的回答:


这应该可以满足您的需要。

好吧,我继续尝试了singleInstance。不幸的是,它仍然以同样的方式运行。在再次查看文档之后,我想知道是否需要在我的主要活动中重写onNewIntent(),但我不知道该怎么做。Ogre-查看更新以了解有关使用onNewIntent()的信息,并查看Ok,因此我在阅读之后做了一些测试。结果证明它从来没有打过电话。因此,我能得出的唯一结论是,它根本不符合文档所说的功能。在本例中,我做的一件事是创建一个单独的函数来处理从getIntent()提取的bundle extras。事实上,这是相当令人沮丧的。基本上,我从onCreate()中获取了所有逻辑,并传入了Intent。现在可以从onCreate()或onNewIntent()调用此函数。这也是我的解决方案。当应用程序位于后台时,如何从服务返回到应用程序?@yanivtwin
Intent Intent=getPackageManager().getLaunchIntentForPackage(getPackageName());星触觉(意向)这将使任务从后台转到前台,如果应用程序尚未运行,则启动新应用程序。