gpt4 book ai didi

android - 手机休眠时,AlarmManager.setExact 在 Kitkat 中仍然不准确

转载 作者:行者123 更新时间:2023-11-29 15:13:30 26 4
gpt4 key购买 nike

这几天我一直在与 AlarmManager.setExact() 作斗争。我的应用程序需要准确的警报,并且可以在带有 AlarmManager.setRepeating() 的旧版 Android 上正常运行。

我读到它自 API 19 以来发生了变化,并相应地更新了我的代码。

下面是负责设置闹钟的代码:

PendingIntent pi = PendingIntent.getBroadcast(context.getApplicationContext(), alarmOrder+1, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
getAlarmManager(context).setExact(AlarmManager.RTC_WAKEUP, alarmTimeMillis, pi);
}
else {
getAlarmManager(context).setRepeating(AlarmManager.RTC_WAKEUP, alarmTimeMillis, AlarmManager.INTERVAL_DAY, pi);
}

广播接收器开始新的 Activity 并显示警报屏幕:

@Override
public void onReceive(Context context, Intent intent) {
PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "AlarmTimeReceiver");
wl.acquire();

Intent alarmIntent = new Intent(context, AlarmActivity.class);
alarmIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
context.startActivity(alarmIntent);

//Release the lock
wl.release();
}

问题是,在通过 USB 数据线连接的 Android 4.4 设备上进行测试时一切正常。闹钟始终在指定时间开始(屏幕打开/关闭)。不幸的是,当我断开设备与计算机的连接时,只有在屏幕打开时才会正确启动闹钟。当我关闭屏幕时,闹钟会在不准确的时间启动。

我错过了什么吗?大家有遇到过类似情况吗?

最佳答案

It runs correctly on Android < 19

不是真的。

A _WAKEUP警报保证——通过框架管理WakeLock -- 设备将保持唤醒状态直到 onReceive()返回。然后,框架释放 WakeLock ,并且设备可以重新休眠...如果没有其他未完成的WakeLocks .

你的 WakeLock ,如所写,毫无意义。它只是复制框架管理的 WakeLock不增加值(value)。

startActivity()异步的。在onReceive() 之前, Activity 还远未开始结束和框架管理 WakeLock (和你的额外的)被释放。现在,有时,您的 Activity 无论如何都会有机会启动,因为设备不会很快重新进入休眠状态。我假设您正在使用 android:keepScreenOn或 Activity 中的等效项,所以一旦你到达那个点,就会有另一个 WakeLock出色,设备无法自动重新进入休眠状态。

但是,有时设备确实会在您的 Activity 开始之前重新进入休眠状态。 在 Android 5.0 中可能已经改变——如果 Android 更积极地让设备更快地恢复 sleep ,我一点也不会感到惊讶。因此,虽然您以前的方法可能在 90% 的时间内都有效,但现在可能要少得多。但是,您之前的方法并非 100% 有效

我们在服务方面也看到了同样的情况。事实上,这种情况在那里更为常见。这就是为什么在 2009 年 4 月,我创建了 the WakefulIntentService ,以及为什么在 2013 年 8 月,Google released WakefulBroadcastReceiver .两者都提供了获取 WakeLock 的模式在 onReceive()但在服务工作完成之前不会发布它。

这两种解决方案都不适合您,因为它们都与服务密不可分。但是,您可以将这些作为想法的来源来推出自己的想法。你需要移动你的 WakeLock进入静态数据成员(ick),并且只有release()一旦你的 Activity 足够远,它就有了自己的WakeLock .例如,如果您正在调用 setKeepScreenOn()View 上在 Java 代码中,一旦完成,我希望可以安全地发布您的原始 WakeLock .然后,框架可以接管并释放保持屏幕打开 WakeLock基于用户输入。

关于android - 手机休眠时,AlarmManager.setExact 在 Kitkat 中仍然不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27589181/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com