Установите будильник с Android 4.4 Kitkat

В странице API 4.4 Android Я читал:

Когда вы устанавливаете приложение targetSdkVersion на "19" или выше, аварийные сигналы которые вы создаете с помощью set() или setRepeating(), будет неточным.

[CUT]

Это неточное поведение пакетной обработки применяется только к обновленным приложениям. Если вы установите для targetSdkVersion значение "18" или ниже, ваши тревоги будут продолжены ведут себя так же, как и в предыдущих версиях, на Android 4.4.

В моем приложении мне нужен точный будильник, и я обновил targetSdkVersion до "19" . Правильно ли это следующий код? Также, если я установил targetSdkVersion на "19" в телефоне с предыдущими версиями, "старый" метод AlarmManager.set продолжает работать таким же образом?

private void setAlarm (long ms){
    final AlarmManager am = (AlarmManager) mCtx.getSystemService(Context.ALARM_SERVICE);
    Intent intent = new Intent(this, BroadcastReceiverAlarm.class);
    PendingIntent pi = PendingIntent.getBroadcast(this, ALARM_REQUEST_CODE, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    if (Build.VERSION.SDK_INT<Build.VERSION_CODES.KITKAT) {
        am.set(AlarmManager.RTC, ms, pi);
    } else {
        setAlarmFromKitkat(am, ms, pi);
    }
}

@TargetApi(19)
private void setAlarmFromKitkat(AlarmManager am, long ms, PendingIntent pi){
    am.setExact(AlarmManager.RTC, ms, pi);
}

Ответ 1

Да, это правильно. Google не смог описать более подробно:

  • для targetSDKVersion < 19, "set" будет точным, независимо от того, работает ли устройство на KitKat или более ранних версиях.
  • для targetSDKVersion >= 19, "set" будет точным для запуска устройства < Кит-Кат. Но это будет неточно для устройства, работающего с KitKat.

Ответ 2

Я загрузил 4.1.2 и удалил 4.4 из своего ADT. Я установил "Build Target" в 4.1.2, очистил и перестроил свое приложение и переустановил apk на мобильный.

Однако поведение по-прежнему неточно.

Я вставляю вывод из adb shell dumpsys alarm ниже:

RTC_WAKEUP # 0: Тревога {426941b0 тип 0 net.coolbie.alarmclock}

   type=0 when=+4m46s480ms repeatInterval=0 count=0

   operation=PendingIntent{42553668: PendingIntentRecord{42a6cc38 net.coolbie.alarmclock broadcastIntent}}

Вы можете видеть, что "когда" составляет + 4 м, но какое триггерное время составляет всего 8 секунд.

long triggerTime = calendar.getTimeInMillis();
long currentTime = System.currentTimeMillis();
Toast.makeText(mContext, "gap is:"+(triggerTime-currentTime)/1000,Toast.LENGTH_LONG).show(); 
Intent intent = new Intent(mContext.getApplicationContext(), AlarmReceiver.class);  
PendingIntent pendIntent = PendingIntent.getBroadcast(mContext.getApplicationContext(),  
                    0, intent, PendingIntent.FLAG_UPDATE_CURRENT);  
mAlarmManager.set(AlarmManager.RTC_WAKEUP, triggerTime, pendIntent);