2015-10-21 14 views
7

Tôi đang sử dụng một AlarmManager trong một Dịch vụ được kích hoạt mỗi phút.AlarmManager không hoạt động như mong đợi ở chế độ ngủ trên S5 Neo

PendingIntent pendingIntent = PendingIntent.getService(getApplicationContext(), 0, 
      getUpdateServiceIntent(mContext), PendingIntent.FLAG_UPDATE_CURRENT); 
    AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 

    // Cancel any pending Intent 
    am.cancel(pendingIntent); 

    // Set a new one 
    am.set(AlarmManager.RTC_WAKEUP, 60000, pendingIntent); 

Trên Samsung S5 Neo: Khi màn hình đang hoạt động, nó hoạt động như mong đợi. Khi màn hình tắt, nó được kích hoạt sau mỗi 5 phút (thay vì một).

Tôi thử mã chính xác này trên S5 Mini (với Android 4.4), Nexus 5 5.1 và Nexus 5 6.0, mã này hoạt động tốt.

targetSdkVersion là 19.

Bất kỳ ý tưởng nào để giữ cho AlarmManager hoạt động chính xác khi màn hình tắt? Thời gian trễ vẫn là 5 phút, ngay cả khi tôi yêu cầu 30 giây.

EDIT: Tôi cũng đã thử phương pháp 'setExact', nhưng nó không thay đổi bất cứ điều gì. Vẫn có khoảng thời gian 5 phút giữa mỗi báo thức.

+0

Tôi nghĩ tôi sẽ thêm một số thông tin để xác nhận câu trả lời dưới đây: https://developer.android.com/training/monitoring-device-state/doze-standby.html#restrictions –

Trả lời

10

Bạn có lẽ nên sử dụng

AlarmManager#setExact(int type, long triggerAtMillis, PendingIntent operation)

thay vì

AlarmManager#set(int type, long triggerAtMillis, PendingIntent operation))

Take a look

Từ google:

AlarmManager#set(int type, long triggerAtMillis, PendingIntent operation))

Lưu ý: Bắt đầu từ API 19, thời gian kích hoạt thông qua phương pháp này được coi là không chính xác: báo động sẽ không được gửi trước thời gian này, nhưng có thể được hoãn lại và chuyển giao một thời gian sau đó. Hệ điều hành sẽ sử dụng chính sách này để báo động "hàng loạt" với nhau trên toàn bộ hệ thống, giảm thiểu số lần thiết bị cần "đánh thức" và giảm thiểu việc sử dụng pin. Nói chung, các báo động được lên lịch trong tương lai gần sẽ không được hoãn lại miễn là báo thức được lên lịch trong tương lai.

Edit:

gì tôi đang sử dụng cho một ứng dụng báo thức:

Manifest:

<uses-permission android:name="android.permission.WAKE_LOCK"/>

Java Code:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
    AlarmManager.AlarmClockInfo alarmClockInfo = new AlarmManager.AlarmClockInfo(nextAlarm.getTimeInMillis(), pendingIntent); 
    alarmManager.setAlarmClock(alarmClockInfo, pendingIntent); 
}else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
    alarmManager.setExact(android.app.AlarmManager.RTC_WAKEUP, nextAlarm.getTimeInMillis(), pendingIntent); 
}else { 
    alarmManager.set(android.app.AlarmManager.RTC_WAKEUP, nextAlarm.getTimeInMillis(), pendingIntent); 
} 
+1

Tôi đã thử phương pháp 'setExact' nhưng nó không thay đổi bất cứ điều gì: vẫn còn 5 phút để chờ . Tôi sẽ chỉnh sửa câu hỏi của mình chính xác hơn. –

+0

@MathieuH. Bạn có thể đăng sự cho phép từ tệp kê khai và phiên bản Android nào cũng là S5 Neo không? – Neige

+0

Tôi sử dụng nhiều quyền, bao gồm cả android.permission.WAKE_LOCK. Phiên bản Android S5 Neo là 5.1.1. –

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