我听说按下后退按钮实际上会导致当前活动finish()
。总是这样吗?看起来就像它将活动从堆栈中弹出一样。
我不太确定的一种情况是当任务中的根活动被反击时。我目前正在经历一种非常奇怪的效果,描述如下:
在加载我的应用程序时,第一个Activity用于初始化,一旦完成,它将调用我的主Activity(TabActivity)。这个第一个init活动在Manifest中设置了android:noHistory =“true”,因此从我的主Activity中按回来将不会回到那个。它发送到启动器。当我第二次在Launcher中单击我的应用程序时,初始化活动再次加载,并在完成后加载主Activity。几乎在紧接着之后,它会加载我的主Activity的第二个实例。但是只有在应用程序已经运行一次之后,并且通过从主Activity中按BACK退出。它会在每次强制退出应用程序或从IDE加载新版本之前完成。
基于此,我怀疑某种Activity实例正在四处闲置并被重用,因为它只发生在我运行应用程序的第二个+时间(并使用BACK退出 - 使用HOME只返回到最后一个状态应用程序,没什么大不了的。任何人有任何想法??
答案 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?那些可能会导致你看到的奇怪。追踪导致问题的最简单方法是用调试信息填充它。例如:
这将告诉您是否有多个初始化活动实例。通过将调用主活动的活动的名称与刚刚创建的活动的名称和经历过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()..在背面按下此方法将获得执行删除超级并执行您想要执行的操作。