Android 如果活动堆栈为空,则启动主活动

Android 如果活动堆栈为空,则启动主活动,android,android-activity,Android,Android Activity,我有一个活动可以从其他几个活动中启动,还有url筛选器意图 在这个活动中,我使用actionbar中的home图标作为后退按钮,使用户返回到上一个活动(而不是“home”操作)。现在我通过调用finish()函数来实现这一点。当从应用程序内部工作时,这可以很好地工作 但是,如果通过url过滤器启动活动,我希望主图标将用户带到主活动。显然,调用finish()只会关闭活动 所以我的问题是,有没有一种方法可以检查我的应用程序堆栈是否为空,如果为真,则启动主活动?还是我的攻击方式不对?如果您的应用程序

我有一个活动可以从其他几个活动中启动,还有url筛选器意图

在这个活动中,我使用actionbar中的home图标作为后退按钮,使用户返回到上一个活动(而不是“home”操作)。现在我通过调用finish()函数来实现这一点。当从应用程序内部工作时,这可以很好地工作

但是,如果通过url过滤器启动活动,我希望主图标将用户带到主活动。显然,调用finish()只会关闭活动


所以我的问题是,有没有一种方法可以检查我的应用程序堆栈是否为空,如果为真,则启动主活动?还是我的攻击方式不对?

如果您的应用程序是通过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意向过滤器启动时启动到现有任务中,则您可以执行以下操作:

当您从应用程序中的其他活动启动活动时,请向意图中添加以下内容:

Intent intent = new Intent(this, MyActivity.class);
intent.putExtra("internal", "true");
startActivity(intent);
Intent intent = getIntent();
if (intent.hasExtra("internal")) {
    // Launched internally
} else {
    // Launched via intent-filter
}
当您的活动启动时,它可以检查意图中是否存在额外的内容,以确定它是在内部启动的还是通过URL意图过滤器启动的,如下所示:

Intent intent = new Intent(this, MyActivity.class);
intent.putExtra("internal", "true");
startActivity(intent);
Intent intent = getIntent();
if (intent.hasExtra("internal")) {
    // Launched internally
} else {
    // Launched via intent-filter
}

这似乎是一个很好的解决方案,但遗憾的是它不起作用。isTaskRoot()在这两种情况下都返回false。我想我需要它在不启动新任务的情况下工作(例如,应用程序已经在后台运行了?)。我不能对活动/任务处理了如指掌..编辑了我的答案,添加了另一种你可以使用的方法,因为你的活动显然是启动到现有任务中的。这当然会起作用,但我认为存在一个更干净的解决方案?Gmail应用程序和其他应用程序实现了类似的行为。无论哪种方式,都必须这样做。非常感谢。还有其他方法。您可以将具有URL意图筛选器的活动声明为
launchMode=“singleTask”
,在这种情况下,您的活动将在新任务中启动,您可以使用我建议的第一种方法。或者,您可以声明通过URL意图过滤器启动的不同活动,以便知道您来自何处。