Android上的Actionbar返回按钮与系统返回按钮有什么区别?

31

我正在使用ActionBar及其“上一级”按钮从详细活动返回到主活动,这运作良好。同样地,用户可以按系统的“返回”按钮返回到主活动。

在我的主活动中,在onCreate()方法中下载了从互联网上获取的数据以在应用程序启动时显示。我注意到当我使用ActionBar的“上一级”按钮从详细活动返回到主活动时,onCreate()会被调用,重新下载数据。但是当我使用系统的“返回”按钮时,onCreate()不会被调用,因此立即显示主活动视图。

我在详细活动中使用的代码来实现“上一级”按钮如下:

switch (item.getItemId()) {
   case android.R.id.home:
      Intent intent = new Intent(this, MainActivity.class);
      intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
      startActivity(intent);
      return true;
我希望“向上”按钮的行为与“返回”按钮相同,不重新运行onCreate()。但我不确定如何实现这一点,或者“返回”按钮实现哪个代码路径以返回到主活动。
谢谢!

可能是正确处理操作栏向上按钮的方法?的重复问题。 - the911s
6个回答

49

不需要启动一个全新的活动,只需完成您当前所在的详细信息活动即可。

switch (item.getItemId()) {
   case android.R.id.home:
      finish();
      return true;

那么你将返回到活动堆栈中的前一个活动(即你的主活动),onCreate方法不应该被调用


糟糕!为什么我没想到呢?我想我是太过于依赖文档了...谢谢! - mraviator
13
这并不总是正确的解决方案。有时活动是从另一个应用程序开始的,此时up应该启动父活动。 更多相关信息请参见:http://developer.android.com/training/implementing-navigation/ancestral.html - shem
4
是的,但是在Google解决方案中,即使活动在堆栈中,onCreate也会被调用,您知道如何模拟“返回”功能当活动已存在时,并在不存在时创建一个新的活动吗? - shem
android.R.id.homeAPI 11 中添加了 home! 那么2.2及以上版本用于什么? - Muhammad Babar
4
知道晚了可能会帮助某个人,有一天,请在父活动中使用 android:launchMode="singleTop" - Muhammad Babar
1
@MuhammadBabar 非常感谢您!也许这个答案并不完全符合问题,但这正是我最初要寻找的优雅简洁的方式! - tbolender

10
如果你想让 Up 像 Back 一样运作,你可以这样做:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()) {
        case android.R.id.home:
            onBackPressed();
            return true;
        default:
            break;
    }
    return super.onOptionsItemSelected(item);
}
请注意,onBackPressed() 的默认实现只是调用 finish(),但可以重写 onBackPressed

8
我认为在这篇文章中可以找到更好的解决方案。
调用finish()在特定情况下有效,但可能不会始终产生文档中描述的行为,例如:文档中所述的情况。
通过调用

Intent intent = NavUtils.getParentActivityIntent(this); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP|Intent.FLAG_ACTIVITY_SINGLE_TOP); 
NavUtils.navigateUpTo(this, intent);

您将返回到父级活动,并保持离开时的状态。如果您的应用程序结构是扁平的,则其仍将像后退按钮一样运作。


1
这个应该是被接受的答案,因为它将涵盖所有可能的情况,谢谢@Andy。 - AbdelHady
2
这与在清单中设置singleTop相同,只是以编程方式实现。好的答案。 - avalancha
1
尽管您的图表很有道理,但截至2016年8月23日的最新Gmail应用程序具有ActionBar/ToolBar返回箭头和系统返回按钮的相同行为。 - ericn

0
我认为最简单的方法是重写详细活动的“getParentActivityIntent”方法,并添加标志“Intent.FLAG_ACTIVITY_CLEAR_TOP”:
@Nullable
@Override
public Intent getParentActivityIntent() {
    Intent intent = super.getParentActivityIntent();
    if (intent != null) {
        return super.getParentActivityIntent().addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    }
    return intent;
}

0

为了实现真正的“主页”功能,您应该查看“应用程序/活动/重新排序活动”下的API演示。

原因是:如果您有像这样的东西:activity1->activity2->activity3,现在您希望通过在操作栏上按主页按钮来转到activity1,该怎么办?


我只有两个活动,一个主要的和一个详细的。我总是想从详细的活动返回到主要的活动。我喜欢将Actionbar主页按钮作为另一种(直观的)方法返回到“主页”屏幕,即主要活动。 - mraviator
1
即便如此,您可以通过不关闭第二个活动来缩短打开时间。 - android developer

0
还有另一种解决方案可以供某些人使用。当用户按下返回按钮和操作栏返回按钮时,我遇到了相同的双重行为。对于返回按钮的行为,我感到满意。我不希望重新创建一个活动。因此,我重写了这个方法。
     @Override
public boolean onSupportNavigateUp() {
    onBackPressed();
    return true;
}

对我来说运行良好


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