2015-07-14 14 views
14

(Stacking Notifications article) numaralı istiflenebilir bildirimleri test ediyorum.Android KitKat'ta setGroup() çağrıldığında bildirim gösterilmiyor

Bazı durumlarda, bildirimlerin, Android 4.X KitKat çalıştıran aygıtlarda notify() numaralı çağrıdan sonra gösterilmediğini fark ettim.

için basitçe bir özet (BUTTON2) içeren bir bildirim (button1) ve ikinci bir bildirim simüle bu kodu

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()); 
} 

fikri düğmesini1 ardından düğmesini2 basın ilk yaratılan sorunu. Ikinci düğme tıklandığında ilk notif ilk ve özet gösteren android 5.0+ harika çalışıyor, ancak Android 4.X içinde button1 hiçbir şey göstermiyor.

Hata nerede?

Teşekkür

+0

Merhaba @Addev Aynı sorunu yaşıyorum. Bunu nasıl çözdün? Herhangi bir fikir? Şimdiden teşekkürler. – sourcerebels

+0

Burada da aynı şey. İlk kişisel bildirim gösterilmez ve grup bildirimi yalnızca ikinci bireysel bildirim ile gösterilir. KitKat'ta ve aşağıda kırık, Lollipop ve yukarıda iyi çalışıyor. Zaman kısıtlamaları nedeniyle API <21 için bildirim gruplamasını devre dışı bırakmam gerekiyordu. Bu, Lollipop öncesi API'lar için NotificationManagerCompat'ta bir hata olmalı ya da bu işi yapmak için bir yerde gizli bir argüman/yöntem çağrısını kaçırıyoruz. doğru şekilde. Her halükarda, buraya biraz dikkat çekmek için bir ödül ekliyorum. – Matej

+0

Şu anki min ve hedef sdk sürümleri olarak neler ayarladınız? – AndroidMechanic

cevap

8

bu kısa cevabı otomatik destek kütüphanesi tarafından desteklenmeyen bir KitKat cihazda yığılmış bildirim gösterebilir görünmesidir.

Aydınlanma isteğinde bulunduğunuzdan beri, Android 4.4.2'yi çalıştıran iki cihazla yapılan testlere dayanan bulgularım var. Ben de AppCompat 23.1.1 kullanıyorum.

Kitaplığın kaynak kodunu girdiğinizde, bir bildirim görüntülendiğinde, iletiyi göstermek için doğrudan SideChannel veya NotificationManager adlı bir öğeyi kullanacağını görürsünüz. Aşağıda bu gösteren başvuru için NotificationManagerCompat.notify yöntemdir: bildirim çalışır bildirim yöneticisini kullanarak gösterilir bir grup ayarlamadan bir bildirim gösterdiğinde Şimdi

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); 
    } 
} 

ancak bir grup ayarlanırsa o dener bildirimi göndermek ve yukarıdaki yöntemde görüldüğü gibi bildirim yöneticisi kullanılarak gösterilen herhangi bir bildirimi iptal etmek için yan kanalı kullanın.

kanıtı aşağıdaki kodu göreceksiniz nerede ayarlanmış bir grup NotificationCompatKitKat.Builder bulunduğunda yan kanal kullanılmasını: ne bakmak kadar

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); 
    } 
} 

Bu büyük bir anlaşma gibi görünmüyor pushSideChannelQueue(...) yöntemi, SideChannel kullanarak bir bildirim gösterirken yapar.

android.support.BIND_NOTIFICATION_SIDE_CHANNEL eyleminin üstesinden gelebilecek bir hizmet aramayı sonlandırır, bu yöntemde varsayılan olarak bir tane yoktur, böylece yöntem basitçe döner. Bu, bildirimin hiçbir zaman gösterilmemesine neden olan şeydir.

Eğer SideChannelService kendi yazmak istiyorsanız documentation göre uygulayabilir uyumluluk kütüphanesinde bir NotificationCompatSideChannelService soyut sınıf vardır ama sen daha iyi olur gibi sadece KitKat'ta ve önceki cihazlarda gruplandırılmış bildirimleri kullanarak görünmemektedir.

+1

Bu ayrıntılı cevap için çok teşekkür ederim, bu Gerçekten de soruna bir çözüm sunmasa da gerçekten yararlı. Şimdi yoldayım, o yüzden geri döndüğümde biraz daha derine bakarım! – Matej

+0

Ödülün var, hak ediyorsun. KitKat'ta ve Android'in önceki sürümlerinde gruplanmış bildirimleri kullanmamaya devam edeceğimi düşünüyorum. Ama parlak tarafta, bu soru eskiden olduğu kadar çıkmaz, bu yüzden bunun için teşekkürler! Eğer sadece OP güncellemeyi görseydi ve cevabı kabul etmeyi düşünürdü. – Matej

+0

@Matej Teşekkürler. Bunu keşfettikten sonra kendimi hayal kırıklığına uğrattığımı söylemeliyim ama en azından bir kapanış olduğunu söylediniz. İlk etapta bu belgelere değinmek onlar için iyi olurdu! –

0

George çözüm teknik olarak doğru ama kullanıcı dostu çünkü kullanıcı tarafından telefon güvenlik ayarından elle etkin olmak zorunda bir NotificationListener dayanmaktadır değildir.

Bu çalışma yöntemi, aynı zamanda setGroupSummary(true) set bulmak için hangi tek bildirim beyan ve bildirim kategorisini (örn mesajlar yerine tek konuşma) belirtmek aynı kimliğe herkesi haberdar olanlar. Belirli bir gruplama stili uygulanmazsa, bildirim gruplandırılmayan bir normal olarak gönderilir. Gruplandırılmış bir ileti gönderildiyse, tüm kimlik kimliğine sahip olduğundan tek bir bildirimin yerini alacaktır.

Android için Telegram, bu tekniği KitKat'ta ve altta bulunan bildirimleri gruplandırmak için uygulayın.

İlgili konular