java - 唤醒锁只工作一次
问题描述
我创建了一个捕获传入通知的服务。每当出现whatsapp通知时,应该唤醒屏幕并启动活动。这第一次工作正常,但屏幕只是保持在睡眠模式,当我解锁手机时,活动就会运行。
服务代码:我在这里声明变量:
@TargetApi(26)
public class NLService extends NotificationListenerService {
private String TAG = this.getClass().getSimpleName();
public PowerManager pm;
public PowerManager.WakeLock wl;
onCreate 函数中的唤醒锁代码:
pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "callOverlay:wakeScreenNotification");
并在 onNotificationPosted 函数中:[获取通知内容等...]
try {
//wake up screen
wl.acquire();
//run activity
dialogIntent.putExtra("SERVICE", "whatsapp");
new android.os.Handler().postDelayed( new Runnable() {
public void run() {
dialogIntent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(dialogIntent);
}
}, 600);
} catch (Exception e) {
Log.i(TAG,"ERROR: "+e);
} finally {
wl.release();
}
在活动中,我在 onCreate 函数中添加了以下代码:
final Window win= getWindow();
win.addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED | WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD);
win.addFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON | WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON);
我是android开发的新手。我错过了什么?谢谢!
解决方案
原来flag组合
FLAG_SHOW_WHEN_LOCKED | FLAG_DISMISS_KEYGUARD | FLAG_TURN_SCREEN_ON
每个 Activity仅生效一次(打开屏幕并关闭键盘保护)。与我上面的评论相反,删除和重新应用标志不起作用。
如果您希望屏幕/唤醒更改第二次生效,您必须创建一个新 Activity,并对其应用相同的标志。
如果用户手动更改手机状态(通过移动到另一个 Activity 或通过关闭屏幕/锁定手机),这也会导致标志失去作用。
推荐阅读
- ubuntu - 无法在 ubuntu 上本地启动 quorum 7nodes 示例
- excel - 在 VBA 宏中使用 SSH 传递命令但无法在 excel 上获得响应
- javascript - 在 javascript 中创建的新按钮没有做其他预设按钮正在做的事情
- java - 我不明白为什么我的代码将 A 计为 11
- ios - 在 iOS 13 中播放系统声音
- python-3.x - 当我无法访问主机时,如何在 Mac 上下载/镜像使用 Iweb 构建的网站?
- c# - WordEditor 删除文档末尾的空行
- java - 在字符串的任何位置精确出现一个字符的正则表达式
- c++ - 组合框为空时不应触发组合框连接信号
- java - 如何使用带有异步任务的 volley 播放 mp3 文件?