在指定的实际经过时间以100%可靠的方式唤醒设备

时间:2019-04-11 15:54:48

标签: android kotlin alarmmanager android-windowmanager powermanager

我正在开发计时器应用程序,并且希望在指定的时间可靠唤醒设备-无论设备是否处于睡眠/打mode模式/锁定屏幕等等。

当前我正在使用此设置: 在其生命周期内持有部分唤醒锁的前台服务

   fun start() {
        wakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, wakeLockTag)
        wakeLock?.acquire()
    }

    fun stop() {
        if (wakeLock?.isHeld == true) {
            wakeLock?.release()
        }
    }

在用户离开计时器活动时,在实际经过的时间安排警报:

    fun scheduleAtRealElapsedTime(timeToTrigger: Long, firedIntent: PendingIntent) {
    val alarmType = AlarmManager.ELAPSED_REALTIME_WAKEUP
    AlarmManagerCompat
            .setExactAndAllowWhileIdle(alarmManager, alarmType, timeToTrigger, firedIntent)
}

将这些标志添加到计时器活动中

fun setupWindowFlags(activity: BaseActivity<*, *>) {
    activity.window.addFlags(
            WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED or
                    WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON or
                    WindowManager.LayoutParams.FLAG_DISMISS_KEYGUARD or
                    WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON
    )
}

并在收到警报意图时获取完全唤醒锁定:

fun wakeScreen() = powerManager.newWakeLock(
        PowerManager.FULL_WAKE_LOCK or PowerManager.ACQUIRE_CAUSES_WAKEUP, wakeLockTag)
        .acquire(1)

使用此设置,仿真器上没有问题,但在我的华为设备上似乎不可靠-似乎并非每次都发出警报。

是否有100%可靠的方法来做到这一点?

  • 我阅读了文档,发现高优先级的fcm消息可以绕过设备的睡眠,但是我的应用程序不应该为此要求互联网连接
  • 有关警报管理器-setExactAndAllowWhileIdle方法的文档说,如果您在短时间内安排了太多警报,它可能不是100%可靠的,所以这可能是问题所在

0 个答案:

没有答案