Android:返回上一个活动
Posted
技术标签:
【中文标题】Android:返回上一个活动【英文标题】:Android: Go back to previous activity 【发布时间】:2011-05-01 14:37:31 【问题描述】:我想在安卓应用上做一些简单的事情。 怎么可能回到以前的活动。
返回之前的活动需要什么代码
【问题讨论】:
跟踪上次打开的活动 你只需简单的调用finish();干杯 super.finish();如果您从活动内部调用它! 这里有一个问题:如果android由于内存不足或其他问题而破坏了先前的活动,那么该活动将不再存在于后台堆栈中,然后会发生什么? @Sunny 我假设垃圾收集器从堆栈中最顶层的活动开始。因此,如果没有先前的活动,也不会有当前的活动。但我只是假设,因为这种行为比在没有任何特定顺序的情况下释放堆栈中的内存更有意义。如果有人确切知道,请更正我的评论。 【参考方案1】:Android 活动存储在活动堆栈中。回到之前的活动可能意味着两件事。
您使用 startActivityForResult 从另一个活动中打开了新活动。在这种情况下,您只需从代码中调用 finishActivity() 函数,它就会带您回到上一个活动。
跟踪活动堆栈。每当您开始一个带有意图的新活动时,您都可以指定一个意图标志,如FLAG_ACTIVITY_REORDER_TO_FRONT
或FLAG_ACTIVITY_PREVIOUS_IS_TOP
。您可以使用它在应用程序中的活动之间随机播放。不过没怎么用过。看看这里的标志:http://developer.android.com/reference/android/content/Intent.html
如 cmets 中所述,如果活动是用startActivity()
打开的,那么可以用finish()
关闭它。
如果你想使用向上按钮,你可以在 onOptionsSelected(MenuItem item)
方法中通过检查项目 ID 与 android.R.id.home
来捕捉它,这与 cmets 中提到的 R.id.home
不同。
【讨论】:
或者如果你用startActivity()打开activity,你可以用finish()关闭(不需要传递任何参数) 你能澄清一下你在哪里以及如何使用finish(),所以当用户按下向上按钮时,它会将他们带到上一个活动 @RicNjesh 在您的 onOptionsItemSelected 方法中,如果单击的菜单项的 ID 为 R.id.home,则调用 finish()。它将关闭当前活动并带您回到使用 startActivity() 启动它的活动 我让用户通过意图一个接一个地进行许多活动。我是否需要做任何事情来确保应用程序不会因堆栈上的太多活动而崩溃?谢谢! 你确定活动 1 不会在你完成活动 2 之前的某个时间死掉吗?【参考方案2】:试试Activity#finish()
。这或多或少是默认情况下后退按钮的作用。
【讨论】:
为什么是#?还是一个点? 我相信他的意思是this.finish();
#
指示finish()
是 Activity 类的非静态方法。它不是有效的 Java,但它有助于解释如何使用该方法。
@Tanis.7x 是否有静态方法的指示器?
@Benten 那将是.
,即:Activity.someStaticMethod()
【参考方案3】:
点击finish()即可。它将带您到上一个活动。
【讨论】:
虽然 onBackPressed() 也可以,但我认为这个解决方案更适合考虑退出你需要的活动......例如我的情况是 OCR 扫描仪。谢谢! 这满足了我的需要..谢谢。【参考方案4】:就这个
super.onBackPressed();
【讨论】:
这个调用只是完成了当前的活动,所以它会显示最后一个可见的活动。但是,如果没有先前的活动或者它同时被破坏,应用程序可能会退出。 这太骇人听闻了。您不应该直接调用它。这是生命周期方法之一,应该由android系统调用。【参考方案5】:intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
这将使您进入前一个活动,保留其堆栈并从堆栈中清除其后的所有活动。
例如,如果堆栈是 A->B->C->D 并且您使用此标志开始 B,则堆栈将为 A->B
【讨论】:
这对我有用。很想知道是什么导致完成()不起作用。【参考方案6】:您想控制后退按钮的行为吗?您可以通过以下两种方法之一覆盖后退按钮(以转到特定活动)。
适用于 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
【讨论】:
【参考方案7】:只需调用这些方法即可完成当前活动或通过 onBackPressed 返回
finish();
或
onBackPressed();
【讨论】:
我让用户通过意图一个接一个地进行许多活动。我是否需要做任何事情来确保应用程序不会因堆栈上的太多活动而崩溃?谢谢!【参考方案8】:在你的 onCLick() 方法中添加这个,它会回到你之前的活动
完成();
或者你可以使用它。它对我来说非常有效
@Override
public boolean onOptionsItemSelected(MenuItem item)
int id = item.getItemId();
if ( id == android.R.id.home )
finish();
return true;
return super.onOptionsItemSelected(item);
【讨论】:
【参考方案9】:如果你想去只是想去以前的活动使用
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);
【讨论】:
我发现 finish() 和 onBackPressed() 都可以工作,但是,至少在我的应用程序中,finish() 非常慢,而 onBackPressed() 快得多。好奇。 我让用户通过意图一个接一个地进行许多活动。我是否需要做任何事情来确保应用程序不会因堆栈上的太多活动而崩溃?谢谢!【参考方案10】:试试这个,因为你必须按下返回按钮
finish();
super.onBackPressed();
【讨论】:
为什么在onBackPressed()
前加上finish()
而不是super.
?
finish() - 将结束当前活动 super.onBackPressed() - 它是从父类调用的,这就是使用 super 的原因【参考方案11】:
如果你已经正确设置了带有activity parent的AndroidManifest.xml文件,你可以使用:
NavUtils.navigateUpFromSameTask(this);
这是您孩子的活动。
【讨论】:
【参考方案12】:遇到了同样的问题
finish(); OR super.onBackPressed();
对我来说效果很好,两者都一样,但return
没有运气
【讨论】:
【参考方案13】:你可以显式调用onBackPressed
是最简单的方法
详情请参考Go back to previous activity
【讨论】:
【参考方案14】:使用意图启动第二个活动(根据您的要求使用startActivity
或startActivityForResult
)。现在,当用户按下后退按钮时,顶部的当前活动将被关闭并显示上一个活动。
现在假设您有两个活动,一个用于为用户选择一些设置,如语言、国家等,选择后,用户单击下一步按钮转到登录表单(例如)。现在如果登录不成功,那么用户将在登录活动中,如果登录成功怎么办?
如果登录成功,那么您必须开始另一个活动。这意味着将启动第三个活动,但仍有两个活动正在运行。在这种情况下,最好使用startActivityForResult
。登录成功后,将 OK 数据发送回第一个活动并关闭登录活动。现在,当接收到数据时,启动第三个活动并使用完成关闭第一个活动。
【讨论】:
我让用户通过意图一个接一个地进行许多活动。我是否需要做任何事情来确保应用程序不会因堆栈上的太多活动而崩溃?谢谢!【参考方案15】:你可以试试这个:
@Override
public boolean onKeyDown(int keyCode, KeyEvent event)
if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0)
finish();
return true;
return super.onKeyDown(keyCode, event);
【讨论】:
【参考方案16】:默认情况下,所有新活动/意图都有返回/上一个行为,除非您在调用活动上编写了finish()
。
【讨论】:
【参考方案17】:@Override
public void onBackPressed()
super.onBackPressed();
如果你想点击按钮返回然后简单地放
bbsubmit.setOnClickListener(new View.OnClickListener()
@Override
public void onClick(View v)
onBackPressed();
);
【讨论】:
【参考方案18】:我建议使用 NavUtils.navigateUpFromSameTask(),它很简单,你可以向谷歌开发者学习。希望我能帮助你!
【讨论】:
【参考方案19】: @Override
public boolean onOptionsItemSelected(MenuItem item)
int id = item.getItemId();
if ( id == android.R.id.home )
finish();
return true;
return super.onOptionsItemSelected(item);
试试这个,它在工具栏后退按钮上都可以作为硬件后退按钮。
【讨论】:
【参考方案20】:很少有情况可以回到您之前的活动:
案例 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.
【讨论】:
【参考方案21】:除了所有提到的答案之外,它们仍然是一种替代方法,假设您有两个类,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
【讨论】:
【参考方案22】:试试这个, 第一个活动
Intent mainIntent = new Intent(Activity1.this, Activity2.class);
this.startActivity(mainIntent);
在你的第二个活动中
@Override
public void onBackPressed()
this.finish();
【讨论】:
一直崩溃,我认为数据不会持续存在【参考方案23】:首先,您需要记住的是,如果您想返回之前的活动。然后在使用 Intent 进行另一个活动时不要调用 finish() 方法。
之后,您有两种方法可以从当前活动返回到上一个活动:
只需调用:
finish()
或
super.onBackPressed();
【讨论】:
如果你只是调用被覆盖的方法而不是自定义行为,那么覆盖父类的方法是没有意义的。以上是关于Android:返回上一个活动的主要内容,如果未能解决你的问题,请参考以下文章
Android7.0 Intent向下一个活动传递数据返回数据给上一个活动