2014-10-21 18 views
7

çalışmıyor ben cevabını bulamıyorum bir sorun var. AndroidDeveloper eğitimlerini denedim, burada stackoverflow üzerinde ve google'da arama yaptım ama arama becerilerim çok yandı ya da bence cevaplarımın cevabını soruyorum.Yığın bildirimleri()

Birden fazla fikir varken tüm yeni mesajlar için bir bildirim haline mesaj bildirimleri yığını istiyorum. Her mesaj için bir bildirim görünebilir ancak yığın/özet bildirimi yapamıyorum. http://developer.android.com/images/android-5.0/notifications/Summarise_Dont.png

İstediğim şudur:

alıyorum iyi budur http://developer.android.com/images/android-5.0/notifications/Summarise_Do.png

Ben API 19 kullanıyorum ve geri uyumlu olmak zorunda değildir. Kodumu AndroidStudio'da yazıp Genymotion'da test ediyorum.

Birden bildirimleri sahip olmanın sonucu ile NotificationCompatManager kullanarak denedi:

NotificationManager notificationManager=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

Benim bildirim görünüyor: NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);

Ben de aynı sonucu NotificationManager kullanarak denedi, birden fazla bildirimleri ise böyle:

Notification notification = new NotificationCompat.Builder(this) .setContentTitle("New message from... ") .setContentText("Message:...") .setSmallIcon(R.drawable.icon) .setContentIntent(pIntent) .setSound(RingtoneManager.getDefaultUri(TYPE_NOTIFICATION)) .setGroup(mNoti) .setGroupSummary(true) .setAutoCancel(true) .build();

Ve böyle bildirimi ateş:

her bildirim için sayacı artırır böylece her bildirim kendi kimliği vardır
notificationManager.notify(counter, notification); 

.

Ben de succsess olmadan bildirim bina ve fiering için bu formu denedi:

NotificationCompat.Builder notificationBuilder = 
      new NotificationCompat.Builder(this) 
        .setSmallIcon(R.drawable.icon) 
        .setContentTitle("message from...") 
        .setContentText("message...") 
        .setContentIntent(pIntent) 
        .setAutoCancel(true) 
        .setGroup(mNoti) 
        .setGroupSummary(true) 
        .setSound(RingtoneManager.getDefaultUri(TYPE_NOTIFICATION)); 


    notificationManager.notify(counter, notificationBuilder.build()); 

setGroup açıkçası benim için kayda gelmez. Neden işe yaramadığını ya da nasıl çalışmam gerektiğini anlamıyorum. Böyle

grubum görünüm:

final static String mNoti = "mNoti"; 

Ben yeni bildirim eskileri geçersiz kılar, böylece tüm bildirimleri için aynı kimliği kullanarak ve setNumber kullandığını istediklerini uzaktan yakından gelen tek şey (int) bildirimi oluştururken. Ancak bu bana gerçekten istediğim sonucu vermiyor çünkü kullanıcı tarafından ele alınmayan bildirimlerin sayısını alabileceğimi düşünmüyorum. Ya da yapabilir miyim?

kimse bana istenen hedefe varmak yardımcı olabilir misiniz? tüm bildirimleri true grup özetini ayarlamak çünkü

cevap

1

Eğer http://developer.android.com/images/android-5.0/notifications/Summarise_Dont.png gibi sonuçlar elde nedenidir. API belgelerinde şu şekilde tanımlanır: Set this notification to be the group summary for a group of notifications. Bu, her bildirimin bir özet olarak ele alınacağı ve dolayısıyla yeni bir bildirim olarak görüntüleneceği anlamına gelir.

Yeni özeti Yeni bir bildirim almak her zaman gönderebilir, sorununuzu çözmek için. Ben% 100 bu iyi çözüm olduğundan emin değilim unutmayın, ancak sorunu çözer. I düğmesi tıklaması göre bildirim ekleyen bir test uygulaması oluşturuldu:

