2011-09-12 48 views
0

我知道类似的问题已经被多次询问过,但我的差异有点。 例如我有活动树像A(根活动)-B-C-D-E(A启动B,B启动C等)。另外我有两个按钮可以启动活动F和G,它们随处可用(它们就像菜单,它们的launchMode =“singleTask”)创建活动堆栈分支并清除它

如果从BCD或E调用其中一个“特殊”活动,则弹出出现一个文字,如“你真的想毁了预订流程?”。如果用户点击“是”,则活动变为“G”,B C D和E活动应从活动堆栈中清除,再次按下“返回按钮”将用户返回到活动A(或F,如果G从F调用)。

我可以通过设置标志“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活动清单文件。我也试图作出BCDE树一个新的任务,但是意识到,它甚至出现在启动菜单第二个任务。

我将非常感谢所有帮助,甚至理论上。

回答

0

我已经通过使用putExtra()解决了这个问题。我将字符串传递给B,C,D,E中的活动F和G. 当F和G相互呼叫时,我没有通过任何事情。

通过覆盖在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(); 
} 
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。我认为这样做可以避免必须捕捉结果,然后再将其转发到下一个最低活动,但可能是错误的。

+0

对不起!我的记忆欺骗了我。通过说“onResultReceived”我的意思是“OnActivityResult”。 当要发送结果的Activity使用“launchMode = singleTask”或“singleInstance”时,不会调用此方法。 所以你的解决方案不会工作。 – Ruzard