我正在开发计时器应用程序,并且希望在指定的时间可靠唤醒设备-无论设备是否处于睡眠/打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%可靠的方法来做到这一点?
setExactAndAllowWhileIdle
方法的文档说,如果您在短时间内安排了太多警报,它可能不是100%可靠的,所以这可能是问题所在