按回来总是导致活动完成()?

我听说按下后退button基本上会导致当前活动finish() 。 这总是如此吗? 看起来就像它将popupActivity的方式一样。

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

在加载我的应用程序,第一个活动是为了初始化,一旦完成,它调用我的主要活动(TabActivity)。 这个第一个init活动在Manifest中设置了android:noHistory =“true”,所以按下Back从我的主Activity中不会回到那个。 它发送到启动器。 当我再次点击启动器中的应用程序时,初始化活动再次加载,并在完成时加载主活动。 几乎马上,它加载我的主要活动的第二个实例。 但是只有在应用程序已经运行一次之后,并且通过从主Activity中按BACK退出。 它每隔一段时间都会执行,直到我强制退出应用程序或从IDE加载新版本。

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

Solutions Collecting From Web of "按回来总是导致活动完成()?"

我听说按下后退button基本上会导致当前活动完成()。 这总是如此吗?

不它不是。 大多数活动都有这种行为,但不是全部。 例如,您可以创build一个对话框并将其设置为setCancelable(false) ,如果您单击BACKbutton,它将不会closures。

此外,您可以通过覆盖onBackPressed按下BACKbutton来自定义活动行为

当活动检测到用户按下后退键时调用。 默认的实现只是完成当前的活动,但是你可以覆盖它来做你想做的任何事情。

关于您的应用程序behaviour..Did你确认活动启动程序是否完成后加载您的主要活动? 我的意思是如果onDestroy()方法被调用。 也许在运行主要活动后,它仍然在那里,当你点击返回时,只需回到旧的启动器…

希望这可以帮助..

仔细阅读Android开发人员网站上的活动和任务devise指南 ; 他们解释了Home和Backbutton是如何工作的。 显然,如果你重写默认行为(如上面hara所述),后退button不会完成活动。

在你的具体问题上,检查你的logcat。 你应该能够看到它是否使旧的过程恢复正常或者开始新的过程。 如果不清楚的话,可以在onCreate,onPause,onDestroyed等处插入一些日志语句,这样就可以看到你的进程到底发生了什么。

您可以通过编写以下代码来控制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); } 

你是否正在使用任何特殊的标志(如singleInstance或singleTop)来运行你的活动? 那些可能会导致你所看到的古怪。 追查是什么导致你的问题的最简单的方法是绝对填充debugging信息。 例如:

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

这将会告诉你是否有多个初始化活动的实例存在。 通过比较调用主要活动的活动的名称与刚才创build的活动的名称以及通过onDestroy的活动的名称。

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

原来问题的简短答案是“不”。 这很大程度上是因为,不幸的是,并不是每个开发者都遵循以前的答案引用的准则

然而,Guidleines自己提到的例外情况是,Back键不应该调用finish()。 最突出的例外是Web浏览器,每个窗口都有自己的“后退堆栈”,所以它必须具有自己的Back键自定义处理。

如果返回堆栈中没有碎片,并且开发人员没有重写onBackPressed,则在按下后退button时,活动将结束。

这里是Android 4.4.2的源代码Activity.onBackPressed():

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

只是覆盖onbackpressed()..在后面按此方法将得到执行删除超级,做你想做的事情。