我正在处理的Android应用中遇到一个小问题:
有3个活动,即A,B,C,调用按以下顺序排列: A - > B - > C.在C中,当我按下BACK按钮时,它应该返回A [默认情况下不是B]。按下A中的BACK将退出程序。
我试图将C中的意图调用到A.但是在这种情况下,调用调用进入循环: A - > B - > C - > A,因为新活动被推到堆栈顶部。结果,当在A处按下BACK时,不是退出[A是开始],而是进入C然后是B,然后在不必要的圆圈中返回到A.
如果有人能够提供更好的方法来解决这个循环的场景,那将是很棒的!
答案 0 :(得分:19)
很简单!! 当你从B开始活动C时,使用B.finish()。这样的事情。
Intent i = new Intent(B.this, C.class);
B.this.finish();
startActivity(i);
这将从堆栈中删除B!
答案 1 :(得分:11)
可能迟到了,但对于那些可能在搜索中发现这一点的人: 你可以添加
android:noHistory="true"
到AndroidManifest中的活动B. 这也将避免在C返回结果时在活动B中调用onActivityResult()方法。一旦你开始C,我基本上就像B消失了。
答案 2 :(得分:2)
为此活动设置B活动的标志
private boolean mDestroyActivity = false;
在调用startActivity C时将该标志设置为true。
for activity B onStop方法添加如下检查:
if (mDestroyActivity) finish();
然后当您按下C中的后退按钮时,您将跳回到A.
答案 3 :(得分:1)
您可以使用startActivityForResult()
启动活动C,并在onActivityResult()
内完成活动B.
启动活动C,
Intent intent = new Intent(ActivityB.this, ActivityC.class);
startActivityForResult(intent, 123);
并在活动B中覆盖
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if(requestCode == 123){
if(resultCode == Activity.RESULT_OK){
finish();
}
}
}
在活动C中,在setResult(Activity.RESULT_OK)
finish();
<强>更新强>
另一种方法是使用FLAG_ACTIVITY_NEW_TASK
和FLAG_ACTIVITY_CLEAR_TOP
从活动C开始活动A.
Intent intent = new Intent(ActivitC.this, ActivityA.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);
当您启动活动C时,还有一种方法可以只是finish()
活动B.因此,当您按回活动C时,它将直接移动到活动A,因为活动B已经完成。
答案 4 :(得分:1)
请在启动新活动
之前设置此FLAGintent.setFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
答案 5 :(得分:1)
活动代码中值下方的清单文件中提及
android:noHistory =“ true”
然后它将跳过活动
答案 6 :(得分:0)
我认为你不应该打破正常的流量。 C应首先返回B然后返回A.
我能解决你的问题。 在A活动中注册广播接收器然后从C向A发送广播。在A活动中,您可以接收该广播,然后清除堆栈。这将自动完成所有儿童活动。
覆盖onbackpress并且不要在onbackpress中调用super而是向活动A发送广播。
答案 7 :(得分:0)
在活动B中:
公共静态布尔值mDestroyActivity = false; @Override 受保护的void onResume(){ super.onResume(); / ** *从活动C-> A返回时退出(跳过活动B) * / Log.i(“ FINISH”,“ =” + mDestroyActivity); 如果(mDestroyActivity){ mDestroyActivity = false; 完(); } }
在活动C中:
B.mDestroyActivity = true;