【问题标题】:How to make a screen wake up when a notification is received?收到通知时如何唤醒屏幕?
【发布时间】:2017-07-31 12:19:25
【问题描述】:

对于我的应用程序,我试图在通知唤醒屏幕并显示应用程序视图的位置获取它。我不知道如何让应用程序在锁定屏幕时唤醒。我尝试了一些方法,但似乎都不起作用,否则应用程序会崩溃。

【问题讨论】:

标签: java android android-notifications


【解决方案1】:

有我的解决方案:

createNotification(); //your implementation
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
boolean isScreenOn = Build.VERSION.SDK_INT >= 20 ? pm.isInteractive() : pm.isScreenOn(); // check if screen is on
if (!isScreenOn) {
    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP, "myApp:notificationLock");
    wl.acquire(3000); //set your time in milliseconds
}

更多信息请访问PowerManager

【讨论】:

  • SCREEN_DIM_WAKE_LOCK 已弃用。但是,使用PARTIAL_WAKE_LOCK 的其他人都没有为我的应用程序工作。我的目标是 API 19,但在我的手机上使用 API 28
  • ACQUIRE_CAUSES_WAKEUP 是官方推荐的点亮显示屏以显示通知的方式。来自链接的文档:Notifications that pop up and want the device to be on are the exception; use this flag to be like them.
  • 也可以,不过我不太确定,最好尽量少用时间,这样安卓系统就不会判断你的应用耗电高了。设备将像往常一样进入睡眠状态。
  • 问题:ACQUIRE_CAUSES_WAKEUP - 当它单独运行时,它会杀死后台服务!!!???
【解决方案2】:

BroadCastReceiver 适用于,您的应用处于后台状态/移动处于锁定模式。收到通知时,我必须重定向特定屏幕,为此我添加了 Intent 代码, 收到通知后,此代码有助于满足您的要求

public class FirebaseDataReceiver extends WakefulBroadcastReceiver {
    
      private final String TAG = "FirebaseDataReceiver";
    
        public void onReceive(Context context, Intent intent) {
            PowerManager pm = (PowerManager)context.getSystemService(Context.POWER_SERVICE);
            boolean isScreenOn = pm.isScreenOn();
            if(isScreenOn==false)
            {
                PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK |PowerManager.ACQUIRE_CAUSES_WAKEUP |PowerManager.ON_AFTER_RELEASE,"MyLock");
                wl.acquire(10000);
                PowerManager.WakeLock wl_cpu = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"MyCpuLock");
    
                wl_cpu.acquire(10000);
            }
           //Redirect particular screen after receiving notification, this is like ola driver app concept accepting driver request
            intent = new Intent(context, MyTicketListActivity.class);
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            context.startActivity(intent);
    
        }
    }

还要记得指定AndroidManifest.xml中使用的权限:

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

【讨论】:

  • 但是我该如何调用呢?
【解决方案3】:

我也遇到过类似的情况。即使屏幕关闭,也需要显示通知屏幕以供用户接受或拒绝通知。我摸索了一段时间,直到现在。要求屏幕应该打开,这可以通过组合窗口管理器和唤醒锁定的标志来实现,如下所示。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    PowerManager pm = (PowerManager) this.getSystemService(Context.POWER_SERVICE);
    boolean isScreenOn = pm.isScreenOn();
    int flags = PowerManager.FULL_WAKE_LOCK
            | PowerManager.ACQUIRE_CAUSES_WAKEUP
            | PowerManager.ON_AFTER_RELEASE;
    if (!isScreenOn) {
        wakeLock = pm.newWakeLock(flags, "my_app:full_lock");
        wakeLock.acquire(20000);
    }

    setContentView(R.layout.activity_incoming_request);
    
    getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED |
            WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
            WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON |
            WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD |
            WindowManager.LayoutParams.FLAG_ALLOW_LOCK_WHILE_SCREEN_ON);
    ...
    startRingingPhone();
}

此代码块将在锁定屏幕上显示活动。

【讨论】:

    【解决方案4】:

    在通知创建之前放置下面的代码,

    PowerManager powerManager = (PowerManager) context.getSystemService(context.POWER_SERVICE);
        PowerManager.WakeLock  wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK |
                PowerManager.ACQUIRE_CAUSES_WAKEUP |
                PowerManager.ON_AFTER_RELEASE, "appname::WakeLock");
    
    //acquire will turn on the display
    wakeLock.acquire(1*60*1000L);

    并确保在清单中设置此权限:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-03-13
      • 2021-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多