2011-12-12 231 views
45

我正在構建鬧鐘應用程序。我已經成功實現了基本的鬧鐘功能。如何使用android鬧鐘管理器設置多個鬧鐘

Calendar calendar = Calendar.getInstance(); 
calendar.set(calendar.HOUR_OF_DAY, sHour); 
calendar.set(calendar.MINUTE, sMin); 
calendar.set(calendar.SECOND, 0); 
calendar.set(calendar.MILLISECOND, 0); 
long sdl = calendar.getTimeInMillis(); 

Intent intent = new Intent(AlarmList.this, AlarmReceiver.class); 
PendingIntent sender = PendingIntent.getBroadcast(AlarmList.this, 0, intent,PendingIntent.FLAG_UPDATE_CURRENT); 
AlarmManager ALARM1 = (AlarmManager)getSystemService(ALARM_SERVICE); 
ALARM1.set(AlarmManager.RTC_WAKEUP, sdl, sender); 

在我的應用程序中,用戶可以選擇天(星期日,星期一...)每週重複一次警報。 我試圖創建多個鬧鐘來重複每週,但不知道如何去做。 可以使用(重複)間隔創建它,還是應創建多個警報管理器?

+0

只需使用id字段...查看文檔上alarmmanager集。 – Warpzit

+0

在這篇文章看到我的答案http://stackoverflow.com/questions/12785702/android-set-multiple-alarms/31805171#31805171 – Junaid

回答

126

您需要使用different Broadcast id's作爲pending intents。事情是這樣 :

Intent intent = new Intent(load.this, AlarmReceiver.class); 
    final int _id = (int) System.currentTimeMillis(); 
    PendingIntent appIntent = PendingIntent.getBroadcast(this, _id, intent,PendingIntent.FLAG_ONE_SHOT); 

使用系統的時間應該是每個未到 意圖你火的唯一標識符。

+1

非常感謝你,這就是我是尋找和找不到什麼搜索和如何搜索,最後這解決了我的問題,謝謝很多隊友:) –

+2

我們最終如何取消所有這些?我們需要保留_id的引用? –

+1

@ user2427819是的,對於取消,我們必須通過相同的身份證,我們用於PendingIntent.getBroadcast –

10

the docs

如果已經有這個意向計劃(有兩個意圖的 平等的filterEquals(Intent)被定義報警,然後 它會通過這一個

拆除和更換

多個AlarmManagers不能解決您的問題,如果他們有多個不同的警報(不同的時間和不同的日子),那麼你需要在每次你設置BroadcastReceiver消除先前的警報。

您還需要保持RECEIVE_BOOT_COMPLETED並有一個BroadcastReceiver接收引導,以便如果電話重新啓動,您可以重新安排您的警報。

+1

謝謝你的幫助。我會嘗試 – Hassy31

7

要設置多個警報,您需要每次定義您的Intent以便與其他區別。我覺得這樣做最簡單的方法是設置你的Intent東西data領域如下:

// give your alarm an id and save it somewhere 
// in case you want to cancel it in future 
String myAlarmId = ...; 

// create your Intent 
Intent intent = new Intent(AlarmList.this, AlarmReceiver.class); 
intent.setData(Uri.parse("myalarms://" + myAlarmId)); 
... 

代碼@ Hassy31的其餘部分是罰款,是和保持不變。

請注意,根據文檔,PendingIntent.getBroadcast()方法中的requestCode參數(根據@parag建議)未使用,因此這不是正確的解決方法。

+1

嗨,它說它是未使用的? – blacharnia

+0

在撰寫本文時可能這是真實的,並且可能不再真實。 –

2

設定的廣播id爲的PendingIntent

for (int id = 0; id < 3; id++) { 
     // Define pendingintent 
     PendingIntent pendingIntent = PendingIntent.getBroadcast(this, id,ntent, 0); 
     // set() schedules an alarm 
     alarmManager.set(AlarmManager.RTC_WAKEUP, alertTime, pendingIntent); 
}