在我的安卓应用中有几个活动(activities), 如果使用intent(意图),我可以像这样跳转到其他活动:
[Activity A]->[activity B]->[Activity C]->[Activity-D]->[Activity N]
现在,当我在活动N时,按下按钮后,我想要去到Activity B并销毁Activity C和Activity D,但是Activity A不应该被销毁。我已经在各种文章中搜索过,但没有找到完全相同的解决方案。 任何帮助将不胜感激。
在我的安卓应用中有几个活动(activities), 如果使用intent(意图),我可以像这样跳转到其他活动:
[Activity A]->[activity B]->[Activity C]->[Activity-D]->[Activity N]
现在,当我在活动N时,按下按钮后,我想要去到Activity B并销毁Activity C和Activity D,但是Activity A不应该被销毁。我已经在各种文章中搜索过,但没有找到完全相同的解决方案。 任何帮助将不胜感激。
在 ActivityN
中返回到 ActivityB
,使用以下代码:
Intent intent = new Intent(this, ActivityB.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
startActivity(intent);
使用标志 CLEAR_TOP
将结束堆栈中位于 ActivityB
之上的所有活动。在您给出的示例中,这将结束 ActivityN
、ActivityD
和 ActivityC
。使用标志 SINGLE_TOP
将确保将控制返回到现有的 ActivityB
实例(即:它不会创建一个新的 ActivityB
实例)。
public static ActivityC instance = null;
public class ActivityC extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
instance = this;
}
}
在您的Activity D中,请按照以下步骤进行
public static ActivityD instance = null;
public class ActivityD extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
instance = this;
}
}
public class ActivityN extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Button yourButton= (Button) findViewById(R.id.yourButton);
yourButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
ActivityC.instance.finish();
Activityd.instance.finish();
finish();
}
});
}
}
编辑:使用startActivityForResult()而不是startActivity()
因此,根据结果您可以更改行为。
例如,当您想要转到ActivityB时,只需在INTENT中返回一些标志。当它在Activity D和C中被捕获并在onActivityResult()中完成它们,最终您将到达B。
使用标志Intent.FLAG_ACTIVITY_CLEAR_TOP可能解决您的问题: http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP
//Activity A
Intent i = new Intent(getApplicationContext,ActvityB.class);
startActivity(i);
//活动 B
Intent i = new Intent(getApplicationContext,ActvityC.class);
startActivity(i);
Intent i = new Intent(getApplicationContext,ActvityC.class);
startActivity(i);
finish();
// finish here actvity which you want to finish
//尝试第二种方法:
在你的第一个活动中,像这样声明一个Activity对象,
public static Activity fa;
onCreate()
{
fa = this;
}
onCreate()
{
FirstActivity.fa.finish();
}
Intent
标志来实现OP想要的功能。你的解决方案会在应用程序中创建内存泄漏,因为存储在静态变量中的Activity
实例永远无法被垃圾回收。不仅如此,这个解决方案很难理解和维护。没有理由使用这样的hack。 - David Wasser您可以使用相同的请求码传递给startForResult(requestCode)
,启动ActivityC
、ActivityD
和ActivityN
。
然后在ActivityN中,使用finishActivity(int requestCode)
。
finishActivity(int requestCode)
的文档说明
Force finish another activity that you had previously started with startActivityForResult.
Params:
requestCode – The request code of the activity that you had given to startActivityForResult().
If there are multiple activities started with this request code, they will all be finished.