按Back会导致Activity完成()吗?

时间:2010-05-10 07:19:21

标签: android android-activity lifecycle

我听说按下后退按钮实际上会导致当前活动finish()。总是这样吗?看起来就像它将活动从堆栈中弹出一样。

我不太确定的一种情况是当任务中的根活动被反击时。我目前正在经历一种非常奇怪的效果,描述如下:

在加载我的应用程序时,第一个Activity用于初始化,一旦完成,它将调用我的主Activity(TabActivity)。这个第一个init活动在Manifest中设置了android:noHistory =“true”,因此从我的主Activity中按回来将不会回到那个。它发送到启动器。当我第二次在Launcher中单击我的应用程序时,初始化活动再次加载,并在完成后加载主Activity。几乎在紧接着之后,它会加载我的主Activity的第二个实例。但是只有在应用程序已经运行一次之后,并且通过从主Activity中按BACK退出。它会在每次强制退出应用程序或从IDE加载新版本之前完成。

基于此,我怀疑某种Activity实例正在四处闲置并被重用,因为它只发生在我运行应用程序的第二个+时间(并使用BACK退出 - 使用HOME只返回到最后一个状态应用程序,没什么大不了的。任何人有任何想法??

7 个答案:

答案 0 :(得分:10)

  

我听说按下后退按钮实际上会导致当前的Activity完成()。总是这样吗?

不,不是。大多数活动都有这种行为,但不是全部。例如,您可以创建一个对话框并将其设置为setCancelable(false),如果单击“返回”按钮,它将不会关闭。

此外,您可以通过覆盖onBackPressed

来自定义按下的BACK按钮上的活动行为
  

当活动检测到用户按下后退键时调用。默认实现只是完成当前活动,但您可以覆盖它以执行您想要的任何操作。

关于您的应用程序行为..您是否在加载主要活动后验证活动启动器是否已完成?我的意思是如果调用onDestroy()方法。也许在它运行主要活动之后它仍然存在,当你点击回来时你只需要回到旧的启动器......

希望这会有所帮助..

答案 1 :(得分:5)

仔细阅读Android开发者网站上的Activity and Task design guidelines;他们解释了Home和Back按钮的工作原理。显然,如果你覆盖默认行为(如上面的hara所述),后退按钮将不会完成活动。

关于您的具体问题,请检查您的logcat。您应该能够看到它是否将旧流程恢复生机或启动新流程。如果不清楚,请在onCreate,onPause,onDestroyed等中插入几个日志语句,以便您可以准确了解您的流程发生了什么。

答案 2 :(得分:3)

您可以通过编写以下代码来控制BACK-BUTTON。

public boolean onKeyDown(int keyCode, KeyEvent event) 
{
    if (keyCode == KeyEvent.KEYCODE_BACK ) {
        //preventing default implementation previous to 
        //android.os.Build.VERSION_CODES.ECLAIR
        return false;
    }     
    return super.onKeyDown(keyCode, event);    
}

答案 3 :(得分:1)

您是否使用任何特殊标志运行活动,例如singleInstance或singleTop?那些可能会导致你看到的奇怪。追踪导致问题的最简单方法是用调试信息填充它。例如:

  1. 在初始化活动中,在onCreate的开头添加一个日志以获取活动的名称,例如this.toString()。更多关于你以后想要这条线的原因。
  2. 当它启动主标签式活动时,获取启动活动的名称以及一条消息,说明它已启动标签式活动。
  3. 覆盖onPause(),onStop()和onDestroy()回调,并使用this.toString()添加调试行,并且还会显示一条消息,告诉您它是哪个回调。
  4. 这将告诉您是否有多个初始化活动实例。通过将调用主活动的活动的名称与刚刚创建的活动的名称和经历过onDestroy的活动的名称进行比较来实现此目的。

    如果您不知道如何调试,请使用Log.d(LOG_TAG, "Your message here");。然后在某处定义一个常量LOG_TAG字符串。之后,通过转到Window,显示透视(或视图,不记得确切),其他,Android,LogCat,在Eclispe中显示LogCat透视图。具有LOG_TAG常量的目的是您可以设置LogCat以过滤到该String,并仅显示这些消息。它可以更容易地在大量系统日志消息中看到它们。

答案 4 :(得分:0)

对原始问题的简短回答是“不”。这很大程度上是因为,不幸的是,并非每个开发人员都遵循先前答案所引用的准则。

然而,当Back键不应该调用finish()时,guidleines本身会提到异常。最突出的例外是Web浏览器,它为每个窗口都有自己的“后台堆栈”,所以它必须有自己的Back键自定义处理。

答案 5 :(得分:0)

如果后堆栈上没有碎片且开发人员没有覆盖onBackPressed,则按下后退按钮时活动将完成。

以下是Android 4.4.2 Activity.onBackPressed()的源代码:

public void onBackPressed() {
    if (!mFragments.popBackStackImmediate()) {
        finish();
    }
}

答案 6 :(得分:0)

只需覆盖onbackpressed()..在背面按下此方法将获得执行删除超级并执行您想要执行的操作。