检测开/关键按Android
Posted
技术标签:
【中文标题】检测开/关键按Android【英文标题】:Detect on/off Key Press Android 【发布时间】:2011-10-14 11:30:50 【问题描述】:如何检测按下的电源按钮或锁定屏幕按钮?当我的游戏以这种方式暂停时,可能会导致游戏崩溃,因为我需要在发生这种情况时暂停一个线程。
【问题讨论】:
通过正确实施活动生命周期,特别是针对各种消息采取适当的措施,您的问题可能会得到更好的解决。 您不应该寻找按键来修复您的应用程序。 android 生命周期是一个更好的选择,应该可以解决当用户退出或暂停游戏时暂停游戏的问题。您是否尝试过在游戏的Activity
中覆盖onPause
?
我已经这样做了,但我认为我现在处理我的线程不正确。我将不得不回去,也许尝试用不同的方法管理它们,然后在 onPause 方法中编写处理锁屏问题的代码
【参考方案1】:
来自克里斯蒂安对this question的回答:
public boolean onKeyDown(int keyCode, KeyEvent event)
if (event.getKeyCode() == KeyEvent.KEYCODE_POWER)
// do what you want with the power button
return true;
return super.onKeyDown(keyCode, event);
不过,Jake Basile 是对的。除非您有充分的理由在按下电源按钮时执行特殊操作,否则您应该使用标准的 Android 生命周期函数。
按下电源按钮时,它将调用应用程序的 onPause() 方法,而当您解锁设备时,它将调用 onResume()。这是您应该管理线程以防止应用崩溃的地方。
documentation on Activity's 将详细描述生命周期函数、何时调用它们以及如何使用它们。
【讨论】:
你能说得更具体点吗?你到底想做什么? 在 KitKat 中,我刚刚注意到单击电源按钮现在会调用 onStop() !!!这是一个很大的变化,从来没有像这样。【参考方案2】:使用onPause
和onResume
方法。当您的应用不再处于前台时(出现锁定屏幕时)或手机进入睡眠状态以及您的应用返回前台时,将调用这些函数。
这是 Android 中 Activity 生命周期的标准流程,有更完整的文档here。
【讨论】:
我有一种感觉,这将是如何做到的。唯一的问题是现在我已经在使用这些方法来杀死我的线程并在用户想要退出游戏时将游戏屏幕带回菜单......所以这一定是当这个按钮是游戏完全崩溃的原因按下...嗯可能不得不以不同的方式处理事情。 您可以尝试将它们移至onStart
和/或onStop
,看看会发生什么。可能需要在生命周期中更早或更晚才能避免线程问题。
谢谢,我会试试的,运行多个线程似乎总是很麻烦......我会接受你的回答,但这里的另一个答案似乎回答了我所问的问题,即使我意识到我应该正在以不同的方式使用 Android 活动生命周期方法实现我的线程管理...【参考方案3】:
这个问题的很多答案都忽略了这样一个事实,即在编写应用程序时,了解哪个事件导致调用特定的标准 Android 生命周期函数非常重要。有一个 onBackPressed() 函数;为什么没有 onPowerPressed() 和 onHomePressed() 呢?应用程序通常需要在标准生命周期函数中做不同的事情,具体取决于哪个事件导致它们被调用。现在,要弄清楚标准生命周期方法是由于按下主页按钮还是按下电源按钮而被调用的,真的很痛苦。
【讨论】:
【参考方案4】:要检测 Android 应用是启动还是停止,您可以使用以下规则 (reference):
当用户进入时,onResume 总是被调用(在当前的活动上) 当用户离开时,总是会调用 onStop(在当前活动上),除非按下电源按钮(关闭),您可能只会看到 onPause 调用。 当用户在活动之间移动时,总是在新活动上调用 onResume,在旧活动上总是调用 onStop。 onResume 调用总是在 onStop 之前【讨论】:
@Jean-François Fabre 你觉得我包含的链接没有帮助吗?它提供了我给出的答案背后的证据,并且提供了更多细节,因此我希望它会有所帮助。 我删除了它,因为答案末尾的链接(特别是博客)被认为是垃圾邮件【参考方案5】:覆盖生命周期方法。 Android中不再允许检测被选为答案的电源按钮按下的解决方案()
【讨论】:
以上是关于检测开/关键按Android的主要内容,如果未能解决你的问题,请参考以下文章