小部件,AlarmManager和KitKat API 19

时间:2014-03-27 15:57:19

标签: android widget alarmmanager android-4.4-kitkat

自API19(KitKat)以来,AlarmManager广播不会立即执行,而是一起批处理。
文档说如果应用程序的目标是API 18或更低,它应该立即在KitKat中行动,但这似乎不起作用。
例如,我的时钟小部件针对API 18,但在KitKat仿真器上需要时它不会更新(我没有要测试的设备)。我在网上看到很多人报告他们的旧时钟小部件不再在他们的KitKat设备上更新 AlarmManager文档建议这是为了避免唤醒,但它也会影响我的RTC警报

文档建议使用setExact,但这只适用于API19 +。有没有办法触发将在API8 +包括API19上立即处理的更新?或者为API19 +添加单独的AlarmManager是否更好?
什么可以是一个很好的解决方案,让小部件在API19 +上正确更新并仍能在旧设备上正常工作?

1 个答案:

答案 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次。
对于每分钟更新的小部件,我不确定这种策略对电池寿命的影响。