我知道关于这个话题有几十个类似的帖子,但我就是找不到一个真正解决问题或找到根本原因的帖子。
首先,我的目标是SDK22(Android5.1),这意味着我可以使用AlarmManager + WakefulBroadcastReceiver + IntentService,即使这不是最新的方式。我对JobScheduler etc解决方案不感兴趣,我只想知道发生了什么以及为什么。
我正在测试的手机使用的是Android 8.0,但这并不重要,因为我的目标是Android 5.1。
因此,我正在处理的代码将第二天的闹钟设置为06:00。
private fun setupAlarm() {
val calendar = Calendar.getInstance()
calendar.timeInMillis = System.currentTimeMillis()
calendar.add(Calendar.DAY_OF_YEAR, 1)
calendar.set(Calendar.HOUR_OF_DAY, 6)
calendar.set(Calendar.MINUTE, 0)
val alarmIntent = Intent(this, AlarmReceiver::class.java)
val alarmPendingIntent = PendingIntent.getBroadcast(this, 1221, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT)
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, AlarmManager.INTERVAL_DAY, alarmPendingIntent)
}AlarmReciever仅启动服务:
class AlarmReceiver : WakefulBroadcastReceiver() {
override fun onReceive(context: Context?, intent: Intent?) {
startWakefulService(context, Intent(context, DownloadingIntentService::class.java));
}
}然后,该服务尝试下载一个文件,当下载完成时,它会调用completeWakefulIntent(intent)方法,让系统知道它已经完成了工作。
我不知道它什么时候起作用,什么时候不起作用。一天早上,它做了它应该做的事情,而另一天,它却没有。
我设置了一个远程LogCat功能来查看IntentService是否启动,但到目前为止,我看不到来自它的任何日志,所以这意味着警报没有被触发。
如果我在下一分钟设置一个闹钟,甚至重复一个它应该起作用的东西。但是当我把时间推迟到明天早上的时候,它就非常不可靠了。
谢谢你的帮助。
发布于 2018-02-06 17:23:21
我自己也遇到过这个问题。看看发生了什么,setRepeating方法让安卓系统调整应该触发警报的时间。它很可能会尝试批量处理不同的警报,以优化电池使用。但在一般情况下,如果电话没有打瞌睡...它通常会在正确的时间发出警报。
但是,如果电话已经空闲了一段时间,电话就会进入打瞌睡模式,因此警报会延迟。我个人观察到了长达11:30小时的延误。
如果您希望它准确地触发,则必须使用setExactAndAllowWhileIdle方法或setAlarmClock方法。在这种情况下,您将不得不自己处理下一个警报的计划。这些方法在打瞌睡模式下工作得很好,并在准确的时间触发警报。
这些方法也有缺点。setExactAndAllowWhileIdle方法只能用于计划最大每九分钟一次的警报。setAlarmClock方法将主要向用户显示一个类似于常规警报的通知,并将指示警报的详细信息(此行为因操作系统版本而异)
发布于 2018-02-06 16:42:36
我每天都用这个代码来触发备份。它对我很有效,试一试。
AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, MyReceiver.class);
intent.setAction("CUSTOM_INTENT");
alarmIntent = PendingIntent.getBroadcast(context, 0, intent, 0);
Calendar calendar = Calendar.getInstance();
calendar.setTimeInMillis(System.currentTimeMillis());
calendar.set(Calendar.HOUR_OF_DAY, 06);
calendar.set(Calendar.MINUTE, 00);
// setRepeating() lets you specify a precise custom interval--in this case,
// 1 day
alarmMgr.setRepeating(AlarmManager.RTC, calendar.getTimeInMillis()/1000,
AlarmManager.INTERVAL_DAY, alarmIntent);发布于 2018-02-06 16:58:03
试试这个:
Calendar now = Calendar.getInstance();
Calendar alarm = Calendar.getInstance();
alarm.set(Calendar.HOUR_OF_DAY, hourOfDay);
alarm.set(Calendar.MINUTE, minute);
long alarmMillis = alarm.getTimeInMillis();
if (alarm.before(now)) alarmMillis+= 86400000L; //It will add 1 day if your time selected before now
//set alarm method of yours\\settingAlarmManager(requestCode,alarmMillis);
private void settingAlarmManager(String requestCode, Calendar calendar) {
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
Intent notificationIntent = new Intent(AddTaskActivity.this, AlarmReceiver.class);
PendingIntent broadcast = PendingIntent.getBroadcast(AddTaskActivity.this,
Integer.valueOf(requestCode), notificationIntent, PendingIntent.FLAG_UPDATE_CURRENT);
alarmManager.setInexactRepeating(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), AlarmManager.INTERVAL_DAY, broadcast);
}我的Receiver类:
public class AlarmReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//do your stuff here\\
}
}清单:
<receiver android:name=".utils.AlarmReceiver" />我已经尝试了上面的代码来设置闹钟,并完成了我的自定义任务。也许这会对你有帮助。
https://stackoverflow.com/questions/48638494
复制相似问题