2011-12-12 31 views
45

Tôi đang tạo ứng dụng báo thức. Tôi đã triển khai thành công chức năng báo thức cơ bản.cách đặt nhiều báo thức bằng cách sử dụng trình quản lý báo thức 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); 

trong ứng dụng của tôi, người dùng có thể chọn ngày (chủ nhật, thứ hai ...) để lặp lại báo thức hàng tuần. Tôi đang cố tạo nhiều báo thức để lặp lại hàng tuần nhưng không biết cách thực hiện. Tôi có thể tạo nó bằng khoảng lặp (lặp lại) hoặc tôi có nên tạo nhiều trình quản lý cảnh báo không?

+0

Đơn giản chỉ cần sử dụng trường id ... kiểm tra tài liệu cho thiết lập trên alarmmanager. – Warpzit

+0

Xem câu trả lời của tôi tại bài đăng này http://stackoverflow.com/questions/12785702/android-set-multiple-alarms/31805171#31805171 – Junaid

Trả lời

126

Bạn cần sử dụng different Broadcast id's cho số pending intents. Một cái gì đó như này:

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

Sử dụng thời gian hệ thống phải là một định danh duy nhất cho mỗi cấp phát ý bạn hỏa hoạn.

+1

Cảm ơn bạn rất nhiều đó là những gì tôi đã tìm kiếm và không thể tìm thấy những gì để tìm kiếm và cách tìm kiếm, cuối cùng điều này đã giải quyết được vấn đề của tôi, Cảm ơn bạn rất nhiều :) –

+2

làm sao chúng ta có thể hủy bỏ tất cả chúng? chúng ta cần giữ tham chiếu của _id? –

+1

@ user2427819 có, để hủy bỏ chúng tôi phải vượt qua cùng một id mà chúng tôi sử dụng cho PendingIntent.getBroadcast –

10

Từ the docs:

Nếu có đã là một báo động cho Ý định này dự kiến ​​(với bình đẳng giữa hai ý đồ được xác định bởi filterEquals(Intent), sau đó nó sẽ được loại bỏ và thay thế bằng này một

Nhiều AlarmManagers sẽ không giải quyết được sự cố của bạn.Nếu có nhiều báo thức khác nhau (thời điểm khác nhau và các ngày khác nhau), thì bạn cần phải đặt báo thức trong BroadcastReceiver mỗi lần bạn f tắt báo thức trước đó.

Bạn cũng cần giữ RECEIVE_BOOT_COMPLETED và có BroadcastReceiver để nhận khởi động để nếu điện thoại được khởi động lại, bạn có thể lên lịch lại báo thức của mình.

+1

cảm ơn sự giúp đỡ của bạn. Tôi sẽ thử – Hassy31

7

Để đặt nhiều báo thức, bạn cần phải xác định Intent mỗi lần để nó có thể phân biệt với những người khác. Cách đơn giản nhất tôi tìm thấy để làm điều này là để thiết lập các lĩnh vực data của Intent một cái gì đó của bạn như sau:

// 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)); 
... 

Phần còn lại của bạn đang @ Hassy31 là tốt như là và vẫn không thay đổi.

Lưu ý rằng tham số requestCode trong phương thức PendingIntent.getBroadcast() (như đề xuất bởi @parag) không được sử dụng theo tài liệu nên đây không phải là cách phù hợp để thực hiện.

+1

Xin chào, nó nói nó không được sử dụng ở đâu? – blacharnia

+0

Có thể điều này là đúng tại thời điểm viết và có thể không còn đúng nữa. –

2

bộ Phát id cho 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); 
} 
Các vấn đề liên quan