17

我听说按下后退按钮本质上会导致当前 Activity 变为finish(). 总是这样吗?似乎它将与将 Activity 从堆栈中弹出的方式有关。

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

在加载我的应用程序时,第一个 Activity 用于初始化,一旦完成,它就会调用我的主 Activity(一个 TabActivity)。这第一个初始化活动在清单中设置了 android:noHistory="true" ,因此从我的主活动按返回不会回到那个状态。它进入启动器。当我第二次在启动器中单击我的应用程序时,初始化活动再次加载,并在完成后加载主活动。几乎立即,它加载了我的主要活动的第二个实例。但只有在应用程序已经运行一次,并通过从主 Activity 中按 BACK 退出后。它每次都会执行此操作,直到我强制退出应用程序或从 IDE 加载新版本。

基于此,我怀疑某种 Activity 实例正在周围并被重用,因为它只发生在我运行应用程序的第二次以上(并以 BACK 退出 - 使用 HOME 只是返回到应用程序的最后一个状态,没什么大不了)。有人有什么想法吗??

4

7 回答 7

11

I've heard that pressing the back button will essentially cause the current Activity to finish(). Is this always the case?

No it is not. The most activities have this behaviour but not all. For example you could create a Dialog and set it setCancelable(false) and it won't close if you click BACK button.

Furthermore you could customize activity behaviour on BACK button pressed by overriding onBackPressed

Called when the activity has detected the user's press of the back key. The default implementation simply finishes the current activity, but you can override this to do whatever you want.

About your application behaviour..Did you verify if the activity launcher is finished after it loads your main activity? I mean if the onDestroy() method is called. Maybe after it runs the main activity it remains there and when you click back you just go back to the old Launcher...

hope this helps..

于 2010-05-10T08:54:32.110 回答
5

通读Android 开发者网站上的活动和任务设计指南;他们解释了 Home 和 Back 按钮是如何工作的。显然,如果您覆盖默认行为(如上面的 hara 所述),后退按钮将不会完成活动。

关于您的具体问题,请检查您的 logcat。您应该能够在那里看到它是使旧流程恢复生机还是启动新流程。如果不清楚,请在 onCreate、onPause、onDestroyed 等中插入一些日志语句,以便您可以准确地看到您的进程发生了什么。

于 2010-05-10T10:09:40.000 回答
2

您可以通过编写以下代码来控制 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);    
}
于 2011-04-06T12:12:48.667 回答
1

您是否使用任何特殊标志(例如 singleInstance 或 singleTop)来运行您的活动?这些可能会导致您看到的奇怪现象。找出导致问题的最简单的方法是用调试消息来填充它。例如:

  1. 在您的初始化活动中,在 onCreate 的开头添加一个日志以获取活动的名称,例如 this.toString()。更多关于你为什么想要这条线稍后。
  2. 当它启动主选项卡式活动时,获取启动活动的名称和一条消息,说明它已启动选项卡式活动。
  3. 覆盖 onPause()、onStop() 和 onDestroy() 回调,并添加带有 this.toString() 的调试行以及一条告诉您它是哪个回调的消息。

这将告诉您是否有多个初始化活动实例。为此,将调用您的主要活动的活动的名称与刚刚创建的活动的名称和经过 onDestroy 的活动的名称进行比较。

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

于 2010-05-10T10:10:00.270 回答
0

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

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

public void onBackPressed() {
    if (!mFragments.popBackStackImmediate()) {
        finish();
    }
}
于 2014-07-14T16:20:58.530 回答
0

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

然而,当 Back 键不应该调用 finish() 时,指南本身也提到了例外情况。最突出的例外是 Web 浏览器,它对每个窗口都有自己的“后退堆栈”,因此它必须有自己的 Back 键自定义处理。

于 2010-07-04T02:21:50.210 回答
0

只需覆盖 onbackpressed().. 后按此方法将执行 remove super 并执行您想做的事情。

于 2017-02-22T09:05:41.387 回答