public class MyActivity extends Activity { 

    private final static String GROUP_KEY_MESSAGES = "group_key_messages"; 
    public static int notificationId = 0; 
    private NotificationManagerCompat manager; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_my); 

     manager = NotificationManagerCompat.from(this); 
     manager.cancelAll(); 
    } 

    public void addNotification(View v) { 
     notificationId++; // Increment ID 

     Bitmap icon = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); 

     Intent viewIntent = new Intent(this, ShowNotificationActivity.class); 
     viewIntent.putExtra("notificationId", notificationId); // Put the notificationId as a variable for debugging purposes 

     PendingIntent viewPendingIntent = PendingIntent.getActivity(this, notificationId, viewIntent, 0); // Intent to next activity 

     // Group notification that will be visible on the phone 
     Notification summary = new NotificationCompat.Builder(this) 
       .setAutoCancel(true) 
       .setContentIntent(viewPendingIntent) 
       .setContentTitle("New notifications") 
       .setContentText("You have "+notificationId+" new messages") 
       .setLargeIcon(icon) 
       .setGroup(GROUP_KEY_MESSAGES) 
       .setGroupSummary(true) 
       .build(); 

     manager.cancelAll(); // Is this really needed? 
     manager.notify(notificationId, summary); // Show this summary 
    } 
} 

ShowNotificationActivity:

public class ShowNotificationActivity extends Activity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_show_notification); 

     Intent intent = getIntent(); 
     int counter = intent.getIntExtra("COUNTER", -57); 
     Log.d("COUNTER", ""+counter); 

     TextView view = (TextView)(findViewById(R.id.textView)); 
     view.setText("You have just read "+counter+" messages"); 
     MyActivity.notificationId = 0; // Reset ID. Should not be done like this, but used to show functionality. 
    } 
} 

ilk etkinlik MyActivity bildirim işlemek için kullanılır. Sanırım bu daha çok alıcılarda yapıldı. MyActivity'deki bir düğme, yeni bildirim özetini zorlayan addNotification öğesini tetikler. Özeti eklemeden önce tüm eski özetler iptal edilir. özete tıkladığınızda, verilerin gösterildiği ShowNotificationActivty adı verilen başlangıç ​​etkinliğine ulaşırsınız. Bu ise, örneğin bir e-posta uygulaması, MyActivity bir veritabanına kaydedilmiş e-postaları e-posta alıcısı çeşit olacaktır. NotificationId, veritabanında kayıtlı bazı kimliklere ayarlanmış olabilir. Bildirimler tıklandığında, e-posta, notificationId'ye göre görüntülenebilir.

umarım bu yardımcı olur :)

+1

Tavsiyeni izledi ve setGroupSummary ve setGroup kullanılan ve yukarıda yalnızca Android 5.0 ve olsa çalışma yaptı. 4.4 ve 4.2 her bir bildirimi ayrı ayrı gösterir. Bu burada asıl soruya ötesine geçer, bu yüzden oluşturulan bir yenisi: http://stackoverflow.com/q/31483772/1204377 –

+0

@AntonCherkashyn Eğer bu çizgiyi dahil ettik emin misiniz: 'manager.cancelAll(); // Bu gerçekten gerekli mi? '? Bu, yalnızca açık olanı özetleyen eski bildirimleri kapatmak için "hile" dir. – Pphoenix

+0

Denedim ve sonra ben sadece telefonda, gerçek üzerinde özet bildirimi gördüm ancak nihai amacın Android Wear'de yığılmış bildirim olması ve ben android geliştirici giodelines başına bireysel bildirimleri + 1 özet bildirim yangın zorunda yapmaktır https://developer.android.com/training/wearables/notifications/stacks.html. Calling manager.cancelAll(); ayrıca Android Wear'daki bildirimleri de reddeder. tek tek bu bildirimleri özel eylemleri beri Böylece, işe yaramaz/sayfalar/vb –