2015-07-14 17 views
14

Tôi đang kiểm tra thông báo có thể xếp chồng (Stacking Notifications article).Thông báo không hiển thị khi setGroup() được gọi trong Android KitKat

Tôi phát hiện thấy trong một số trường hợp, thông báo không được hiển thị sau khi gọi notify() trong các thiết bị chạy Android 4.X KitKat.

Để đơn giản chỉ là vấn đề tôi đã tạo mã này mà mô phỏng một thông báo (button1) và thông báo thứ hai với một bản tóm tắt (button2)

private final static int NOTIFICATION_ID_A=6; 
private final static int NOTIFICATION_ID_B = 7; 
private final static int NOTIFICATION_ID_SUMMARY = 8; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    findViewById(R.id.button).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      showNotif(NOTIFICATION_ID_A,false); 
     } 
    }); 
    findViewById(R.id.button2).setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      showNotif(NOTIFICATION_ID_B,false); 
      showNotif(NOTIFICATION_ID_SUMMARY,true); 
     } 
    }); 
} 

private void showNotif(int notificationId,boolean groupSummary) { 
    CharSequence title="Title "+notificationId; 
    CharSequence message="Message "+notificationId; 
    NotificationCompat.Builder notifBuilder = new NotificationCompat.Builder(this); 
    notifBuilder.setSmallIcon(R.drawable.icon_notifications); 
    notifBuilder.setContentTitle(title); 
    notifBuilder.setContentText(message); 
    notifBuilder.setGroupSummary(groupSummary); 
    notifBuilder.setContentIntent(PendingIntent.getActivity(this, 0, new Intent(this, MainActivity.class), PendingIntent.FLAG_UPDATE_CURRENT)); 
    notifBuilder.setGroup("group_" + 1); 
    NotificationManagerCompat.from(this).notify(notificationId, notifBuilder.build()); 
} 

Ý tưởng là người đầu tiên nhấn button1 và sau đó là button2. Nó hoạt động tuyệt vời trong android 5.0+ hiển thị notif đầu tiên đầu tiên và tóm tắt khi nút thứ hai được nhấp vào, nhưng trong Android 4.X button1 không hiển thị bất cứ điều gì.

Lỗi ở đâu?

Cảm ơn

+0

Xin chào @Addev Tôi gặp vấn đề tương tự. Làm thế nào bạn giải quyết được điều này? Bất kỳ ý tưởng? Cảm ơn trước. – sourcerebels

+0

Điều tương tự ở đây. Thông báo cá nhân đầu tiên không được hiển thị và thông báo nhóm chỉ được hiển thị với thông báo cá nhân thứ hai. Bị hỏng trên KitKat và bên dưới, hoạt động tốt trên Lollipop và ở trên. Do hạn chế về thời gian, tôi phải vô hiệu hóa nhóm thông báo cho API <21. Điều này có thể là lỗi trong NotificationManagerCompat đối với API Lollipop trước hoặc chúng tôi thiếu một số cuộc gọi/phương thức huyền bí ở đâu đó để thực hiện công việc này đúng. Dù bằng cách nào, tôi đang thêm tiền thưởng vào đây để thu hút sự chú ý đến điều này. – Matej

+0

bạn đã đặt những phiên bản sdk tối thiểu và mục tiêu hiện tại của mình là gì? – AndroidMechanic

Trả lời

8

Câu trả lời ngắn gọn là xuất hiện hiển thị thông báo xếp chồng lên thiết bị KitKat không được thư viện hỗ trợ tự động hỗ trợ.

Vì bạn đã yêu cầu một sự khai sáng ở đây là những phát hiện của tôi dựa trên thử nghiệm với hai thiết bị chạy Android 4.4.2. Tôi cũng đang sử dụng AppCompat 23.1.1.

Khi bạn tìm hiểu mã nguồn của thư viện, bạn sẽ thấy rằng khi thông báo được hiển thị, thông báo sẽ hiển thị trực tiếp số SideChannel hoặc NotificationManager để hiển thị thông báo. Dưới đây là phương pháp NotificationManagerCompat.notify để tham khảo cho thấy điều này:

