【问题标题】:How to prevent calls to onDestroy() followed by onCreate() when power button is pressed on Android在Android上按下电源按钮时如何防止调用onDestroy()然后调用onCreate()
【发布时间】:2011-11-28 20:54:44
【问题描述】:

我正在记录每个 onCreate() 和 onDestroy() 调用。我发现一旦我点击我的 Android 上的电源按钮(以及在模拟器上!)我的活动中的电话

> onDestroy();
> onCreate();

这会杀死我的游戏,然后立即从头重新打开它。当然,一旦用户解锁屏幕,游戏就会显示在主菜单中,所有进度都会被终止。

是否可以覆盖或禁用此行为?

【问题讨论】:

  • 为什么不在 onDestroy() 方法中保存进度,在 onCreate() 方法中检查保存的游戏(并恢复进度)?

标签: android android-activity


【解决方案1】:

当您按下电源按钮时,通常会启动屏幕锁定。这可能会触发当前处于前台的 Activity 的配置更改(屏幕锁定通常处于纵向模式),导致它被破坏并重新创建。

在 AndroidManifest.xml 中为此类活动声明 android:configChanges="keyboardHidden|orientation" 可防止它们被销毁和重新创建,但也意味着您将通过覆盖 onConfigurationChanged 自行处理配置更改(如有必要)

【讨论】:

  • 这是正确答案!但是请注意,如果您的目标是 API 13 或更高版本,那么按下电源按钮也会触发“screenSize”的更改。因此,这也需要被覆盖以获得所需的行为: android:configChanges="keyboardHidden|orientation|screenSize"
  • 我没有注意到 API13 上的 screenSize 变化,补充说它为我解决了问题,谢谢。
【解决方案2】:

当onCreate() 和onDestroy() 方法被调用时,您不能覆盖(至少在没有经历过巨大痛苦的情况下不会)。你最好的办法是弄清楚如何在他们被叫到的范围内工作。将您的状态保存在onDestroy()。让它让你的应用程序可以容忍这个调用序列,因为坦率地说,它应该/必须这样做。这就是 android 的工作原理。

【讨论】:

  • 如何检测到此呼叫来自电源按钮?
  • 据我所知,你不能。但这没关系,因为最终为什么调用onDestroy() 或onCreate() 并不重要,只是它们被调用了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-08-11
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
  • 1970-01-01
  • 2019-08-23
  • 2012-01-23
相关资源
最近更新 更多