创建活动堆栈分支并清除它

时间:2011-09-12 23:53:21

标签: android android-activity

我知道类似的问题已被多次询问过,但我的有点不同。 例如,我有活动树,如A(根活动)-B-C-D-E(A启动B,B启动C等)。此外,我有两个可以启动活动F和G的按钮,它们随处可用(它们就像菜单,它们的launchMode =“singleTask”)

如果从B C D或E调用“特殊”活动之一,则弹出窗口会显示“您真的想破坏预订流程吗?”等文字。如果用户单击“是”,则活动将更改为“G”,应从活动堆栈中清除BCD和E活动,再次按“返回按钮”会将用户返回到活动A(如果从F调用G,则返回F)。 / p>

我可以通过设置标志“Intent.FLAG_ACTIVITY_CLEAR_TOP”来做到这一点,但它不合适,因为我需要以某种方式确定是否从B / C / D / E活动中调用了G活动。如果不是(我的意思是从A或F活动中调用),那么后退按钮应该照常工作。

我已经尝试过: broadcastRecievers通过清单文件 - 我试图在另一个B C D E活动上调用“finish()”。这有点愚蠢,因为其中一个已经被GC删除了。

“getCallingActivity()”方法。无法使它工作。想要比较呼叫活动是否是B / C / D / E之一

“startActivityForResult(intent,result)” - 它无法正常工作(未调用onActivityResult),因为我的清单文件中有“launchMode =”singleTask“用于F和G活动。

我还尝试为B-C-D-E树创建一个新任务。但意识到它甚至在启动菜单中显示为第二个任务。

我会非常感谢任何帮助,甚至理论上的帮助。

2 个答案:

答案 0 :(得分:1)

我不确定onResultReceived可能是什么,但请尝试:

@Override
    protected void onActivityResult(int requestCode, int resultCode, 
            Intent intent){
super.onActivityResult(requestCode, resultCode, intent);

...etc...

}

只需使用intent.putExtra() ...即可将信息从一个活动转移到另一个活动。如果您想要传回,请在“最顶层”活动中使用this.setResult(int, intent),然后它会重新开始。如果你想让它一直回到开头,那么也有一个标志,FLAG_ACTIVITY_FORWARD_RESULT。我认为这可以防止必须捕获结果,然后再将其转发到下一个最低的活动,但可能是错误的。

答案 1 :(得分:0)

我通过使用putExtra()解决了这个问题。我将字符串传递给B,C,D,E的活动F和G. 当F和G从彼此调用时,A我没有通过任何东西。

通过覆盖F和G活动中的一个方法,我获得了所需的结果:

    @Override
public void onBackPressed() {
    if (passedString != null) {
        final Intent a = new Intent(this, A.class);
        a.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        startActivity(a);
    }
    super.onBackPressed();
}