6

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!

+0

"Đâ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

Trả lời

9

Vấn đề của bạn (hoặc cơn ác mộng) là Samsung Smart Manager. Ứng dụng này được cài đặt sẵn với tất cả các điện thoại Samsung từ năm 2015 và được cho là hủy kích hoạt Ứng dụng không được sử dụng. "Làm cách nào để biết ứng dụng nào không được sử dụng?" Bạn có thể yêu cầu - đơn giản:

Mọi ứng dụng chưa được người dùng khởi chạy trong 3 ngày sẽ bị hủy kích hoạt.

Tất cả các mục nhập AlarmManager còn lại - tất nhiên - cũng bị xóa. Bạn có thể đọc về nó trên "Diễn đàn nhà phát triển" của họ. Vui lòng theo dõi here hoặc here cho đến khi các chủ đề này bị nhân viên xóa. Tôi chưa thấy ai đó từ Samsung trả lời chủ đề.

Cách duy nhất để "khắc phục" điều này là thông báo cho Người dùng ứng dụng của bạn về tình huống và cho họ biết cách đưa danh sách ứng dụng của bạn vào Trình quản lý thông minh. Chúng tôi đã phải thiết lập một trang web với các hướng dẫn từng bước cho thấy cách thực hiện điều này cho người dùng của chúng tôi.

Bạn có thể nghĩ về việc thiết lập dịch vụ nền hoặc gọi AlarmManager cứ sáu giờ một lần - không có công cụ nào trong số này sẽ hoạt động.

+2

Cảm ơn bạn đã chia sẻ kết quả tìm kiếm của mình với tôi! Bạn đã cứu ngày của tôi. Nó thực sự gây phiền nhiễu rằng Samsung làm một điều như vậy và không chịu trách nhiệm về nó. smh. –

+2

CẬP NHẬT: Nếu tên gói của bạn chứa "cảnh báo" hoặc "báo thức", Trình quản lý thông minh sẽ không tắt ứng dụng. Thêm tại đây: http: // stackoverflow.com/a/34085645/128092 – saibotd

+0

Bạn có biết việc sử dụng JobScheduler thay vì AlarmManager có giúp ích trong trường hợp này không? – jakk

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