点击按钮后关闭活动堆栈

10
在我的应用程序中,我从登陆页面开始一个包含8个步骤的“向导”,数据从第1步一直传递到第8步。为了保持数据在步骤之间不变,我没有在任何一个活动中调用finish()方法。但是,当所有步骤都完成后,有没有办法关闭我启动的8个活动并返回到登录页面?
以下是示例:
主页 - 步骤1 -> 2 -> 3 -> 4 -> 5 -> 6 -> 7 -> 8
当用户点击“保存”时,关闭所有步骤(共8个)并回到主页。目前我一直在创建新的Intent来实现这一点,但我意识到这不是最好的解决方案。简单的返回按钮只能让用户返回到第7步。
感谢任何帮助。

“为了在活动之间保持数据完整性”...不确定您的意思,但请记住,不能保证其中一个活动在进入后台后不会被Android关闭。确保您不依赖它们的存在。 - Cheryl Simon
@Mayra:有没有办法防止Android关闭任何活动?我认为这些步骤不会超过几分钟,理想情况下至少如此。但你永远无法确定。 - Siddharth Lele
1
不可以。请查看Activity生命周期文档以获取详细信息:http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle 无论如何,您都应该正确处理停止和重新启动的情况,以防某人从您的应用程序中点击离开并回到它。 - Cheryl Simon
2个回答

20
Intent intent = new Intent(this, Home.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

这将会杀死你第8个屏幕和主屏幕之间的所有活动,并重新启动你的主屏幕。同时,您可以在清单文件中设置您主屏幕的活动模式为“singleTop”。请查看此链接- developer.android.com/guide/topics/fundamentals.html#acttask


非常感谢,Varun。那个方法非常有效。正是我所需要的。再问一个问题。在清单文件中使用launchmode="SingleTop"参数设置主活动是什么意思? - Siddharth Lele
使用上述代码将启动一个新的主屏幕活动实例。但是,如果您将主屏幕的launchmode设置为singeTop,则只会存在一个活动实例,并且意图将被传递到活动的onNewIntent()方法中。 - Varun

5
另一种方法是使用StartActivityForResult(...)启动每个活动,并在完成之前调用setResult()来要求活动。然后在每个Activity的onActivityResult(...)方法中,如果意图非空,则调用finish()。这将创建完整的堆栈,并在最后一个完成时自动链接完成它们所有。
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (data == null) {
        return;  // back button, resume this activity
    }

    // Propagate result down the stack.
    setResult(0, data);
    finish();
}

这样可以让您更多地掌控,并通过onActivityResult将结果传递给原始活动,而不是创建意图,如果原始请求有其他状态需要保留(特别是在其启动意图中),这可能更加直观。


在我的情况下,这不起作用。我已经看到了您的解决方案可以使用的地方。但在这种情况下,我提到的步骤更像是收集信息的表单,内容只向一个方向传递。没有任何东西被发送回来。Varun的解决方案是适合我的。感谢您的帮助。无论如何,我肯定会在不同的情况下使用它。 - Siddharth Lele

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