Android:返回上一个活动


524

我想在android应用上做一些简单的事情。如何返回上一个活动。

我需要什么代码才能返回上一个活动


5
保留上次打开的activiy的轨迹
武克

53
您只需简单地调用finish();即可。干杯
Nguyen Minh Binh

super.finish(); 如果您从活动内部调用它!
happyhardik 2012年

5
这里的一个问题是:如果android由于内存减少或其他问题而破坏了先前的活动,那么该活动将不再存在于堆栈中,然后会发生什么?
2014年

@Sunny我假设垃圾收集器从堆栈中最顶层的活动开始。因此,如果没有以前的活动,那么也就不会有当前的活动。但是我只是假设,因为这种行为比没有任何特定顺序释放堆栈中的内存更有意义。如果有人确切知道,请更正我的评论。
Sedat Kilinc

Answers:


486

Android活动存储在活动堆栈中。回到上一个活动可能意味着两件事。

  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)通过检查注释中提到的与之android.R.id.home不同的项目ID 来捕获该方法R.id.home


237
或者,如果您使用startActivity()打开了活动,则可以使用finish()关闭(不需要传递任何参数)
neworld,2012年

3
您能否说明在何处以及如何使用finish(),以便当用户按下向上按钮时将其
带入

4
@RicNjesh在onOptionsItemSelected方法中,如果单击的菜单项具有ID R.id.home,则调用finish()。它将关闭当前活动,并带您回到以startActivity()开始的活动
AndersUllnæss2014年

我让用户通过意图接连进行许多活动。为了确保应用程序不会因堆栈中的太多活动而崩溃,我是否需要做任何事情?谢谢!
Ruchir Baronia 2015年

1
您确定活动1在完成活动2之前就不会消失吗?
user924

225

尝试Activity#finish()。默认情况下,这或多或少是后退按钮的作用。


1
为什么#?还是一个点?
2014年

8
我相信他的意思是this.finish();
Jens Bodal 2014年

69
#是一个指标,finish()是Activity类的非静态方法。它不是有效的Java,但可以帮助您解释如何使用该方法。
Bryan Herbst 2014年

2
@ Tanis.7x是否有静态方法的指示符?
Benten

8
@Benten将会是.,即:Activity.someStaticMethod()
JonnyReeves 2015年

81

只需在click finish()上编写即可。它将带您到上一个活动。


1
尽管onBackPressed()也可以工作,但我认为此解决方案更适合考虑退出您仅需要一点时间的活动。谢谢!
Gene Bo

这满足了我的需求。谢谢。
Roon13年

68

只是这个

super.onBackPressed();

2
此调用仅完成当前活动,因此它将显示可见的最后一个活动。但是,如果没有先前的活动或同时被销毁,则应用程序可能会退出。
r1k0 2012年

22
这是骇人听闻的。您不应该直接调用此方法。这是生命周期方法之一,应由android系统调用。
Dheeraj Bhaskar 2014年

33
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

这将使您进入先前的活动,保持其堆栈并从堆栈中清除其后的所有活动。

例如,如果堆栈为A-> B-> C-> D,并且您以该标志开头B,则堆栈将为A-> B


这就是对我有效的方法。很想找出会导致finish()无法正常工作的原因。
Relm

20

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

对于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



13

如果您只想去以前的活动使用

finish();

要么

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 2015年

我让用户通过意图接连进行许多活动。为了确保应用程序不会因堆栈中的太多活动而崩溃,我是否需要做任何事情?谢谢!
Ruchir Baronia 2015年

13

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

完();

或者您可以使用它。对我来说效果很好

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

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

  return super.onOptionsItemSelected(item);
  }

11

如果您已正确设置活动活动为父的AndroidManifest.xml文件,则可以使用:

NavUtils.navigateUpFromSameTask(this);

这是您的孩子活动。




7

有同样的问题,

finish();  OR super.onBackPressed();

对我来说很好,两个都一样,但是运气不好 return


6

使用意图启动第二个活动(使用startActivitystartActivityForResult根据您的要求)。现在,当用户按下“后退”按钮时,将关闭顶部的当前活动,并显示前一个活动。

现在,假设您有两个活动,一个活动是为用户选择一些设置,例如语言,国家/地区等,选择后,用户单击下一步按钮转到登录表单(例如)。现在,如果登录失败,则用户将处于登录活动中,如果登录成功,该怎么办?

如果登录成功,则必须开始另一个活动。这意味着将启动第三个活动,但仍在运行两个活动。在这种情况下,最好使用startActivityForResult。登录成功后,将OK数据发送回第一个活动并关闭登录活动。现在,当接收到数据时,请启动第三个活动,并使用Finish关闭第一个活动。


我让用户通过意图接连进行许多活动。为了确保应用程序不会因堆栈中的太多活动而崩溃,我是否需要做任何事情?谢谢!
Ruchir Baronia 2015年

5

您可以尝试以下方法:

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) {

        finish();
        return true;
    }
    return super.onKeyDown(keyCode, event);
}

4

默认情况下,所有新活动/意图都具有后退/先前行为,除非您finish()在调用活动中编写了“ a ”。


4
@Override
public void onBackPressed() {
    super.onBackPressed();
}

如果要单击按钮,请返回上一步,然后简单地将

bbsubmit.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        onBackPressed();
    }
});

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

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

      return super.onOptionsItemSelected(item);
 }

尝试此操作,它既可以在工具栏的后退按钮上用作硬件后退按钮


2

我建议使用NavUtils.navigateUpFromSameTask(),它非常简单,您可以从Google开发人员那里学习。希望我能为您服务!


1

有几种情况可以返回到您以前的活动:

情况1:如果您想将结果返回到先前的活动,则使用 ActivityA.java

 Intent intent = new Intent(ActivityA.this, FBHelperActivity.class);
               startActivityForResult(intent,2);

FBHelperActivity.java

 Intent returnIntent = new Intent();
 setResult(RESULT_OK, returnIntent);
 finish();

情况2: ActivityA-> FBHelperActivity ----> ActivityA

ActivityA.java

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

FBHelperActivity.java

after getting of result call finish();
 By this way your second activity will finish and because 
 you did not call finish() in your first activity then
 automatic first activity is in back ground, will visible.

1

首先,如果您想返回上一个活动,则需要牢记。然后,在使用Intent进行其他活动时,不要调用finish()方法。

之后,您可以通过两种方式从当前活动返回到先前活动:

只需调用:finish()在按钮单击侦听器下,或使用系统后退按钮覆盖以下方法来后退:

@Override
public void onBackPressed() {
    super.onBackPressed();
}

0

除了所有提到的答案外,它们仍然是执行此操作的另一种方法,可以说您有两个类,即A类和B类。

您已经对A类进行了一些活动,例如复选框选择,打印了一些数据以及对B类的意图。B类,您想将多个值传递给A类并保持A类的先前状态,可以使用,尝试这种替代方法方法或下载源代码来证明这一点

http://whats-online.info/science-and-tutorials/125/Android-maintain-the-previous-state-of-activity-on-intent/

要么

http://developer.android.com/reference/android/content/Intent.html


0

只需尝试一下,第一次活动

Intent mainIntent = new Intent(Activity1.this, Activity2.class);
this.startActivity(mainIntent);

在您的第二项活动中

@Override
public void onBackPressed() {
    this.finish();
}

不断崩溃,数据无法持久存在
约翰·克特吉克
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.