2016-11-12 79 views
0

我正在制作一个具有MainActivity(A)的应用程序,该应用程序是导航活动。该活动可以启动活动(B),并从那里我可以导航到活动(C)。然后,当我导航到活动(D)时,我想完成除MainActivity(A)之外的所有活动。所以基本上,如果我从活动回来(A),我会去同一个活动实例(A)。所以基本上A> B> C,然后当(D)启动时,堆栈是A> D。完成MainActivity和新活动之间的所有活动

回答

0

使用setFlags方法给这个意图FLAG_ACTIVITY_CLEAR_TOP

这将检查你的筹码,看是否MainActivity的实例已经存在,而且如果这样做,会带来该活动的前部和清除所有它上面的活动,而不是重新启动MainActivity,并把它放在顶部叠加。

另一种方式是手工在每一个activity.Like调用完成():

Intent intent = new Intent(this, NextActivity.class); 
startActivity(intent); 
finish(); 
+0

如果活动A未被称为MainActivity会怎么样?另外对于你来说,第二种解决方案如果我不想关闭中介活动,直到我开始活动D – Hooman

+0

你不应该只是亲手挑选你想销毁的几个活动。总之,尝试创建'活动'对象然后调用完成()方法从另一个activity.Like这[link](http://stackoverflow.com/questions/10379134/finish-an-activity-from-another-activity) –

0

两个选项:

1)使用MainActivity为 “调度员”。当C要推出d,它应该做这样的:

Intent intent = new Intent(this, MainActivity.class); 
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
intent.putExtra("launchD", true); 
startActivity(intent); 

此代码将清除的MainActivity顶部的所有活动,并导致onNewIntent()要在MainActivity调用。

MainActivity,覆盖onNewIntent():堆栈清零后

@Override 
protected void onNewIntent(Intent intent) { 
    if (intent.hasExtra("launchD")) { 
     // Need to launch Activity D 
     Intent launchIntent = new Intent(this, D.class); 
     startActivity(launchIntent); 
    } 
} 

MainActivity现在推出d。按D中的BACK将返回到MainActivity

2)选自C启动d照例:

Intent intent = new Intent(this, D.class); 
startActivity(intent); 

此时,堆栈A-> B-> C-> d

在d,重写onBackPressed()

@Override 
public void onBackPressed() { 
    Intent intent = new Intent(this, MainActivity.class); 
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    startActivity(intent); 
} 

在这种情况下,在D中按下BACK将导致D,C和B从堆栈中删除,用户将返回到MainActivity

注意:使用标志FLAG_ACTIVITY_CLEAR_TOPFLAG_ACTIVITY_SINGLE_TOP的组合确保了MainActivity现有实例将被重用。 Android不会创建新的实例。