2016-08-19 58 views
0

我想安排多個重複的基於時間的警報。根據this android dev doc,「重複基於精確的觸發時間的警報不能很好地擴展」,爲什麼這是,我不明白。但我需要這種精確類型的功能。那麼我有什麼選擇?我的主要目標是使用AlarmManager類來安排警報,並在預定時間發生時發出通知,但考慮到開發人員文檔,我不太清楚如何處理它。調度重複的基於時間的警報

編輯

㈣管理來安排我的報警器,其中ARNT正好在設定的時間間隔後反覆復發的嚴格意義上的重複基於時間的警報,但在設置多重意義上的「重複」報警。現在,當我把我的日期和時間上的日曆,月被設定爲未來一個月,如果我把10,它的月份設置爲11,我的繼承人代碼:

Calendar cal = Calendar.getInstance(); 
String date = "23/10/2016";//month set to 10 
String[] _date = date.split("/"); 
String time = "4:33"; 
String[] _time = time.split(":"); 

Intent intent = new Intent(test.this, 
      AlarmReceiver.class); 


intent.setData(Uri.parse("timer:555")); 

PendingIntent sender = PendingIntent.getBroadcast(
      test.this, 0, intent, 
      0); 

cal.set(Integer.parseInt(_date[2]), //year 
     Integer.parseInt(_date[1]), //month 
     Integer.parseInt(_date[0]), //day 
     Integer.parseInt(_time[0]), //hour 
     Integer.parseInt(_time[1]));//minute 

AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
am.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), sender); 

Toast mToast = Toast.makeText(
      test.this, 
      "Reminders added to the calendar successfully for " 
        + android.text.format.DateFormat.format(
        "MM/dd/yy h:mmaa", 
        cal.getTimeInMillis()), 
      Toast.LENGTH_LONG); 
mToast.show();//month displayed is 11 
+0

在java.util.Calendar中MONTH對象從0開始。所以JANUARY = 0,FEBRUARY = 1在DECEMBER = 11結束。 –

+0

啊!......那很愚蠢,再次感謝thanx。 – BiGGZ

+0

只是一個問題。當手機重新啓動時,所有警報都將被刪除,我應該使用RECEIVE_BOOT_COMPLETED權限創建BroadCastReceiver並重置所有警報? – BiGGZ

回答

1

我使用AlarmManager喜歡你想在我的項目中做。在項目中,我可以安排一次或每天,每週,每月,每年的警報。實際上,它的運行良好,但操作系統可以改變報警以提高電池效率,有時可能會延遲1分鐘。如果您在AlarmManager.html#setRepeating中閱讀:

注意:從API 19開始,所有重複警報都是不精確的。如果您的應用程序需要精確的交付時間,那麼它必須使用一次性精確警報,如上所述每次重新安排時間。其targetSdkVersion早於API 19的傳統應用程序將繼續擁有其所有警報,包括重複警報,並將其視爲確切對待。

如果你在那裏閱讀接受的答案你明白:alarmmanager-fires-alarms-at-wrong-time

而且也請閱讀此選擇的答案:如果你想知道我使用的alarmmanager-setexact-with-wakefulbroadcastreceiver-sometimes-not-exact

:我使用不精確的鬧鐘因爲我不想消耗電池cuz時間在我的應用程序中並不重要。

請注意,不精確報警更省電。如果時間不重要,那麼你使用不精確的代替。

所以,最後如果你想看到一些代碼示例,我在Bitbucket中有歷史記錄。我可以給你我現有的代碼作爲參考,或者如果你用你的嘗試更新你的問題,我可以指導你。對於setExact

@Edit:

首先,你必須聲明你的報警像:

Intent alarmIntent = new Intent(getApplicationContext(), YourAlarmReceiver.class); 
//this is important for you you must store this value 
// you need this request code when shifting your Alarms 
int piRequstCode=(int) System.currentTimeMillis(); 

對於您可以存儲喜歡你的意圖未決請求代碼簡單的方法:

alarmIntent.putExtra("piRequestCode",piRequstCode); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),piRequstCode,alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE); 
//use mCalendarNotification to set your date for trigger 
alarmManager.setExact(AlarmManager.RTC_WAKEUP, mCalendarNotification.getTimeInMillis(), pendingIntent); 

然後在您的BroadcastReceiver

@Override 
public void onReceive(Context context, Intent intent) { 
    //right now you have your intent and context, so you can shift your alarm 
    Bundle extras=intent.getExtras(); 
    int piRequestCode=extras.getInt("piRequestCode"); 
    Intent alarmIntent=new Intent(context, YourAlarmReceiver.class); 
    alarmIntent.putExtra("piRequestCode",piRequstCode); 

    // this will return your existing pending intent because your Intent and request code is same 
    // and FLAG_UPDATE_CURRENT updates pendingIntent with new config. 
    // If there is no pending Intent that matches with this requestCode and intent it will create new one. 
    PendingIntent pendingIntent = PendingIntent.getBroadcast(context,piRequestCode,alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); 

    //use AlarmManager with context 
    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 
    alarmManager.setExact(AlarmManager.RTC_WAKEUP,shiftedTime, pendingIntent); 
} 

還有一件事,當設備重新啓動時,所有警報都將丟失。你必須手動重置你的報警。因此在數據庫中存儲pendingIntent請求代碼(SqliteRealm等...)或SharedPreferences(如果你沒有太多數據)是很好的策略。現在我正在使用Realm來存儲requestCodes和所有其他的東西,所以我建議你使用數據庫。

最後要明確的是,如果您在執行此步驟時需要更多幫助,請創建新問題或編輯此問題,我會幫助您。

+0

感謝您的參考填寫答案,一些指導性代碼將是偉大的,我還沒有編碼任何東西,在閱讀Android文檔後停下來。 – BiGGZ

+0

@VernonCliveKawonza當我閱讀文檔時,我很喜歡你,但如此多的開發人員誤以爲:我們在正確閱讀文檔之前進行開發,並且總是令人困惑。所以我改變了主意。當然我會爲你添加代碼示例 –

+0

你對此非常正確。真的很感謝你的幫助,會讓你知道我的執行情況如何 – BiGGZ