2011-12-20 51 views
0

我正嘗試使用AlarmManager在我的應用程序中創建警報。如果將日期添加到日曆中,則警報管理器無法觸發警報

我可以設置多個警報,但是如果將DATE參數添加到日曆中,則不會觸發警報。下面是我的代碼

 Intent intent = new Intent(this, OneShotAlarm.class); 
     /*Pass the task row ID as the Unique ID for Pending Intent*/ 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(this.getApplicationContext(), (int) rowid , intent, PendingIntent.FLAG_ONE_SHOT); 

     AlarmManager alarmManager = (AlarmManager)getSystemService(ALARM_SERVICE); 
     Calendar calendar = Calendar.getInstance(TimeZone.getDefault(), Locale.getDefault()); 
     calendar.clear(); 
     calendar.setTimeInMillis(System.currentTimeMillis()); 

     calendar.set(Calendar.HOUR_OF_DAY, mHour); 
     calendar.set(Calendar.MINUTE, mMinute); 
     calendar.set(Calendar.SECOND, 0); 
     calendar.set(Calendar.MILLISECOND, 0); 

     long timeSet = calendar.getTimeInMillis(); 
     alarmManager.set(AlarmManager.RTC_WAKEUP, timeSet, pendingIntent); 

如果我的日期參數添加到日曆作爲

 calendar.add(Calendar.DAY_OF_MONTH, mDay); 
     calendar.add(Calendar.MONTH, mMonth); 
     calendar.add(Calendar.YEAR, mYear); 

的警報不會被觸發。我必須在未來的日期安排一個活動。請建議我缺少的東西。謝謝您的幫助!!

P.S.我從日期和時間&時間對話框選取器

+0

你能告訴活生生的例子,如日期,你想怎麼設置 – Pratik

+0

嗨PRATIK,正如上面提到我加入日期和時間使用calender.add壓延()。我需要爲將來的日期和時間設置鬧鐘。所以將日期和時間參數添加到日曆中,然後將其傳遞給alarmManager。 – nkz

+0

mDay,mMonth,mYear的值是多少?可以請寫日期值的評論 – Pratik

回答

1

我已經實現了AlarmManager多次,以下技術將幫助你。

  1. 計算以毫秒爲單位,例如您的報警時間,你想10分鐘,然後10 * 60 * 1000毫秒當前時間後後設置報警。

  2. 添加您的計算時間在當前毫秒

long currentTime = System.currentTimeMillis(); 
long fireTime = 10 * 60 * 1000;  
Intent ucintent = new Intent(getApplicationContext(),TimeAlarmReceiver.class); 
ucintent.putExtra("isAlarm", true); 

PendingIntent mTimeSlot = PendingIntent.getBroadcast(getApplicationContext(), (int)fireTime , ucintent, PendingIntent.FLAG_ONE_SHOT); 
alarmManager.set(AlarmManager.RTC_WAKEUP,currentTime+ fireTime, mTimeSlot); 

上面的例子可以完美運行。

謝謝你,

+1

謝謝Ketan,我測試了你的方法,它的效果很好。我在代碼中犯了一個小錯誤。代替Calender.add函數,請使用Calender.set()並且代碼正常工作。 – nkz

0

Ketan的答案很好,但有一個錯誤。

long currentTime = System.currentTimeMillis(); 
    long fireTime = 10 * 60 * 1000;  
    Intent ucintent = new Intent(getApplicationContext(),TimeAlarmReceiver.class); 
    ucintent.putExtra("isAlarm", true); 

    PendingIntent mTimeSlot = PendingIntent.getBroadcast(getApplicationContext(), (int) requestCode, ucintent, PendingIntent.FLAG_ONE_SHOT); 
    alarmManager.set(AlarmManager.RTC_WAKEUP,currentTime+ fireTime, mTimeSlot); 

但是,您不想在PendingIntent中使用「fireTime」。你應該有一個請求代碼。這是您創建的用於識別待處理意圖的代碼。它在Ketan的情況下工作,因爲他總是在同一時間使用。但是如果你改變時間,你將會有兩種不同的意圖。

看到https://developer.android.com/reference/android/app/PendingIntent.html