2015-12-16 12 views
5

Tôi đã phát triển ứng dụng báo thức android cần một thứ gì đó mỗi giờ (như 1 giờ chiều, 2 giờ chiều, 3 giờ chiều, 4 giờ chiều, 5 giờ chiều, 6 giờ chiều, vv).Các sự kiện báo thức Android bị trễ

Hiện đang sử dụng alarmManager để tôi nhận được sự kiện broadCast mỗi giờ. Nhưng đôi khi sự kiện bị trì hoãn.

AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 

Log.d(Constants.APP_TAG, "setting beep alarm"); 
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, new Intent("com.mindedges.beephourly.intent.action.NEW_HOUR"),PendingIntent.FLAG_UPDATE_CURRENT); 

alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, AlarmSheduleHelper.getImmediateNextHour().getTimeInMillis(),AlarmManager.INTERVAL_HOUR, pendingIntent); 

Làm cách nào để đảm bảo rằng tôi nhận được sự kiện phát sóng chính xác đúng giờ.

PS: Nó bị trì hoãn trên một số điện thoại cụ thể/phiên bản anroid

Trả lời

4

Trong Android 6.0 Marshmallow, Google đã giới thiệu chế độ "Doze".

đọc thêm về nó ở đây: Optimizing for Doze and App Standby

Và/hoặc xem ở đây: Android Marshmallow 6.0: Introduction to Doze Mode

Trong trường hợp của bạn, Google khuyến cáo sử dụng setAndAllowWhileIdle mà buộc điện thoại để bỏ qua chế độ Nữu Thừa thay set (và setExactAndAllowWhileIdle thay vì setExact .)

NB! Có vẻ như, không có sự tương tự cho setRepeating, vì vậy bạn phải lên lịch lặp lại tiếp theo "thủ công" với setExactAndAllowWhileIdle, từng cái một.

Đối với thiết bị chạy Android 4.4 KitKat trở lên - hãy xem xét sử dụng setExact thay vì cũ set, vì hệ điều hành này sẽ cố gắng thay đổi báo thức để giảm thiểu tiếng ồn và sử dụng pin. Có thể có nhiều điểm cần ghi nhớ hơn - ví dụ một số OEM có thể cài đặt sẵn utils để tiết kiệm pin, nhưng ít nhất nó phải bao gồm cổ phiếu Android và có lẽ phần lớn các thiết bị phổ biến.

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