我知道关于这个主题有几十个类似的线程,但我只是找不到一个真正解决问题/或确定根本原因的线程。
首先,我的目标是 SDK 22 (Android 5.1),这意味着我可以使用 AlarmManager + WakefulBroadcastReceiver + IntentService,即使这不是最新的处理方式。
我对 JobScheduler 等解决方案不感兴趣,我只想了解发生了什么以及为什么。
我正在测试的手机搭载的是 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是否启动,但到目前为止我看不到任何日志,所以这意味着警报没有被触发。
如果我在下一分钟设置闹钟,甚至重复一个闹钟,无论它应该如何工作。但当我把时间推迟到明天早上时,就非常不可靠了。
感谢您的帮助。