Android:返回上一个活动

602

我想在安卓应用程序上做一些简单的事情。 如何返回到之前的活动页面。

我需要哪些代码才能返回到之前的活动页面。


5
跟踪最近的开放活动。 - Vuk
72
你只需要简单调用finish(); 干杯 - Nguyen Minh Binh
如果您是从活动内部调用它,请使用super.finish(); - happyhardik
5
一个问题:如果Android由于内存不足或其他问题销毁了先前的活动,那么该活动将不再存在于后退堆栈中,那么会发生什么? - Sunny
@Sunny 我认为垃圾收集器从栈中最顶部的活动开始运行。 因此,如果没有前一个活动,当前活动也不存在。 但我只是这样假设,因为这种行为比在没有特定顺序的堆栈中释放内存更有意义。 如果有人确切知道,请纠正我的评论。 - Sedat Kilinc
看看这个答案,我认为这会对你有所帮助。 - Muhammad Helmi
24个回答

548

Android的活动(activities)存储在活动栈中。返回先前的活动可能意味着两件事情。

  1. 您使用startActivityForResult从另一个活动打开了新活动。在这种情况下,您可以从代码中调用finishActivity()函数,它将带您返回到上一个活动。

  2. 跟踪活动栈。每当您使用意图启动新活动时,可以指定附带标志如FLAG_ACTIVITY_REORDER_TO_FRONTFLAG_ACTIVITY_PREVIOUS_IS_TOP。您可以使用此功能在应用程序的活动之间来回切换。不过我并没有经常使用它们。请查看这里的标志:http://developer.android.com/reference/android/content/Intent.html

正如在评论中提到的,如果使用startActivity()打开活动,则可以使用finish()关闭它。 如果您想要使用向上按钮,则可以在onOptionsSelected(MenuItem item)方法中捕获它,并检查项目ID是否与android.R.id.home相符,而不是评论中提到的R.id.home


258
如果您使用了startActivity()打开一个活动,您可以使用finish()来关闭它(不需要传递任何参数)。 - neworld
3
您能说明一下在哪里以及如何使用finish()函数,使得当用户按上按钮时可以返回到前一个活动吗? - RicNjesh
4
在你的onOptionsItemSelected方法中,如果单击的菜单项具有id R.id.home,则调用finish()。 这将关闭当前活动并使用startActivity()将您带回启动它的活动。 - Anders Ullnæss
我正在通过意图让用户依次进行多个活动。我需要做些什么来确保应用程序不会因为堆栈中有太多活动而崩溃吗?谢谢! - Ruchir Baronia
非常感谢...这非常有帮助。 - Simcha
2
你确定活动1不会在你完成活动2之前就死掉了吗? - user924

250

尝试使用 Activity#finish()。这基本上是默认情况下返回按钮所执行的操作。


2
为什么要用 #?还是应该用点号? - Nabin
9
我认为他的意思是 this.finish(); - Jens Bodal
82
#finish() 方法是 Activity 类中的非静态方法的指示符。这不是有效的 Java 代码,但有助于解释如何使用该方法。 - Bryan Herbst
2
@Tanis.7x 有没有静态方法的指示器? - Benten
8
@Benten,这将是“点”,也就是说:Activity.someStaticMethod() - JonnyReeves
显示剩余2条评论

103

只需在 finish() 上点击即可。它会带您返回上一个活动。


1
虽然onBackPressed()也可以工作,但我认为这种解决方案更适合考虑退出活动您仅需要一点时间的情况..例如,我的OCR扫描仪。谢谢! - Gene Bo
这满足了我的需求。谢谢。 - Roon13

70

只是这个

super.onBackPressed();

3
这个调用会结束当前活动,因此它会显示上一个可见的活动。但是,如果没有先前的活动或者同时被销毁,应用程序可能会退出。 - r1k0
30
这种方法有些粗糙。您不应直接调用它,因为它是生命周期方法之一,应由Android系统调用。 - Dheeraj Bhaskar

42
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

使用此方法可以返回到上一个activity,并保留其堆栈,同时清除其之后的所有activities。

例如,如果堆栈为A->B->C->D,并且您使用此标志启动B,则堆栈将变为A->B。


这是我这边的工作方式。很想知道是什么原因导致finish()没有起作用。 - Relm

24

只需调用这些方法即可完成当前活动或通过onBackPressed返回上一步。

finish();

或者

onBackPressed();

我正在通过意图让用户依次进行多个活动。我需要做些什么来确保应用程序不会因为堆栈中有太多活动而崩溃吗?谢谢! - Ruchir Baronia

22

你想要控制后退按钮的行为吗?你可以通过以下两种方法之一覆盖后退按钮(以转到特定活动)。

对于 Android 1.6 及以下版本:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event)  {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {
        // do something on back.
        return true;
    }

    return super.onKeyDown(keyCode, event);
}

如果你只支持 Android 2.0 或更高版本:

@Override
public void onBackPressed() {
    // do something on back.
    return;
}

更多详情请参见:http://android-developers.blogspot.com/2009/12/back-and-other-hard-keys-three-stories.html


16

试着思考一下,仿佛你必须按下返回按钮。

finish();
super.onBackPressed();

为什么在 onBackPressed() 前缀中没有使用 super.,而在 finish() 中使用了呢? - birgersp
finish() - 将结束当前活动 super.onBackPressed() - 它是从父类调用的,因此使用了super - Muhammed Fasil
你实际上不需要这两行代码都写。你可以使用第一行来完成当前活动,或者使用第二行来调用负责处理“返回按钮”按下的代码。在第一种情况下,前一个活动不需要 "finish()" 调用与 startActivity() 一起使用,以使它在关闭当前活动并返回到它时仍然处于“活动”状态。 - George

15

将以下代码添加到您的onCLick()方法中,它将返回到您之前的活动

finish();

或者您也可以使用以下代码。它对我非常有效。

 @Override
  public boolean onOptionsItemSelected(MenuItem item) {
  int id = item.getItemId();

      if ( id == android.R.id.home ) {
         finish();
         return true;
       }

  return super.onOptionsItemSelected(item);
  }

14

如果您想返回到之前的活动,请使用

finish();

OR
onBackPressed();

如果您想进入第二个及以下的活动,请使用以下方法:

intent = new Intent(MyFourthActivity.this , MySecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
//Bundle is optional
Bundle bundle = new Bundle();
bundle.putString("MyValue1", val1);
intent.putExtras(bundle);
//end Bundle
startActivity(intent);

1
我发现finish()和onBackPressed()都可以工作,但是至少在我的应用中,finish()非常慢而onBackPressed()要快得多。很好奇。 - scrayne
我让用户通过意图一个接一个地进行许多活动。我需要做些什么来确保应用程序不会因为堆栈中有太多活动而崩溃吗?谢谢! - Ruchir Baronia

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接