功能需求:如微信视频通话一样,在锁屏、灭屏状态下点亮屏幕,弹出界面
一、首先判断是否在锁屏状态下
代码判断
1:判断屏幕是亮了还是暗了
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
boolean isScreenOn = pm.isScreenOn();//如果为true,表示屏幕“亮”了,false则屏幕“暗”了。
2:判断是否锁屏了
KeyguardManager mKeyguardManager = (KeyguardManager) context.getSystemService(Context.KEYGUARD_SERVICE);
boolean flag = mKeyguardManager.inKeyguardRestrictedInputMode();//flag为true表示锁屏,flag为false表示未锁屏
广播监听开屏、锁屏、解锁状态
在系统状态改变
如:蓝牙、wifi、锁屏 状态改变的时候都会发送一条系统广播,我们接受广播判断状态即可监听这些的状态;
我们只需要创建一个广播接收器监听就行
private class ScreenBroadcastReceiver extends BroadcastReceiver {
private String action = null;
@Override
public void onReceive(Context context, Intent intent) {
action = intent.getAction();
if (Intent.ACTION_SCREEN_ON.equals(action)) {
// 接收到开屏广播
} else if (Intent.ACTION_SCREEN_OFF.equals(action)) {
// 接收到锁屏广播
} else if (Intent.ACTION_USER_PRESENT.equals(action)) {
// 接受到解锁广播
}
}
}
ScreenBroadcastReceiver screen=new ScreenBroadcastReceiver ();//实例化一下广播接收器
IntentFilter filter = new IntentFilter();//添加一个过滤器只接受这三种广播
filter.addAction(Intent.ACTION_SCREEN_ON);
filter.addAction(Intent.ACTION_SCREEN_OFF);
filter.addAction(Intent.ACTION_USER_PRESENT);
registerReceiver(screen, filter);
二、点亮屏幕和弹出界面
1:点亮屏幕(需求可以不使用这部分代码)
下列代码在服务和活动中都可以使用,只能点亮屏幕,不能弹出界面,部分没有密码的手机可以直接打开锁屏
private static PowerManager mPowerManager;
private static PowerManager.WakeLock mWakeLock;
//点亮屏幕
@SuppressLint("InvalidWakeLockTag")
private void wakeLock(){
Log.i(TAG, "wakeLock:点亮屏幕30秒");
//亮屏逻辑代码
if (mPowerManager == null) {
mPowerManager = (PowerManager) getSystemService(Context.POWER_SERVICE);
}
if (mWakeLock == null) {
mWakeLock = mPowerManager.newWakeLock(PowerManager.ACQUIRE_CAUSES_WAKEUP | PowerManager.SCREEN_DIM_WAKE_LOCK, "TAG");
}
boolean screenOn = mPowerManager.isScreenOn();
if (!screenOn) {
//屏幕会持续点亮
mWakeLock.acquire(30*1000L /*10 minutes*/);
//释放锁,以便10分钟后熄屏
mWakeLock.release();
}
}
2:点亮屏幕弹出界面
光点亮屏幕,不弹出界面也无法实现需求,可以在活动中onCreate加入以下代码(只能在活动中,无法在服务中):
getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED //锁屏显⽰
| WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD //解锁
| WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON //保持屏幕长亮
| WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON); //打开屏幕
3:在service中启动活动
弹出界面只能在活动中,但是一般后台运行都是在service中的,这样就可能需要在service中启动Activity:
Intent dialogIntent = new Intent(getApplication(), Activity.class);
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialogIntent);