点击启动图标时恢复上次活动

11

我发现大多数应用在点击启动器图标时都会恢复上次活动。然而,这似乎不是默认行为。在我的应用程序中,无论何时点击启动器图标,启动器活动始终会启动。

那么,我该如何配置我的应用程序,使其在已经运行时点击启动器图标后仍然恢复上次的活动呢?

6个回答

29

问题:

我不敢说这是一个错误,但自从第一个Android版本以来,这种行为就一直存在。当您从启动器启动应用程序时,在发布版本中存在任务和根任务的问题。您可以在此处找到相关的错误报告here

解决方案:

可以通过在启动器活动的onCreate中添加以下代码来解决该问题:

if (!isTaskRoot()) {
    finish();
    return;
}

2
谢谢您。这正是我需要的,因为我必须将我的启动器活动设置为“singleTop”启动模式。 - Josh
1
这在我的 OnePlus one 上没有起作用。如果 Activity A 启动 Activity B,然后 A 自己完成。那么 isTaskRoot 在 Activity B 中返回 true,但在 OnePlus one 上不是这样。因此应用程序只在启动时关闭。我使用了一个 private static boolean isRunning,并在 onCreate 中检查它是否为 true。如果不是,则将其设置为 true,否则完成。在 finish() 中将其设置为 false。 - Rishabh876
这个“修复”确实可以在单击启动器图标时恢复应用程序,但绝对不是适用于支持深度链接的任何应用程序的解决方案。深度链接通常通过相同的启动器活动处理,并且它们应该导航到应用程序中的某个位置。使用所提出的解决方案,深度链接将无法获得处理的机会。 - NeverwinterMoon
我认为除了上述内容之外,检查intent.data == null也是有意义的。虽然我没有测试过,但如果应用程序是从链接启动而不是从启动器图标启动,则intent.data将始终具有深层链接数据。 - NeverwinterMoon

4
我遇到了和你同样的问题,通过将 android:launchMode="singleInstance" 添加到manifest文件中的应用标签中来解决问题。 你可以在以下链接中查看有关launchmode的详细信息: android:launchMode

1
我的问题与launchMode有关,但是user1281750的回答实际上就是解决方案。 - Josh
4
应用标签中没有启动模式(launchMode)。 - Mark Buikema

0

这可能是一个丑陋的方法,但你可以尝试以下方式:

在你的Application子类中(或者任何单例),设置一个静态变量名为lastStopped。默认情况下将其设置为null。

在你的第一个Activity的onCreate方法中添加如下代码:

if (MyApp.lastStopped != null) {            

    Intent intent = new Intent(this, MyApp.lastStopped.getClass());
    intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
    startActivity(intent);
    finish();
    return;

}

现在,任何你想在按下主页键后返回的活动都应该具备以下特点:

@Override
protected void onStop() {

    super.onStop();
    MyApp.lastStopped = this;

}

确保在启动另一个活动之前清除MyApp.lastStopped,以防止内存泄漏。

如果这对您有用,请告诉我,它对我有效!


0
您可以测试标志:FLAG_ACTIVITY_BROUGHT_TO_FRONT,以捕获活动被带到前台而不是创建的情况。
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_BROUGHT_TO_FRONT) != 0) {  
        finish(); 
        return; 
    } 

    // Regular activity creation code... 
} 

1
由于某种原因,@Tobrun的解决方案在Android 4.4上无法工作。我更喜欢使用这个解决方案。 - Cody

0

你确定你没有退出应用程序吗?另请参阅Activity Stack


是的,我确定。在我的三星Galaxy Ace手机上,我有最近使用的应用程序菜单。当从最近使用的应用程序中运行时,它会恢复,而当从启动器中运行时,它会重新启动。 - Alexey Zakharov
你是如何启动子活动的?使用 startActivity 还是 startActivityForResult - rekire

0
这取决于您的Activity的生命周期。请参阅Android开发者网站上的"Activity Lifecycle"。如果您的Activity只是暂停了,它将在Activity返回前台时恢复,因此也包括点击图标的情况。
如果您希望即使Activity被销毁,也让用户继续上次的活动,则必须编写自己的解决方案以获取正确的Activity。

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