首页 > 解决方案 > 唤醒锁只工作一次

问题描述

我创建了一个捕获传入通知的服务。每当出现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开发的新手。我错过了什么?谢谢!

标签: javaandroid

解决方案


原来flag组合

FLAG_SHOW_WHEN_LOCKED | FLAG_DISMISS_KEYGUARD | FLAG_TURN_SCREEN_ON

每个 Activity仅生效一次(打开屏幕并关闭键盘保护)。与我上面的评论相反,删除和重新应用标志不起作用。

如果您希望屏幕/唤醒更改第二次生效,您必须创建一个新 Activity,并对其应用相同的标志。

如果用户手动更改手机状态(通过移动到另一个 Activity 或通过关闭屏幕/锁定手机),这也会导致标志失去作用。


推荐阅读