手机锁屏后再开屏锁,还没开屏锁,5s屏幕失灵锁屏再开就这样爆亮了,是什么原因造成


有一部分三星的手机关闭屏幕以后,刚打开屏幕,前台的activity就会resume状态,因为我们使用cocos2d-x引擎,默认resume和activity的resume事件是一致的,我们在resume里把关闭的声音重新打开,所以导致,用户点亮屏幕以后(尚未解锁),就会听到游戏内的声音(如果在关闭屏幕时我们游戏处于前台)。
为了解决这个问题,我们需要修改我们resume触发的时机。确保在解锁以后才进入我们游戏的resume状态。 那么我们游戏应该在什么时机进入resume状态呢?
系统activity进入resume状态时刻,并且屏幕是亮的,屏幕未锁定屏幕刚刚亮起,并且屏幕 未锁定,系统activity已经进入resume状态屏幕 解锁,这是屏幕肯定是亮的,并且activity已经进入resume状态
那么有了上面的三点相信逻辑代码不难写,下面介绍一下如何坚挺系统屏幕灭,屏幕亮,解锁屏幕 的事件,以及如何判断当前屏幕 是否是解锁状态(因为用户可以设置关闭屏幕后是否锁定屏幕 ,所以解锁屏幕 事件可能根本就不会被触发,那么我们就不能通过跟踪事件来确定其状态)
要坚挺屏幕亮、屏幕灭、屏幕 解锁三个事件我们需要在代码中注册监听ACTION_SCREEN_ON、ACTION_SCREEN_OFF、ACTION_USER_PRESENT三个Action,具体的写法如下:
&* screen状态广播接收者
class ScreenBroadcastReceiver extends
BroadcastReceiver{
&&&&@Override
&&&&public
void onReceive(Context context, Intent intent) {
&&&&&&&&if(Intent.ACTION_SCREEN_ON.equals(intent.getAction())){&&&&&&&&&&&&
&&&&&&&&&&&&mScreenStateListener.onScreenOn();
&&&&&&&&}else
if(Intent.ACTION_SCREEN_OFF.equals(intent.getAction())){
&&&&&&&&&&&&mScreenStateListener.onScreenOff();
&&&&&&&&}else
if(Intent.ACTION_USER_PRESENT.equals(intent.getAction())){
&&&&&&&&&&&&mScreenStateListener.onUserPresent();
&* 停止screen状态更新
void stopScreenStateUpdate() {
&&&&mContext.unregisterReceiver(mScreenReceiver);
&* 启动screen状态广播接收器
void startScreenBroadcastReceiver() {
&&&&IntentFilter filter =
new IntentFilter();
&&&&filter.addAction(Intent.ACTION_SCREEN_ON);
&&&&filter.addAction(Intent.ACTION_SCREEN_OFF);
&&&&filter.addAction(Intent.ACTION_USER_PRESENT);
&&&&mContext.registerReceiver(mScreenReceiver, filter);
因为屏幕在灭了以后是否锁定可以由用户设置,所以我们不能通过跟踪解锁事件来判断其状态,需要一个可以时时获取状态的函数:
final static
boolean isScreenLocked(Context c) {
&&&&android.app.KeyguardManager mKeyguardManager = (KeyguardManager) c.getSystemService(c.KEYGUARD_SERVICE);
&&&&return
mKeyguardManager.inKeyguardRestrictedInputMode();
需要注意的是,大部分事件都可以在Manifest.xml中注册,但是ACTION_SCREEN_ON、ACTION_SCREEN_OFF、ACTION_USER_PRESENT这几个事件在PowerManager那边做了限制,必须像上面那样在代码中注册,才能监听到,所以大家不要踩到坑哦~~~
下面是包装屏幕事件的一个类代码,仅供参考:
com.example.
java.lang.reflect.M
android.app.A
android.app.KeyguardM
android.content.BroadcastR
android.content.C
android.content.I
android.content.IntentF
android.os.PowerM
android.util.L
&* 监听屏幕ON和OFF PRESENT状态
&* @author
class ScreenObserver {
&&&&private
static String TAG =
&ScreenObserver&;
&&&&private
Context mC
&&&&private
ScreenBroadcastReceiver mScreenR
&&&&private
ScreenStateListener mScreenStateL
&&&&private
static Method mReflectScreenS
&&&&public
ScreenObserver(Context context) {
&&&&&&&&mContext =
&&&&&&&&mScreenReceiver =
new ScreenBroadcastReceiver();
&&&&&&&&try
&&&&&&&&&&&&mReflectScreenState = PowerManager.class.getMethod(&isScreenOn&,
&&&&&&&&&&&&&&&&&&&&new
Class[] {});
catch (Exception nsme) {
&&&&&&&&&&&&Log.d(TAG,
&API & 7,& + nsme);
&&&&&* screen状态广播接收者
&&&&private
class ScreenBroadcastReceiver
extends BroadcastReceiver {
&&&&&&&&@Override
&&&&&&&&public
void onReceive(Context context, Intent intent) {
&&&&&&&&&&&&if
(Intent.ACTION_SCREEN_ON.equals(intent.getAction())) {
&&&&&&&&&&&&&&&&mScreenStateListener.onScreenOn();
&&&&&&&&&&&&}
(Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {
&&&&&&&&&&&&&&&&mScreenStateListener.onScreenOff();
&&&&&&&&&&&&}
(Intent.ACTION_USER_PRESENT.equals(intent.getAction())) {
&&&&&&&&&&&&&&&&mScreenStateListener.onUserPresent();
&&&&&&&&&&&&}
&&&&&* 请求screen状态更新
&&&&public
void requestScreenStateUpdate(ScreenStateListener listener) {
&&&&&&&&mScreenStateListener =
&&&&&&&&startScreenBroadcastReceiver();
&&&&&&&&firstGetScreenState();
&&&&&* 第一次请求screen状态
&&&&private
void firstGetScreenState() {
&&&&&&&&PowerManager manager = (PowerManager) mContext
&&&&&&&&&&&&&&&&.getSystemService(Activity.POWER_SERVICE);
&&&&&&&&if
(isScreenOn(manager)) {
&&&&&&&&&&&&if
(mScreenStateListener != null) {
&&&&&&&&&&&&&&&&mScreenStateListener.onScreenOn();
&&&&&&&&&&&&}
&&&&&&&&&&&&if
(mScreenStateListener != null) {
&&&&&&&&&&&&&&&&mScreenStateListener.onScreenOff();
&&&&&&&&&&&&}
&&&&&* 停止screen状态更新
&&&&public
void stopScreenStateUpdate() {
&&&&&&&&mContext.unregisterReceiver(mScreenReceiver);
&&&&&* 启动screen状态广播接收器
&&&&private
void startScreenBroadcastReceiver() {
&&&&&&&&IntentFilter filter =
new IntentFilter();
&&&&&&&&filter.addAction(Intent.ACTION_SCREEN_ON);
&&&&&&&&filter.addAction(Intent.ACTION_SCREEN_OFF);
&&&&&&&&filter.addAction(Intent.ACTION_USER_PRESENT);
&&&&&&&&mContext.registerReceiver(mScreenReceiver, filter);
&&&&&* screen是否打开状态
&&&&private
static boolean
isScreenOn(PowerManager pm) {
&&&&&&&&boolean
&&&&&&&&try
&&&&&&&&&&&&screenState = (Boolean) mReflectScreenState.invoke(pm);
catch (Exception e) {
&&&&&&&&&&&&screenState =
&&&&&&&&return
&&&&public
interface ScreenStateListener {
&&&&&&&&public
void onScreenOn();
&&&&&&&&public
void onScreenOff();
&&&&&&&&public
void onUserPresent();
&&&&public
final static
boolean isScreenLocked(Context c) {
&&&&&&&&android.app.KeyguardManager mKeyguardManager = (KeyguardManager) c
&&&&&&&&&&&&&&&&.getSystemService(c.KEYGUARD_SERVICE);
&&&&&&&&return
mKeyguardManager.inKeyguardRestrictedInputMode();
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:184895次
积分:2729
积分:2729
排名:第13020名
原创:13篇
转载:509篇
(13)(154)(94)(109)(50)(78)(19)(5)12871人阅读
android(10)
有一部分三星的手机关闭屏幕以后,刚打开屏幕,前台的activity就会resume状态,因为我们使用cocos2d-x引擎,默认resume和activity的resume事件是一致的,我们在resume里把关闭的声音重新打开,所以导致,用户点亮屏幕以后(尚未解锁),就会听到游戏内的声音(如果在关闭屏幕时我们游戏处于前台)。
为了解决这个问题,我们需要修改我们resume触发的时机。确保在解锁以后才进入我们游戏的resume状态。
那么我们游戏应该在什么时机进入resume状态呢?
系统activity进入resume状态时刻,并且屏幕是亮的,屏幕未锁定屏幕刚刚亮起,并且屏幕&未锁定,系统activity已经进入resume状态屏幕&解锁,这是屏幕肯定是亮的,并且activity已经进入resume状态
那么有了上面的三点相信逻辑代码不难写,下面介绍一下如何坚挺系统屏幕灭,屏幕亮,解锁屏幕&的事件,以及如何判断当前屏幕&是否是解锁状态(因为用户可以设置关闭屏幕后是否锁定屏幕&,所以解锁屏幕&事件可能根本就不会被触发,那么我们就不能通过跟踪事件来确定其状态)
要坚挺屏幕亮、屏幕灭、屏幕&解锁三个事件我们需要在代码中注册监听ACTION_SCREEN_ON、ACTION_SCREEN_OFF、ACTION_USER_PRESENT三个Action,具体的写法如下:
* screen状态广播接收者
private class ScreenBroadcastReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent) {
if(Intent.ACTION_SCREEN_ON.equals(intent.getAction())){
mScreenStateListener.onScreenOn();
}else if(Intent.ACTION_SCREEN_OFF.equals(intent.getAction())){
mScreenStateListener.onScreenOff();
}else if(Intent.ACTION_USER_PRESENT.equals(intent.getAction())){
mScreenStateListener.onUserPresent();
* 停止screen状态更新
public void stopScreenStateUpdate() {
mContext.unregisterReceiver(mScreenReceiver);
* 启动screen状态广播接收器
private void startScreenBroadcastReceiver() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_USER_PRESENT);
mContext.registerReceiver(mScreenReceiver, filter);
因为屏幕在灭了以后是否锁定可以由用户设置,所以我们不能通过跟踪解锁事件来判断其状态,需要一个可以时时获取状态的函数:
//判断屏幕是否被锁定
public final static boolean isScreenLocked(Context c) {
android.app.KeyguardManager mKeyguardManager = (KeyguardManager) c.getSystemService(c.KEYGUARD_SERVICE);
return mKeyguardManager.inKeyguardRestrictedInputMode();
需要注意的是,大部分事件都可以在AndroidManifest.xml中注册,但是ACTION_SCREEN_ON、ACTION_SCREEN_OFF、ACTION_USER_PRESENT这几个事件在PowerManager那边做了限制,必须像上面那样在代码中注册,才能监听到,所以大家不要踩到坑哦~~~
下面是包装屏幕事件的一个类代码,仅供参考:
package com.example.
import java.lang.reflect.M
import android.app.A
import android.app.KeyguardM
import android.content.BroadcastR
import android.content.C
import android.content.I
import android.content.IntentF
import android.os.PowerM
import android.util.L
* 监听屏幕ON和OFF PRESENT状态
public class ScreenObserver {
private static String TAG = &ScreenObserver&;
private Context mC
private ScreenBroadcastReceiver mScreenR
private ScreenStateListener mScreenStateL
private static Method mReflectScreenS
public ScreenObserver(Context context) {
mContext =
mScreenReceiver = new ScreenBroadcastReceiver();
mReflectScreenState = PowerManager.class.getMethod(&isScreenOn&,
new Class[] {});
} catch (Exception nsme) {
Log.d(TAG, &API & 7,& + nsme);
* screen状态广播接收者
private class ScreenBroadcastReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())) {
mScreenStateListener.onScreenOn();
} else if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {
mScreenStateListener.onScreenOff();
} else if (Intent.ACTION_USER_PRESENT.equals(intent.getAction())) {
mScreenStateListener.onUserPresent();
* 请求screen状态更新
public void requestScreenStateUpdate(ScreenStateListener listener) {
mScreenStateListener =
startScreenBroadcastReceiver();
firstGetScreenState();
* 第一次请求screen状态
private void firstGetScreenState() {
PowerManager manager = (PowerManager) mContext
.getSystemService(Activity.POWER_SERVICE);
if (isScreenOn(manager)) {
if (mScreenStateListener != null) {
mScreenStateListener.onScreenOn();
if (mScreenStateListener != null) {
mScreenStateListener.onScreenOff();
* 停止screen状态更新
public void stopScreenStateUpdate() {
mContext.unregisterReceiver(mScreenReceiver);
* 启动screen状态广播接收器
private void startScreenBroadcastReceiver() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_USER_PRESENT);
mContext.registerReceiver(mScreenReceiver, filter);
* screen是否打开状态
private static boolean isScreenOn(PowerManager pm) {
boolean screenS
screenState = (Boolean) mReflectScreenState.invoke(pm);
} catch (Exception e) {
screenState =
return screenS
// 外部调用接口
public interface ScreenStateListener {
public void onScreenOn();
public void onScreenOff();
public void onUserPresent();
public final static boolean isScreenLocked(Context c) {
android.app.KeyguardManager mKeyguardManager = (KeyguardManager) c
.getSystemService(c.KEYGUARD_SERVICE);
return mKeyguardManager.inKeyguardRestrictedInputMode();
上面代码参考:,特此注明。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:138539次
积分:1691
积分:1691
排名:千里之外
原创:25篇
评论:14条
(3)(7)(5)(1)(2)(2)(3)(2)(3)(2)(2)(1)经验926 米
在线时间115 小时
版本5.11.19
积分 1157, 距离下一级还需 843 积分
积分 1157, 距离下一级还需 843 积分
机型小米手机2/2S
签到次数30
MIUI版本5.11.19
如题。手机是小米2,以前有个很奇怪的BUG,
我也发帖反映过。具体问题是有时候按电源键解锁屏幕,手机无任何反映,确定已经按下电源键,
不是用力小的问题,而且也可以排除是程序开大多导致滞后的问题,
因为当时锁屏前没运行任何程序,而且按下电源键解锁屏幕后等了1分钟,屏幕也没有任何动静。
解决方法是再按两次电源键,按到第三次才能解锁。(按第二次和按第一次一样无任何反映,而且只要按第一次不亮按第二次极大几率没反映,必须第三次按电源键。不过,按第三次必定可以解锁。)
另外可以确定不是我按电源键按得太急,因为都有间隔。
这个问题很遗憾无法重现,因为它是随机的,大概2到3天出现一次。
我猜想这个应该不是硬件问题,因为每次出现这个问题后,过几分钟再试验,
解锁均是一次即可,无任何异常。
后来通过刷稳定版和最新的开发版都没能解决。有次偶然的找到了原因,是因为安装了第三方的一键锁屏软件造成的。
我用的是这个 /apk/3682/关屏锁定:Screen Off and Lock 1.14已付费版
因为这软件是少数锁屏后不会亮屏的锁屏软件,估计也有人会遇到这个问题。
卸载后,再也没出现解锁要按几次的情况了。
有朋友可能会问,那用什么一键锁屏呢。
其实V5自带了这个功能。开启方法如下:
点菜单键-编辑模式-再点菜单键-添加-开关-锁屏。就放到桌面了。
感谢大大教的方法。
希望这篇文章能对被锁屏困扰的朋友有所帮助!
分享到微信朋友圈
打开微信,点击底部的“发现”,使用 “扫一扫” 即可将网页分享到我的朋友圈。
经验2062 米
在线时间73 小时
版本7.6.10
积分 2267, 距离下一级还需 2733 积分
积分 2267, 距离下一级还需 2733 积分
机型红米Note3 全网通
签到次数119
MIUI版本7.6.10
通过手机发布
经验926 米
在线时间115 小时
版本5.11.19
积分 1157, 距离下一级还需 843 积分
积分 1157, 距离下一级还需 843 积分
机型小米手机2/2S
签到次数30
MIUI版本5.11.19
桌面按一下菜单键 点 编辑模式-再点菜单键-添加-开关-锁屏。就放到桌面了
1000万用户纪念勋章
MIUI1000万用户纪念勋章
关注腾讯微博
已关注腾讯微博
关注新浪微博
已关注新浪微博
Copyright (C) 2017 MIUI
京ICP备号 | 京公网安备34号 | 京ICP证110507号1397人阅读
Java/Android(260)
有一部分三星的手机关闭屏幕以后,刚打开屏幕,前台的activity就会resume状态,因为我们使用cocos2d-x引擎,默认resume和activity的resume事件是一致的,我们在resume里把关闭的声音重新打开,所以导致,用户点亮屏幕以后(尚未解锁),就会听到游戏内的声音(如果在关闭屏幕时我们游戏处于前台)。
为了解决这个问题,我们需要修改我们resume触发的时机。确保在解锁以后才进入我们游戏的resume状态。
那么我们游戏应该在什么时机进入resume状态呢?
系统activity进入resume状态时刻,并且屏幕是亮的,屏幕未锁定屏幕刚刚亮起,并且屏幕&未锁定,系统activity已经进入resume状态屏幕&解锁,这是屏幕肯定是亮的,并且activity已经进入resume状态
那么有了上面的三点相信逻辑不难写,下面介绍一下如何监听系统屏幕灭,屏幕亮,解锁屏幕&的事件,以及如何判断当前屏幕&是否是解锁状态(因为用户可以设置关闭屏幕后是否锁定屏幕&,所以解锁屏幕&事件可能根本就不会被触发,那么我们就不能通过跟踪事件来确定其状态)
要监听屏幕亮、屏幕灭、屏幕&解锁三个事件我们需要在代码中注册监听ACTION_SCREEN_ON、ACTION_SCREEN_OFF、ACTION_USER_PRESENT三个Action,具体的写法如下:
* screen状态广播接收者
private class ScreenBroadcastReceiver extends BroadcastReceiver{
public void onReceive(Context context, Intent intent) {
if(Intent.ACTION_SCREEN_ON.equals(intent.getAction())){
mScreenStateListener.onScreenOn();
}else if(Intent.ACTION_SCREEN_OFF.equals(intent.getAction())){
mScreenStateListener.onScreenOff();
}else if(Intent.ACTION_USER_PRESENT.equals(intent.getAction())){
mScreenStateListener.onUserPresent();
* 停止screen状态更新
public void stopScreenStateUpdate() {
mContext.unregisterReceiver(mScreenReceiver);
* 启动screen状态广播接收器
private void startScreenBroadcastReceiver() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_USER_PRESENT);
mContext.registerReceiver(mScreenReceiver, filter);
因为屏幕在灭了以后是否锁定可以由用户设置,所以我们不能通过跟踪解锁事件来判断其状态,需要一个可以时时获取状态的函数:
//判断屏幕是否被锁定
public final static boolean isScreenLocked(Context c) {
android.app.KeyguardManager mKeyguardManager = (KeyguardManager) c.getSystemService(c.KEYGUARD_SERVICE);
return mKeyguardManager.inKeyguardRestrictedInputMode();
需要注意的是,大部分事件都可以在AndroidManifest.xml中注册,但是ACTION_SCREEN_ON、ACTION_SCREEN_OFF、ACTION_USER_PRESENT这几个事件在PowerManager那边做了限制,必须像上面那样在代码中注册,才能监听到,所以大家不要踩到坑哦~~~
下面是包装屏幕事件的一个类代码,仅供参考:
package com.example.
import java.lang.reflect.M
import android.app.A
import android.app.KeyguardM
import android.content.BroadcastR
import android.content.C
import android.content.I
import android.content.IntentF
import android.os.PowerM
import android.util.L
* 监听屏幕ON和OFF PRESENT状态
public class ScreenObserver {
private static String TAG = &ScreenObserver&;
private Context mC
private ScreenBroadcastReceiver mScreenR
private ScreenStateListener mScreenStateL
private static Method mReflectScreenS
public ScreenObserver(Context context) {
mContext =
mScreenReceiver = new ScreenBroadcastReceiver();
mReflectScreenState = PowerManager.class.getMethod(&isScreenOn&,
new Class[] {});
} catch (Exception nsme) {
Log.d(TAG, &API & 7,& + nsme);
* screen状态广播接收者
private class ScreenBroadcastReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
if (Intent.ACTION_SCREEN_ON.equals(intent.getAction())) {
mScreenStateListener.onScreenOn();
} else if (Intent.ACTION_SCREEN_OFF.equals(intent.getAction())) {
mScreenStateListener.onScreenOff();
} else if (Intent.ACTION_USER_PRESENT.equals(intent.getAction())) {
mScreenStateListener.onUserPresent();
* 请求screen状态更新
public void requestScreenStateUpdate(ScreenStateListener listener) {
mScreenStateListener =
startScreenBroadcastReceiver();
firstGetScreenState();
* 第一次请求screen状态
private void firstGetScreenState() {
PowerManager manager = (PowerManager) mContext
.getSystemService(Activity.POWER_SERVICE);
if (isScreenOn(manager)) {
if (mScreenStateListener != null) {
mScreenStateListener.onScreenOn();
if (mScreenStateListener != null) {
mScreenStateListener.onScreenOff();
* 停止screen状态更新
public void stopScreenStateUpdate() {
mContext.unregisterReceiver(mScreenReceiver);
* 启动screen状态广播接收器
private void startScreenBroadcastReceiver() {
IntentFilter filter = new IntentFilter();
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_USER_PRESENT);
mContext.registerReceiver(mScreenReceiver, filter);
* screen是否打开状态
private static boolean isScreenOn(PowerManager pm) {
boolean screenS
screenState = (Boolean) mReflectScreenState.invoke(pm);
} catch (Exception e) {
screenState =
return screenS
// 外部调用接口
public interface ScreenStateListener {
public void onScreenOn();
public void onScreenOff();
public void onUserPresent();
public final static boolean isScreenLocked(Context c) {
android.app.KeyguardManager mKeyguardManager = (KeyguardManager) c
.getSystemService(c.KEYGUARD_SERVICE);
return mKeyguardManager.inKeyguardRestrictedInputMode();
上面代码参考:,特此注明。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:2771710次
积分:24050
积分:24050
排名:第258名
原创:76篇
转载:1131篇
评论:308条
(21)(17)(6)(2)(9)(22)(18)(25)(67)(31)(32)(27)(56)(13)(12)(8)(33)(32)(36)(12)(34)(42)(30)(17)(11)(3)(5)(11)(18)(17)(13)(17)(7)(6)(27)(19)(47)(1)(19)(11)(2)(1)(25)(20)(10)(6)(2)(8)(3)(10)(9)(6)(4)(15)(7)(2)(7)(8)(50)(14)(11)(26)(20)(4)(1)(5)(14)(12)(4)(4)(3)(2)(4)(2)(4)(1)(1)(1)(3)(2)(11)(3)(8)(15)(2)(1)

我要回帖

更多关于 手机锁屏后黑屏打不开 的文章

 

随机推荐