如果活动栈为空,则启动主活动。

11

我有一个活动可以从其他几个活动启动,带有url过滤器意图。

在这个活动中,我使用操作栏中的主页图标作为返回按钮,将用户带回上一个活动(而不是“主页”操作)。目前,我通过调用finish()函数来实现这一点。当在应用程序内部工作时,这很好用。

然而,如果通过url过滤器意图启动该活动,则希望主页图标将用户带到主活动。显然,调用finish()将关闭该活动。

所以我的问题是,有没有办法检查我的应用程序堆栈是否为空,然后在真正的情况下启动主要活动?或者我是在错误的方式下进行攻击吗?

1个回答

17
如果您的应用程序通过URL意图过滤器启动并创建自己的任务,则可以使用以下方法:
if (isTaskRoot()) {
    // This activity is at root of task, so launch main activity
} else {
    // This activity isn't at root of task, so just finish()
}

编辑:添加了另一种可能的方法

如果您的应用程序通过URL意图过滤器启动时被启动到现有任务中,则可以执行以下操作:

当您从应用程序中的其他活动启动您的活动时,向意图添加EXTRA,如下所示:

Intent intent = new Intent(this, MyActivity.class);
intent.putExtra("internal", "true");
startActivity(intent);

当您的活动被启动时,它可以检查Intent中是否存在EXTRA,以确定它是通过内部启动还是通过URL意图过滤器启动的,如下所示:

Intent intent = getIntent();
if (intent.hasExtra("internal")) {
    // Launched internally
} else {
    // Launched via intent-filter
}

看起来是个不错的解决方案,但可悲的是它不起作用。isTaskRoot() 在两种情况下都返回false。我猜当它不启动新任务时也需要它工作(即应用程序已在后台运行?)。我无法理解活动/任务处理的逻辑。 - SveinT
1
编辑了我的答案以添加另一种方法,您可以使用该方法,因为您的活动显然已启动到现有任务中。 - David Wasser
当然,那应该可以工作,但我想肯定存在更简洁的解决方案吧?Gmail 应用和其他应用程序实现了类似的行为。无论如何,这样做就可以了。谢谢! - SveinT
1
还有其他方法。您可以声明具有URL意图过滤器的活动,如launchMode="singleTask",在这种情况下,您的活动将在新任务中启动,您可以使用我建议的第一种方法。或者,您可以声明一个不同的Activity,通过URL意图过滤器启动,以便您知道您来自哪里。 - David Wasser

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