9

Tôi có một ứng dụng nghe thông báo qua điện thoại và gửi tin nhắn đến đồng hồ Android Wear qua MessageApi. Mọi thứ hoạt động tốt trừ một số thiết bị chạy Android 6, đặc biệt là Huawei Mate 8 (trông giống như tất cả Huawei Android 6 đều làm điều này).NotificationListenerService và chế độ Doze và Ứng dụng Chờ

Huawei đã thực hiện riêng việc xử lý nền của ứng dụng bị đóng băng (Ứng dụng được bảo vệ). Từ các báo cáo của người dùng, tôi đã xác nhận rằng ứng dụng của tôi có ngoại lệ trong các ứng dụng được bảo vệ của Huawei và cũng ở chế độ Doze của Android 6. Ứng dụng hoạt động OK nhưng sau 15 phút hiển thị chính xác, ứng dụng của tôi sẽ ngừng gửi tin nhắn đến đồng hồ Android Wear đã kết nối. Ứng dụng của tôi cũng có thể ghi lại lịch sử thông báo đã nhận và không có gì đến sau 15 phút ... cho đến khi màn hình điện thoại được bật và ứng dụng của tôi được mở. Sau đó tất cả các thông báo cần phải đến trong khi màn hình của điện thoại đã bị tắt khi thực hiện NotificationListenerService và được gửi tới đồng hồ, tất cả cùng một lúc. Điều này cũng được xác nhận với lịch sử được ghi lại.

Bất kỳ ý tưởng nào về cách sửa lỗi này cho các điện thoại này, đặc biệt là Huawei Mate 8 với Android 6 có chế độ Doze?

Hành vi chính xác của NotificationListenerService trong khi thiết bị ở chế độ ngủ gật và/hoặc ứng dụng ở chế độ chờ?

EDIT

Người sử dụng cũng đã xác nhận rằng điện thoại của họ đang không ở trong một chế độ tiết kiệm điện năng mà còn ảnh hưởng đến các ứng dụng nền và dịch vụ của họ. Lỗi này trông giống như Huawei độc quyền vì không có người dùng Nexus nào đã báo cáo điều này và OnePlus One của tôi với M cũng không thực hiện việc này. Ngoài ra, bản xem trước N hoạt động tốt trên các thiết bị Nexus.

EDIT 2

Tôi đã thêm một dịch vụ foreground tùy chọn (startForeground()) để ứng dụng của tôi có một thông báo thường trú tại các trung tâm thông báo, do đó ứng dụng của tôi nên được loại trừ khỏi tất cả các tối ưu hóa pin. Đối với thông báo dịch vụ nền trước, tôi đã sử dụng mức độ ưu tiên là NotificationCompat.PRIORITY_MIN và tôi đã thêm cờ Notification.FLAG_ONGOING_EVENT. Điều này đã giúp một chút trên điện thoại Huawei nhưng không nhiều, bây giờ các thông báo chậm trễ đến vào NotificationListenerService của tôi ngay sau khi màn hình được bật thay vì sau khi mở ứng dụng của tôi. Tôi không sử dụng số startForeground() trong số NotificationListenerService nhưng trong một Service khác vì tôi không có quyền kiểm soát vòng đời của nó.

Trả lời

0

Tôi không biết về chế độ Doze của Android cho đến khi tôi thấy bài đăng của bạn. Sau đó, tôi đọc this article và có vẻ như đó là cách nó được cho là hoạt động! Nếu bạn muốn nhận thông báo trong chế độ Doze, hãy thử sử dụng PRIORITY_HIGH hoặc PRIORITY_MAX để có mức độ ưu tiên thông báo của bạn, nhưng ngay cả khi nó hoạt động không thực sự có vẻ là giải pháp hoàn chỉnh theo bài viết.

+0

bài viết Đó là về thông báo đẩy và thông báo không địa phương. Tôi không có máy chủ cho ứng dụng của mình, nó hoàn toàn ngoại tuyến, vì vậy tôi không thể đánh thức điện thoại thông qua thông báo đẩy ưu tiên cao. Cũng không thể gửi thông báo đẩy tới điện thoại khi điện thoại đó hiển thị thông báo ... – shelll

+0

Theo bài viết, có bạn sẽ không thể đánh thức thiết bị lên – NecipAllef

2

Đối với thiết bị Huawei (không chắc chắn nếu áp dụng cho tất cả các thiết bị Huawei), bạn cần yêu cầu quyền Ứng dụng được bảo vệ để ứng dụng của bạn không bị đóng băng khi ứng dụng chạy ngầm.

Để phát hiện nếu một thiết bị Huawei đã được bảo vệ phép Apps:

private boolean hasProtectedAppsSetting() { 
    Intent intent = new Intent(); 
    intent.setClassName("com.huawei.systemmanager", "com.huawei.systemmanager.optimize.process.ProtectActivity"); 

    List<ResolveInfo> list = getPackageManager().queryIntentActivities(intent, 
      PackageManager.MATCH_DEFAULT_ONLY); 
    return list.size() > 0; 
} 

Để đưa lên Huawei Protected Apps trang cài đặt:

private void showProtectedAppsSetting() { 
    try { 
     String cmd = "am start -n com.huawei.systemmanager/.optimize.process.ProtectActivity"; 
     if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) { 
      cmd += " --user " + getUserSerial(); 
     } 
     Runtime.getRuntime().exec(cmd); 
    } catch (IOException ignored) { 
    } 
} 

private String getUserSerial() { 
    //noinspection ResourceType 
    Object userManager = getSystemService("user"); 
    if (null == userManager) return ""; 

    try { 
     Method myUserHandleMethod = android.os.Process.class.getMethod("myUserHandle", (Class<?>[]) null); 
     Object myUserHandle = myUserHandleMethod.invoke(android.os.Process.class, (Object[]) null); 
     Method getSerialNumberForUser = userManager.getClass().getMethod("getSerialNumberForUser", myUserHandle.getClass()); 
     long userSerial = (Long) getSerialNumberForUser.invoke(userManager, myUserHandle); 
     return String.valueOf(userSerial); 
    } catch (NoSuchMethodException | IllegalArgumentException | InvocationTargetException | IllegalAccessException ignored) { 
    } 
    return ""; 
} 

Đáng tiếc là tôi đã không tìm thấy bất cứ cách nào để kiểm tra xem người dùng đã cấp ứng dụng của bạn dưới dạng Ứng dụng được bảo vệ. Xin hãy chia sẻ nếu ai biết :)

tham khảo: http://ndroid.info/ldquo_protected_appsrdquo_setting_on_huawei_phones_and_how_to_handle_it

+0

Cảm ơn bạn đã cung cấp thông tin này. Nhưng, như đã đề cập trong câu hỏi, vấn đề là ngay cả khi cho ứng dụng của tôi một ngoại lệ trong Ứng dụng được bảo vệ của Huawei không giải quyết được "tình trạng đóng băng nền". Thậm chí cùng với việc tắt tối ưu hóa pin gốc của Android 6 cộng với dịch vụ nền trước. Đối với một số người dùng, nó là đủ để thêm một ngoại lệ cho cả ứng dụng được bảo vệ và tối ưu hóa pin, nhưng không phải cho tất cả. Ngay cả đối với đa số. – shelll

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