锁屏状态弹窗

项目需要 在锁屏状态下弹出消息框 看了下网上资料

大概实现如下

WakeLock获取方法:

申请权限:第一条是解锁屏幕需要的,第二条是申请电源锁需要的。

<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
 

使用Activity,而不是View

首先是onCreate方法,需要添加4个标志,如下:
根据需要添加就行
四个标志位顾名思义,分别是锁屏状态下显示,解锁,保持屏幕长亮,打开屏幕。这样当Activity启动的时候,它会解锁并亮屏显示
  1. protected void onCreate(Bundle savedInstanceState) {  
  2.     super.onCreate(savedInstanceState);  
  3.     final Window win = getWindow();  
  4.     win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED  
  5.             | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD  
  6.             | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON  
  7.             | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);  
  8.   
  9.     // 自己的代码  
  10.     加载布局
  11. }

然后在AndroidManifest.xml文件当中,对该activity的声明需要加上以下属性

  1. <activity android:name=".Activity"  
  2.           android:launchMode="singleInstance"  
  3.           android:excludeFromRecents="true"  
  4.           android:taskAffinity=""  
  5.           android:theme="@android:style/Theme.Wallpaper.NoTitleBar"/> 

弹窗Activity本身并不主动更新信息,当有新的信息来时需要更新Activity的界面,由于在上面我们设的是singleInstance启动模式,所以需要覆写onNewIntent(Intent intent)方法,这样当再次启动这个activity时,新的intent会在该方法中传入。

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    onCreated(); 
}


如果该Activity并未退出,但是被手动按了锁屏键,当前面的广播接收器再次去启动它的时候,屏幕并不会被唤起,所以我们需要在activity当中添加唤醒屏幕的代码,这里用的是电源锁。可以添加在onNewIntent(Intent intent),因为它会被调用。也可以添加在其他合适的生命周期方法
private PowerManager.WakeLock wakeLock;
//开启常亮
@Override
public void wakeUpPower() {
    PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
    /** 
     CPU:保持运转 屏幕:可以关闭 键盘灯:可以关闭 
     PARTIAL_WAKE_LOCK = 0x00000001;  
     CPU:保持运转 屏幕:保持显示但可以是暗的 键盘灯:关闭  
     SCREEN_DIM_WAKE_LOCK = 0x00000006;  
     CPU:保持运转 屏幕:保持高亮 键盘灯:关闭  
     SCREEN_BRIGHT_WAKE_LOCK = 0x0000000a;  
     CPU:保持运转 屏幕:保持高亮 键盘灯:点亮 
     FULL_WAKE_LOCK = 0x0000001a;  
     **/
    wakeLock = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "My Tag");
    // 是否使用引用计数,默认是启用的。引用计数应该就是第一次请求为1,第二次加1,再一次再加1   
    // 在释放时,只有引用计数为0时才被视为完全释放(所以要多次调用release    wakeLock.setReferenceCounted(false);
    wakeLock.acquire(60 * 1000);// 获取唤醒锁,并在60s后释放  
}

@Override
protected void onResume() {
    super.onResume();
    wakeUpPower();
    Log.d(TAG, "onResume");
}

@Override
protected void onPause() {
    super.onPause();
    releasePower();
    Log.d(TAG, "onPause");
}
// 释放唤醒锁  
@Override
public void releasePower() {
    if (wakeLock != null) {
        wakeLock.release();
        wakeLock = null;
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值