2015-10-22 21 views
5

ho il seguente codice che chiamerà la mia intenzione 'Alarm Receiver' ogni ora per eseguire un controlloAlarmManager Per API 17 e 19

AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    Intent notificationIntent = new Intent("android.media.action.DISPLAY_NOTIFICATION"); 
    notificationIntent.addCategory("android.intent.category.DEFAULT"); 

    PendingIntent broadcast = PendingIntent.getBroadcast(context,100,notificationIntent,PendingIntent.FLAG_UPDATE_CURRENT); 

    Calendar cal = Calendar.getInstance(); 
    cal.add(Calendar.HOUR,1); 
    alarmManager.setExact(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), broadcast); 

E questo funziona alla grande per API Android 19+ (Android 4.4)

Tuttavia voglio permettere Android API 17 (4.2) per essere in grado di usare la mia app come non tutti possono ottenere 4.4 sui loro telefoni

il problema è la setExact che non è supportato da API 17

C'è un modo per chiamare l'Intent da chiamare che è supportato da API 17+ o dovrei in qualche modo scoprire quale versione di Android è in esecuzione ed eseguire un pezzo di codice o un altro?

Grazie

+0

I kinda utilizzare per impostare allarmi extact seconda piattaforma se (android.os.Build.VERSION.SDK_INT> = 19) { \t \t \t alarmManager.setExact (AlarmManager.RTC_WAKEUP, dateTimer.getTimeInMillis(), operazione); \t \t} else { \t \t \t alarmManager.set (AlarmManager.RTC_WAKEUP, dateTimer.getTimeInMillis(), operazione); \t \t} – iGoDa

risposta

11

Il modo in cui funziona AlarmManager era changed in API level 19 per contribuire a salvare la vita della batteria. Era così che gli eventi potevano essere messi in palio. Ciò significa che set() e setRepeating() non saranno esatti su API 19+.

Nelle versioni API precedenti alle 19, è possibile utilizzare semplicemente set, che pianificherà un allarme per l'ora esatta.

Purtroppo questo significa che avrete bisogno di aggiungere un controllo nel codice per assicurarsi che si utilizza il metodo corretto per l'impostazione di un allarme preciso:

@SuppressLint("NewApi") 
private void setSingleExactAlarm(long time, PendingIntent pIntent) { 
    if (android.os.Build.VERSION.SDK_INT >= 19) { 
     mAlarmManager.setExact(AlarmManager.RTC_WAKEUP, time, pIntent); 
    } else { 
     mAlarmManager.set(AlarmManager.RTC_WAKEUP, time, pIntent); 
    } 
} 

Inoltre, varrebbe la pena di reading about Doze che era introdotto in Marshmallow e decidi come vuoi che la tua app funzioni al suo fianco.

3

Se si desidera attivare un allarme esatto si dovrebbe usare qualcosa di simile:

if (android.os.Build.VERSION.SDK_INT >= 19) { 
    alarmManager.setExact(AlarmManager.RTC_WAKEUP, NEXT_TIME_IN_MILLISECONDS, operation); 
} else { 
    alarmManager.set(AlarmManager.RTC_WAKEUP, NEXT_TIME_IN_MILLISECONDS, operation); 
} 

Prendere in considerazione le cose sono cambiate in Android 6 con funzione di dormiveglia quindi sentitevi liberi di controllare questo documentation

+0

Fantastico! Grazie – Sjharrison

Problemi correlati