Tôi phát triển một ứng dụng sử dụng AlarmManager để đặt báo thức nhóm (thường là khoảng 50) cần được kích hoạt tại một thời điểm nhất định trong năm. Đây là mã tôi đang sử dụng kể từ khi 4.4 kitkat thay đổi AlarmManager.AlarmManager không hoạt động trên các thiết bị Samsung trong Lollipop
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE);
long setDate = fireDate.getTime(); // it's a calendar date defined above
Intent intent = new Intent(LOCAL_DISPLAY_MESSAGE_ACTION);
PendingIntent pending = PendingIntent.getBroadcast(ctx,
id, intent, PendingIntent.FLAG_UPDATE_CURRENT);
if (Build.VERSION.RELEASE.startsWith("6")) {
am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, setDate, pending);
} else if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT){
am.setExact(AlarmManager.RTC_WAKEUP, setDate, pending);
} else {
am.set(AlarmManager.RTC_WAKEUP, setDate, pending);
}
Ngoài đoạn mã trên, tôi đang sử dụng bộ thu phát sóng được xác định chính xác trong tệp kê khai.
public class LocalReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
PushWakeLocker.acquire(context);
// do some stuff
PushWakeLocker.release();
}
}
Thông tin thêm thay có thể hữu ích.
<uses-sdk
android:minSdkVersion="10"
android:targetSdkVersion="19" />
Kể từ vài tháng trước, tôi đã nhận được đánh giá xấu chỉ từ các thiết bị Samsung (5.0 /5.1 android phiên bản) mà không nhận được thông báo địa phương của họ ở tất cả. Ý tôi là, nó không kích hoạt báo động, có vẻ như thiết bị bỏ qua nó hoặc không thức dậy.
Trong các thử nghiệm, chủ yếu là với Samsung S4 với 5.0.1, tôi luôn luôn nhận được báo động về thời gian, vì vậy điều này khiến tôi phát điên. FYI mã này luôn hoạt động khá tốt.
Tôi đã nghiên cứu rất nhiều về điều này nhưng rất tiếc là tôi không nhận được thông tin hữu ích. Nó không phải là họ nhận được báo động với sự chậm trễ (như tôi đã đọc trong một số chủ đề), đó là họ không nhận được nó ở tất cả. Vì vậy, đây không phải là về vấn đề được biết đến trong lollipop và alarmmanager.
Tôi đánh giá cao thời gian của bạn và mọi đề xuất đều được hoan nghênh!
"Đây là mã tôi đang sử dụng" - Tôi sẽ thay đổi 'if' của bạn để kiểm tra' Build.VERSION_CODES.M'. "Tôi đang sử dụng bộ thu phát sóng" - 'WakeLock' của bạn không cần thiết, vì 'onReceive()' được gọi trong hệ thống 'WakeLock' được cung cấp khi được kích hoạt bởi' AlarmManager'. Tuy nhiên, trừ khi "làm một số công cụ" chỉ là một vài phần nghìn giây, bạn nên chuyển logic đó vào 'IntentService' và sử dụng' WakefulBroadcastReceiver'. Ngoài ra, Samsung (như SONY và những người khác) có chế độ cài đặt Doze của riêng họ trước 6.0, do đó, 'AlarmManager' không đáng tin cậy trừ khi bạn được thêm vào một số danh sách trắng cụ thể cho thiết bị. – CommonsWare