如何处理电源按钮(Android)

3

我正在使用AndEngine开发游戏。当我按下电源按钮时,onPause()方法没有被调用。我该如何解决这个问题?

    @Override
protected void onPause() {      
    //this method is not calling when press power button 
    super.onPause(); 
    this.mEngine.onPause() ;
}

2
除了onPause,你知道它还可能调用什么吗? - JoxTraex
为什么应该在按下电源按钮后立即调用它? - sandrstar
1
@supriya 这应该可以工作。在那里打印一些日志。 - Pratik Sharma
1
@sandrstar 因为它应该 :) - Timmetje
你是在按下关闭屏幕的按钮,而不是长按以关机?听起来可能很傻,但只是问一下... - Simon
关闭屏幕应该调用 onPause()。关机时,应该销毁活动。实际上,在 onStop()onDestroy() 之前也要执行 onPause() - Timmetje
1个回答

2
奇怪,我没有听说过不会被称为的问题。让我稍微研究一下。
好的,按电源键应该始终调用onPause(),你的代码中似乎存在某种bug。您能否添加一些日志调用来跟踪每个步骤,并打印DDMS日志。
其他可能的问题:
似乎有些设备在按电源按钮时会调用两次onPause()。
在这种情况下,请尝试使用powerManager查看屏幕是否实际关闭。
PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
if (pm.isScreenOn()) {
   //now do stuff
}

也许会调用onPause(),但紧接着会调用onCreate()
当你关闭设备时,锁屏会显示。这通常会强制显示到特定的方向。如果屏幕当前不处于该方向,则需要更改,并相应地更改顶部活动的配置以匹配。
您可以像这样添加配置更改:
android:configChanges="keyboardHidden|orientation" android:configChanges="keyboardHidden|screensize"

为了确保这种情况不会发生。

我不确定为什么要这样做。希望能提供有关文档的任何参考。我认为有时在某些设备上,锁定按钮可能会被误按,因此保持活动状态几秒钟可能是合理的。 - sandrstar
当按下电源按钮时,它将调用应用程序的onPause()方法,而当您解锁设备时,它将调用onResume()方法。这就是Android活动生命周期由Android操作系统管理的方式。 - Timmetje
1
如果屏幕前台的活动(在堆栈顶部)处于活动或运行状态。如果您按电源键,则主屏幕已将焦点从您的活动中取走,并关闭屏幕。如果一个活动失去了焦点,但仍然可见(也就是说,一个新的非全尺寸或透明的活动在您的活动之上拥有焦点),它将被暂停。http://developer.android.com/reference/android/app/Activity.html#ActivityLifecycle https://dev59.com/NFnUa4cB1Zd3GeqPcqtp - Timmetje
这就是它应该的行为,除非手机设置可以改变电源行为,使其绝对不做任何事情。但是电源按钮总是会使您的活动失去焦点,至少调用 onPause(),因为活动将遵循其状态路径,并且在我提供的文档中有说明。 - Timmetje
是的,它看起来很合乎逻辑(文档也提供了关于失去焦点的解释),但是文档仍然允许手机制造商不通过按电源键启动主屏幕或者引入延迟来实现。只是好奇是否有任何手机是这样实现的。 - sandrstar
真实但除了“什么也不做”之外的任何其他操作都会使当前活动失去焦点,从而调用onPause()。因此,唯一的解决方法是确保电源按钮无法使用且不起作用。我怀疑任何制造商都不会这样做。 - Timmetje

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接