12

Tôi đang theo dõi mã mẫu để gửi thông báo cập nhật sau mỗi 10 giây. Mã theo sau và mã nằm trong số UpdateService cho số AppWidgetProvider. Nếu tôi đặt Thread.sleep(10*1000); tôi có thể thấy hành vi mong đợi của vòng lặp dịch vụ của mình. Tôi rõ ràng có một cái gì đó về cơ bản sai lầm đó là kích hoạt ngay lập tức. Nó được coi là một PendingIntent của một báo thức sẽ phát sóng cập nhật cho người nghe của tôi.Tại sao trình quản lý báo thức Android của tôi lại kích hoạt ngay lập tức?

long nextUpdate = 10*1000; 
Log.d(TAG, "Requesting next update in " + nextUpdate + " msec."); 

Intent updateIntent = new Intent(ACTION_UPDATE_ALL); 
updateIntent.setClass(this, UpdateService.class); 

PendingIntent pendingIntent = PendingIntent.getService(this, 0, updateIntent, 0); 

// Schedule alarm, and force the device awake for this update 
AlarmManager alarmManager = (AlarmManager)getBaseContext().getSystemService(Context.ALARM_SERVICE); 
alarmManager.setRepeating(AlarmManager.ELAPSED_REALTIME, SystemClock.elapsedRealtime(), 
    nextUpdate, pendingIntent); 

Trả lời

21

AlarmManager.setRepeating được định nghĩa là public void setRepeating (int type, long triggerAtTime, long interval, PendingIntent operation) Đối số thứ 2 là lần đầu tiên được gọi. Bạn đang yêu cầu nó bắt đầu tại SystemClock.elapsedRealtime(), hiện tại.

+0

Nhờ cả hai +1 từ tôi cho câu trả lời nhanh và chính xác. Về vấn đề tiếp theo. Khá trớ trêu thay, tôi đã cố gắng đưa ra một bình luận thứ hai quá sớm (<15 giây), vì vậy tôi nhận được một thông báo hẹn giờ-pop từ SO. :)) – mobibob

+0

im làm như thế này 'amAlarm1.setInexactRepeating (AlarmManager.RTC_WAKEUP, 120000, AlarmManager.INTERVAL_DAY, alarm1Pending); mục đích vẫn đang chờ xử lý đang kích hoạt ngay lập tức? ' –

+0

@MuhammadBabar: Bạn thực sự nên đăng câu hỏi mới. Tuy nhiên, để trả lời câu hỏi của bạn, bạn đang chuyển '120000' thành triggerAtTime, tương ứng với 'Fri, 02 Jan 1970 09:20:00 GMT' – Falmarri

15

Bạn đang nói setRepeating() mà bạn muốn báo thức đầu tiên tắt ngay lập tức (SystemClock.elapsedRealtime()). Nếu bạn muốn báo thức đầu tiên tắt đi một thời gian khác, hãy thêm một khoảng trống (SystemClock.elapsedRealtime()+nextUpdate).

+0

+1 để có câu trả lời tương tự như tôi =] – Falmarri

+0

Nhờ cả hai +1 từ tôi cho câu trả lời nhanh và chính xác. Về vấn đề tiếp theo. – mobibob

3

Nếu bạn đang tạo PendingIntent của một báo thức cho thời gian qua nó sẽ được bắn ngay lập tức. Ví dụ - Lịch trình báo động cho ngày hôm nay 8AM nhưng thực thi mã khoảng 11AM sẽ cháy ngay lập tức.

Giải pháp:

cal.add(Calendar.DATE, 1); 

long delay = 24 * 60 * 60 * 1000; 
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(), delay,pendingIntent);` 

này sẽ cháy sự kiện trên vào ngày hôm sau tại thời gian quy định (nghĩa là 8:00);

Các vấn đề liên quan