我有一个关于Android应用程序中的活动的相当简单的问题。我还是个新手。
在我目前的Android应用程序中,我有大约10个活动。如果其中一个活动已经远离活动堆栈,我想重新打开它,是否可以调用:
Intent iLogin = new Intent(this,Login.class);
startActivity(iLogin);
如果它仍然有点令人困惑,我会举一个例子。应用程序随活动1一起启动。然后,用户打开活动2.稍后,他打开活动3以执行操作。执行操作后,我希望用户返回活动1.是否可以调用上面的代码?它是从堆栈中获取活动还是创建新活动?如果不是,我如何从堆栈中获取活动?
更新:我对回收活动感兴趣,而不是每次创建新活动。例如,并非所有活动都需要创建新活动。其中一些只显示数据,可以根据用户要求刷新。
答案 0 :(得分:2)
简而言之:不,您的代码段会将Login
的新实例推送到活动堆栈。请在developer.android.com上的Tasks and Back Stack文章中阅读有关活动堆栈行为的更多信息。
因为后堆栈中的活动永远不会重新排列,如果你的 应用程序允许用户从多个开始执行特定活动 一个活动,创建并弹出该活动的新实例 到堆栈(而不是带来任何以前的实例 活动到顶部)。因此,您的应用程序中的一个活动可能会 如图所示,多次实例化(甚至来自不同的任务) 在图3中。
图3:
在Managing Tasks下,还有一个可能的解决方案。您可以向Intent添加flag,指定在堆栈上已存在活动时Android应执行的操作。我会说FLAG_ACTIVITY_REORDER_TO_FRONT
或FLAG_ACTIVITY_CLEAR_TOP
可能是您正在寻找的,但肯定会浏览其他选项,因为可能有更适合您的需求。
或者,如果您的应用中的流量允许,您可以在用户离开时完成活动。例如,在您的示例中:如果用户从活动#2导航到活动#3,则完成#2。按#3中的后退按钮将导致显示活动#1,因为那将是堆栈顶部的活动。
答案 1 :(得分:1)
我相信您可能希望使用FLAG_ACTIVITY_REORDER_TO_FRONT
的addFlags()
方法尝试标记Intent
。
如果堆栈中已存在Activity
并将其存在,则会将{{3}}置于堆栈顶部,如果不存在则创建一个新的。{/ p>
答案 2 :(得分:1)
可以调用上面的代码吗?它是否得到了活动 堆叠,还是创建一个新活动?如果不是,我该如何获得活动 从堆栈?
<强>答。如果您使用此代码,则会在堆栈上创建另一个ur 1st活动实例,而且不是没有。
确定。这是基于上面例子的答案:
我建议您使用startActivityForResult()
来调用活动1中的活动2
这里,活动2将表现为子活动...你可以setResult并在第二个活动成功完成任务时调用finish()
...
但在finish()
之前添加了一个类似的布尔值:
i.putExtra("passed2nd", true);
这表明用户已经完成了第二次活动
现在,你应该在第一个活动中覆盖onActivityResult()
,
这里你可以查看请求代码并从第二个活动中检索布尔额外的内容。
现在,重要的部分:
取决于布尔值是否为真,你可以决定使用startActivityForResult()
使用不同的请求代码调用第三个活动,
另外,在你的onActivityResult()
中,你可以再次检查请求代码,并在活动3结束时按照你的意愿行事
所以现在当第3个活动成功结束时,控件将返回到第1个活动
这是一个example让你开始。
答案 3 :(得分:0)
我建议使用FLAG_ACTIVITY_CLEAR_TOP
Activity 1 -> Activity 2 -> Activity 3
所以Activity 3
之后你想回到Activity 1
对吗?我假设您不希望Activity 2
仍在运行,因此您应该使用FLAG_ACTIVITY_CLEAR_TOP
以便中间的所有内容都将关闭