自API19(KitKat)以来,AlarmManager广播不会立即执行,而是一起批处理。
文档说如果应用程序的目标是API 18或更低,它应该立即在KitKat中行动,但这似乎不起作用。
例如,我的时钟小部件针对API 18,但在KitKat仿真器上需要时它不会更新(我没有要测试的设备)。我在网上看到很多人报告他们的旧时钟小部件不再在他们的KitKat设备上更新
AlarmManager文档建议这是为了避免唤醒,但它也会影响我的RTC警报
文档建议使用setExact,但这只适用于API19 +。有没有办法触发将在API8 +包括API19上立即处理的更新?或者为API19 +添加单独的AlarmManager是否更好?
什么可以是一个很好的解决方案,让小部件在API19 +上正确更新并仍能在旧设备上正常工作?
答案 0 :(得分:0)
对于适用于我的API19和API19 +的单一解决方案的一种策略:用每个创建的新setRepeating()
/ set()
替换AlarmManager的setExact()
广播更新小部件的时间。
此策略允许继续使用AlarmManager的RTC警报类型,该类型在手机处于睡眠状态时不会触发。
它使得窗口小部件在任何API上的预期时间更新,并使我的窗口小部件与使用setRepeating()
时一样节能。
而不是创建{{1} }“小部件管理器”类中的setRepeating()
方法中的警报...
为API18或更低版本创建onEnabled
,或者在“更新小组件”中为API19 +创建set()
在运行窗口小部件更新代码之后的类。每次更新窗口小部件时,都会为下次需要的时间设置新的警报。
以下是“updateservice”类中setExact()
内的一段代码(不完整),由两者调用onStartCommand()
和广播接收器类。
onEnabled()
----更新WIDGETS的代码在这里------
public int onStartCommand(Intent intent, int flags, int startId) { Log.w(LOG, "UpdateService.onStartCommand activated"); // reset the time dependent millis addition long alarmAddMillis = 0; // get time instance and values Calendar rightNow = Calendar.getInstance(); int thisMin = rightNow.get(Calendar.MINUTE); int thisHour = rightNow.get(Calendar.HOUR); // set correct hour values to update widget nextHour = thisHour + 1; if (thisHour == 0) {thisHour = 12;} if (nextHour == 13) {nextHour = 1;} // set text values based on minutes // set the values for the next alarm time if (thisMin >= 0 && thisMin <= 6) { clockH = thisHour; nextAlarmMin = 8; alarmAddMillis = 0;} if (thisMin >= 7 && thisMin <= 21) { clockH = thisHour; nextAlarmMin = 22; alarmAddMillis = 0;} if (thisMin >= 21 && thisMin <= 35) { clockH = thisHour; nextAlarmMin = 37; alarmAddMillis = 0;} if (thisMin >= 36 && thisMin <= 50) { clockH = nextHour; nextAlarmMin = 52; alarmAddMillis = 0;} if (thisMin >= 51 && thisMin <= 59) { clockH = nextHour; nextAlarmMin = 8; alarmAddMillis = 3600000;}
管理不同API所需的唯一代码是设置警报。只需选择// cancel any unsent alarm if (alarmManager != null){ alarmManager.cancel(pendingIntent); Log.w(LOG, "UpdateService.onStartCommand unsent alarm canceled");} // SET UP THE NEXT ALARM // set the time using values set above Calendar nextAlarm = Calendar.getInstance(); // add one hour of millis if its for the next hour nextAlarm.setTimeInMillis(System.currentTimeMillis() + alarmAddMillis); // set the correct minute nextAlarm.set(Calendar.MINUTE, nextAlarmMin); nextAlarm.set(Calendar.SECOND, 0); nextAlarm.set(Calendar.MILLISECOND, 0); // request the alarm alarmManager = (AlarmManager)getSystemService(Context.ALARM_SERVICE); Intent usIntent = new Intent(this, AlarmReceiver.class); pendingIntent = PendingIntent.getBroadcast(this, 0, usIntent, 0); // ACCOUNT FOR DIFFERENT APIs HERE... // use onExact for API19+ int currentApiVersion = android.os.Build.VERSION.SDK_INT; if (currentApiVersion <= 18) { alarmManager.set(AlarmManager.RTC, nextAlarm.getTimeInMillis(), pendingIntent); Log.w(LOG, "FuzzyTimeWidget.onEnabled pre-kitkat AlarmManager requested"); }else{ alarmManager.setExact(AlarmManager.RTC, nextAlarm.getTimeInMillis(), pendingIntent); Log.w(LOG, "FuzzyTimeWidget.onEnabled API19+ AlarmManager requested"); }
或set()
即可。所有其他代码都适用于任何API。
在我的情况下,我使用setExact()
来设置下一个警报的确切时间,该警报每小时在8,22,37,52处发送4次。
对于每分钟更新的小部件,我不确定这种策略对电池寿命的影响。