public void notify(String tag, int id, Notification notification) { 
    // MY COMMENT: true when the notification has the extra 
    // NotificationCompatJellybean.EXTRA_USE_SIDE_CHANNEL set to true. 
    if (useSideChannelForNotification(notification)) { 
     pushSideChannelQueue(new NotifyTask(mContext.getPackageName(), id, tag, notification)); 
     // Cancel this notification in notification manager if it just transitioned to being 
     // side channelled. 
     IMPL.cancelNotification(mNotificationManager, tag, id); 
    } else { 
     // MY COMMENT: this calls notificationManager.notify(id, notification); in the base implementation 
     IMPL.postNotification(mNotificationManager, tag, id, notification); 
    } 
} 

Bây giờ khi bạn hiển thị một thông báo mà không thành lập một nhóm các thông báo được hiển thị bằng cách sử dụng quản lý thông báo mà làm việc, nhưng nếu một nhóm được thiết lập nó sẽ cố gắng sử dụng kênh phụ để gửi thông báo và hủy bất kỳ thông báo nào được hiển thị bằng cách sử dụng trình quản lý thông báo như đã thấy trong phương thức trên.

Proof rằng kênh phụ được sử dụng khi một nhóm được thiết lập được tìm thấy trong NotificationCompatKitKat.Builder nơi bạn sẽ thấy đoạn mã sau:

if (groupKey != null) { 
    mExtras.putString(NotificationCompatJellybean.EXTRA_GROUP_KEY, groupKey); 
    if (groupSummary) { 
     mExtras.putBoolean(NotificationCompatJellybean.EXTRA_GROUP_SUMMARY, true); 
    } else { 
     mExtras.putBoolean(NotificationCompatJellybean.EXTRA_USE_SIDE_CHANNEL, true); 
    } 
} 

này tất cả dường như không giống như một vấn đề lớn cho đến khi bạn nhìn vào những gì các Phương thức pushSideChannelQueue(...) thực hiện khi hiển thị thông báo bằng cách sử dụng SideChannel.

Nó kết thúc tìm kiếm một dịch vụ có thể xử lý các hành động android.support.BIND_NOTIFICATION_SIDE_CHANNEL trong đó không có một theo mặc định để phương pháp chỉ đơn giản là trả về. Đây là những gì gây ra thông báo để không bao giờ được hiển thị.

Có một lớp trừu tượng NotificationCompatSideChannelService trong thư viện tương thích mà bạn có thể thực hiện theo quy định của documentation nếu bạn muốn viết của riêng bạn SideChannelService nhưng nó có vẻ như bạn là tốt hơn hết chỉ cần không sử dụng thông báo nhóm trong KitKat và các thiết bị trước.

+1

Cảm ơn bạn rất nhiều vì câu trả lời chi tiết này, đó là thực sự hữu ích mặc dù không thực sự đưa ra một giải pháp cho vấn đề. Tôi đang trên đường, vì vậy tôi sẽ xem xét nó sâu hơn một chút khi tôi trở lại! – Matej

+0

Bạn nhận được tiền thưởng, bạn xứng đáng với nó. Tôi nghĩ rằng tôi sẽ gắn bó với việc không sử dụng các thông báo được nhóm trên KitKat và các phiên bản Android trước đó. Nhưng về mặt tươi sáng, câu hỏi này là xa từ cuối chết nó được sử dụng để được, vì vậy cảm ơn bạn cho điều đó! Nếu chỉ OP sẽ thấy bản cập nhật và xem xét chấp nhận câu trả lời. – Matej

+0

@Matej Cảm ơn. Tôi phải nói bản thân mình đã thất vọng sau khi phát hiện ra điều này nhưng ít nhất là bạn đã nói rằng có một số đóng cửa. Nó chắc chắn sẽ được tốt đẹp cho họ đề cập đến điều này trong tài liệu ở nơi đầu tiên! –

0

Giải pháp của George về mặt kỹ thuật nhưng không thân thiện với người dùng vì được dựa trên NotificationListener phải được bật theo cách thủ công từ cài đặt bảo mật điện thoại của người dùng.

Tôi thấy phương pháp làm việc này, thiết lập setGroupSummary(true) cũng mà những người đại diện thông báo đơn và thông báo cho tất cả mọi người với cùng id mà xác định chủng loại thông báo (ví dụ thông điệp nói chuyện thay vì duy nhất). Nếu không có kiểu nhóm cụ thể nào được áp dụng, thông báo sẽ được đăng dưới dạng một nhóm không được nhóm thông thường. Nếu một nhóm được đăng, nó sẽ thay thế bất kỳ thông báo duy nhất bởi vì có tất cả cùng một id.

Telegram for Android áp dụng kỹ thuật này cho các thông báo nhóm cũng trên KitKat và thấp hơn.

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