项目需要 在锁屏状态下弹出消息框 看了下网上资料
大概实现如下
WakeLock获取方法:
申请权限:第一条是解锁屏幕需要的,第二条是申请电源锁需要的。
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" /> <uses-permission android:name="android.permission.WAKE_LOCK" />
使用Activity,而不是View
首先是onCreate方法,需要添加4个标志,如下:
根据需要添加就行
四个标志位顾名思义,分别是锁屏状态下显示,解锁,保持屏幕长亮,打开屏幕。这样当Activity启动的时候,它会解锁并亮屏显示
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- final Window win = getWindow();
- win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED
- | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD
- | WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON
- | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
- // 自己的代码
- 加载布局
- }
然后在AndroidManifest.xml文件当中,对该activity的声明需要加上以下属性
- <activity android:name=".Activity"
- android:launchMode="singleInstance"
- android:excludeFromRecents="true"
- android:taskAffinity=""
- 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; } }