我试图通过AlarmManager
的setRepeating()
方法每半小时运行IntentService
。我想从广播发送信息到服务中,然后在服务中执行一些功能。
但是,在应用程序关闭状态下,初始的AlarmManager
没有触发。
当我的应用程序正在运行或在后台状态时,闹钟正常工作,但是有一些设备闹钟在关闭应用程序后无法正常工作。
我应该怎么做才能让闹钟即使在应用程序关闭后也能正常运行?
我试图通过AlarmManager
的setRepeating()
方法每半小时运行IntentService
。我想从广播发送信息到服务中,然后在服务中执行一些功能。
但是,在应用程序关闭状态下,初始的AlarmManager
没有触发。
当我的应用程序正在运行或在后台状态时,闹钟正常工作,但是有一些设备闹钟在关闭应用程序后无法正常工作。
我应该怎么做才能让闹钟即使在应用程序关闭后也能正常运行?
根据setRepeating()
的文档:
从API 19开始,所有重复警报都是不精确的。
此外,setRepeating()
不能与Doze模式一起使用。
您应该使用准确的警报(根据设备的API级别设置适当的AlarmManager
方法):
if (Build.VERSION.SDK_INT >= 23) {
alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP,
triggerTime, pendingIntent);
} else if (Build.VERSION.SDK_INT >= 19) {
alarmManager.setExact(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent);
} else {
alarmManager.set(AlarmManager.RTC_WAKEUP, triggerTime, pendingIntent);
}
重新安排每次触发时间。
对于重新安排,您可以将原始触发时间添加到Intent
中:
intent.putExtra(KEY_TRIGGER_TIME, triggerTime);
然后在 onReceive()
中检索这个额外的内容,将您想要的间隔添加到其中,并使用新值重新安排闹钟:
然后在onReceive()
中检索此额外内容,添加您所需的时间间隔,并使用新值重新安排警报:
@Override
public void onReceive(Context context, Intent intent) {
long triggerTime = intent
.getLongExtra(KEY_TRIGGER_TIME, System.currentTimeMillis());
// adding one day to the current trigger time
triggerTime += TimeUnit.DAYS.toMillis(1);
// set a new alarm using the new trigger time
// ...
}
< p > < em > 注意: 如上方评论中@Opiatefuchs所提到的,一些制造商(如小米或华为)可能会实现某些电池节省功能,这些功能可以防止闹钟被触发,并且无法通过编程方式绕过。 现在的设备在电池功耗方面越来越注重安全性。默认情况下,设备会将几乎所有应用程序置于省电模式下。这意味着对于某些设备,当您退出应用程序时,后台工作(位置、闹钟管理)将不起作用。在其他设备上,当电池电量达到阈值(例如13%)时,后台任务将停止工作。因此,即使在后台运行,您需要将您的应用程序从这种省电模式中排除以使其顺畅运行。在这两个制造商中实现该行为的方法是:
进入“电池” => “省电” => “应用程序电池优化器” => 选择您的应用程序并选择“无限制”(关于后台设置),然后允许“后台位置”选项。
要在启动后自动启动您的应用程序:转到“安全”应用程序 => “权限” => “自动启动”并勾选您的应用程序。
三星智能管理应用程序在3天内如果您不使用应用程序,则停止所有后台工作。因此,禁用此功能的方法如下:
对于其他设备,应该有相同的电源选项,可以直接在设置选项中或通过某些应用程序进行处理。
首先,Android Studio存在一个bug。如果你从Android Studio启动应用程序,然后从最近的应用中滑出该应用程序,闹钟将被删除。因此,在这种情况下,请通过点击启动器图标重新启动您的应用程序。如果您再次将其滑出时,闹钟仍将存在。
其次,在某些带有电池优化功能的设备上,您应该启动前台服务,并且它完全正常工作。
我使用这两个要点使其正常运行,现在它可以运行得很好。
即使关闭了电池节省模式(设置 -> 电池 -> 选项 -> 电池节省),并将应用程序标记为重要的消息(设置 -> 提示和通知 -> 应用程序通知 -> 应用名称 -> 优先级),似乎 setExact
和 setAlarmClock
都没有按时触发。
对于联想手机:
您需要进入设置 -> 应用程序 -> 选择应用程序 -> 取消选中限制启动
现在它将以被杀状态在后台运行。