2014-10-21 29 views
7

Tôi gặp sự cố mà tôi không thể tìm thấy câu trả lời. Tôi đã thử các hướng dẫn AndroidDeveloper, tôi đã tìm kiếm ở đây trên stackoverflow và trên google, nhưng một trong hai kỹ năng tìm kiếm của tôi là awefull hoặc không có câu trả lời tôi nghĩ rằng câu trả lời vấn đề của tôi.Thông báo ngăn xếp trong Kitkat (API 19) bằng cách sử dụng setGroup() không hoạt động

Tôi muốn ngăn thông báo thư vào một thông báo cho tất cả thư mới khi có nhiều thư. Tôi có thể xuất hiện thông báo cho từng thư nhưng tôi không thể tạo thông báo ngăn xếp/tóm tắt.

Điều tốt nhất tôi nhận được là: http://developer.android.com/images/android-5.0/notifications/Summarise_Dont.png

Những gì tôi muốn đây là: http://developer.android.com/images/android-5.0/notifications/Summarise_Do.png

Tôi đang sử dụng API 19 và nó không phải là back-tương thích. Viết mã của tôi trong AndroidStudio và thử nghiệm trong Genymotion.

Tôi đã cố gắng sử dụng NotificationCompatManager với kết quả của việc có nhiều thông báo: NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);

Tôi cũng đã cố gắng sử dụng NotificationManager với kết quả tương tự, đó là nhiều thông báo:

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

thông báo ngoại hình của tôi như thế này:

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

Và tôi cháy thông báo như thế này:

notificationManager.notify(counter, notification); 

đâu increments truy cập cho mỗi thông báo vì vậy mỗi thông báo có ID riêng của nó.

Tôi cũng đã cố gắng biểu mẫu này cho việc xây dựng và Fiering khi áp thông báo mà không succsess:

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 rõ ràng là không chú ý đối với tôi. Tôi không hiểu tại sao nó không hoạt động hoặc làm thế nào tôi phải làm cho nó hoạt động.

nhìn nhóm của tôi như thế này:

final static String mNoti = "mNoti"; 

Điều duy nhất mà đến từ xa gần với những gì tôi muốn là sử dụng cùng một ID cho tất cả các thông báo để thông báo mới sẽ ghi đè lên cái cũ, và sử dụng setNumber (int) trong khi xây dựng thông báo. Tuy nhiên điều này không thực sự cho tôi kết quả tôi muốn bởi vì tôi không nghĩ rằng tôi có thể nhận được số lượng thông báo không được xử lý bởi người dùng. Hay tôi có thể?

Có ai có thể giúp tôi đạt được mục tiêu mong muốn của mình không?

Trả lời

1

Lý do bạn nhận được kết quả như trong http://developer.android.com/images/android-5.0/notifications/Summarise_Dont.png là do bạn đặt tóm tắt nhóm thành true trên tất cả các thông báo của mình. Trong tài liệu API, nó được mô tả là: Set this notification to be the group summary for a group of notifications. Điều này có nghĩa là mọi thông báo sẽ được coi là bản tóm tắt và do đó sẽ được hiển thị dưới dạng thông báo mới.

Để giải quyết vấn đề của bạn, bạn có thể gửi bản tóm tắt mới mỗi khi bạn nhận được thông báo mới. Lưu ý rằng tôi không chắc chắn 100% rằng đây là giải pháp tốt nhất nhưng giải quyết được sự cố. Tôi tạo ra một ứng dụng thử nghiệm trong đó cho biết thêm các thông báo dựa trên nhấp chuột vào nút:

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. 
    } 
} 

Hoạt động đầu tiên MyActivity được sử dụng để xử lý các thông báo. Tôi đoán rằng điều này chủ yếu được thực hiện trong thu mặc dù. Một nút trong MyActivity kích hoạt addNotification để đẩy tóm tắt thông báo mới. Trước khi thêm tóm tắt, tất cả tóm tắt cũ sẽ bị hủy. khi nhấp vào tóm tắt bạn nhận được cho hoạt động khởi động, được gọi là ShowNotificationActivty nơi dữ liệu được hiển thị. Ví dụ: nếu đây là ứng dụng email, MyActivity sẽ là một loại bộ nhận email nào đó đã lưu email đó vào cơ sở dữ liệu. Thông báoId có thể được đặt thành một số id được lưu trong cơ sở dữ liệu. Khi thông báo được nhấp, email có thể được xem dựa trên notificationId.

Tôi hy vọng điều này sẽ giúp :)

+1

Tôi làm theo lời khuyên của bạn và sử dụng setGroupSummary và setGroup và nó đã làm việc, mặc dù chỉ có trên Android 5.0 trở lên. 4.4 và 4.2 hiển thị từng thông báo riêng biệt. Điều này vượt ra ngoài câu hỏi ban đầu ở đây, vì vậy tôi đã tạo một câu hỏi mới: http://stackoverflow.com/q/31483772/1204377 –

+0

@AntonCherkashyn Bạn có chắc chắn rằng bạn đã bao gồm dòng này: 'manager.cancelAll(); // Điều này có thực sự cần thiết không? Đây là "thủ thuật" để đóng các thông báo cũ chỉ thu tóm tắt mở. – Pphoenix

+0

Tôi đã thử và sau đó tôi chỉ nhìn thấy thông báo tóm tắt trên điện thoại, đúng, nhưng mục tiêu cuối cùng của tôi là có thông báo xếp chồng lên Android Wear và để làm điều đó, tôi phải kích hoạt N thông báo riêng lẻ + 1 thông báo tóm tắt cho mỗi nhà phát triển Android : https://developer.android.com/training/wearables/notifications/stacks.html. Gọi manager.cancelAll(); cũng loại bỏ các thông báo về mặc Android. Vì vậy, điều đó sẽ không hoạt động, vì những thông báo riêng lẻ đó có các hành động/trang tùy chỉnh/v.v. –

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