2015-10-22 91 views
5

我有下面的代碼,它將調用我的打算「報警接收器」每隔一小時進行檢查AlarmManager對於API 17 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); 

這偉大工程的Android API 19+(Android 4.4系統)

但是我想允許Android的API 17(4.2),以能夠使用我的應用程序如不是每個人都可以得到自己的手機

問題4.4是未通過API支持的setExact 17

有沒有一種調用API 17+支持的Intent被調用的方法,或者我需要以某種方式找出android的verison運行並執行一段代碼或另一段代碼?

感謝

+0

我還挺如果(android.os.Build.VERSION.SDK_INT> = 19)取決於平臺 設置接點報警。 \t \t} else { \t \t \t alarmManager.set(AlarmManager.RTC_WAKEUP,dateTimer.getTimeInMillis(),operation); \t \t} – iGoDa

回答

11

的方式,AlarmManager作品是changed in API level 19幫助延長電池壽命。事件可以分批發放。這意味着set()setRepeating()將在API 19+上不精確。

在19之前的API版本中,您可以使用set,它將安排警報的確切時間。

不幸的是,這意味着你需要在代碼中添加一個檢查,以確保你使用正確的方法來設置一個確切的報警:

@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); 
    } 
} 

此外,這將是值得reading about Doze這是介紹在棉花糖和決定你希望你的應用程序如何與它一起工作。

3

如果要觸發一個確切的報警,你應該使用這樣的事情:

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); 
} 

考慮到事情的Android 6已經改變了打盹功能,以便隨時檢查這個​​

+0

太棒了!謝謝 – Sjharrison