Как отменить групповое (связное) уведомление, когда в группе только одно уведомление? - PullRequest
0 голосов
/ 17 сентября 2018

Ниже приведен пример активности, содержит код для создания уведомлений и групповых уведомлений.Когда я нажимаю на последнее уведомление (когда оно остается). Групповое уведомление не исчезает при использовании последнего уведомления. строгий текст

открытый класс MainActivity расширяет возможности AppCompatActivity View.OnClickListener {

Button btnBundleNotification, btnSingleNotification;
NotificationManager notificationManager;
int bundleNotificationId = 100;
int singleNotificationId = 100;
NotificationCompat.Builder summaryNotificationBuilder;

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

    notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    btnBundleNotification = findViewById(R.id.btnBundleNotification);
    btnSingleNotification = findViewById(R.id.btnSingleNotification);
    btnBundleNotification.setOnClickListener(this);
    btnSingleNotification.setOnClickListener(this);
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.btnBundleNotification:


            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
                NotificationChannel groupChannel = new NotificationChannel("bundle_channel_id", "bundle_channel_name", NotificationManager.IMPORTANCE_LOW);
                notificationManager.createNotificationChannel(groupChannel);
            }
            bundleNotificationId += 100;
            singleNotificationId = bundleNotificationId;
            String bundle_notification_id = "bundle_notification_" + bundleNotificationId;
            Intent resultIntent = new Intent(this, MainActivity.class);
            resultIntent.putExtra("notification", "Summary Notification Clicked");
            resultIntent.putExtra("notification_id", bundleNotificationId);
            resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
            PendingIntent resultPendingIntent = PendingIntent.getActivity(this, bundleNotificationId, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);


            summaryNotificationBuilder = new NotificationCompat.Builder(this, "bundle_channel_id")
                    .setGroup(bundle_notification_id)
                    .setGroupSummary(true)
                    .setContentTitle("Bundled Notification. " + bundleNotificationId)
                    .setContentText("Content Text for bundle notification")
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setContentIntent(resultPendingIntent);

            notificationManager.notify(bundleNotificationId, summaryNotificationBuilder.build());

            break;

        case R.id.btnSingleNotification:


            bundle_notification_id = "bundle_notification_" + bundleNotificationId;

            resultIntent = new Intent(this, MainActivity.class);
            resultIntent.putExtra("notification", "Summary Notification Clicked");
            resultIntent.putExtra("notification_id", bundleNotificationId);
            resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
            resultPendingIntent = PendingIntent.getActivity(this, bundleNotificationId, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);

            //We need to update the bundle notification every time a new notification comes up.
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
                if (notificationManager.getNotificationChannels().size() < 2) {
                    NotificationChannel groupChannel = new NotificationChannel("bundle_channel_id", "bundle_channel_name", NotificationManager.IMPORTANCE_LOW);
                    notificationManager.createNotificationChannel(groupChannel);
                    NotificationChannel channel = new NotificationChannel("channel_id", "channel_name", NotificationManager.IMPORTANCE_DEFAULT);
                    notificationManager.createNotificationChannel(channel);
                }
            }
            summaryNotificationBuilder = new NotificationCompat.Builder(this, "bundle_channel_id")
                    .setGroup(bundle_notification_id)
                    .setGroupSummary(true)
                    .setContentTitle("Bundled Notification " + bundleNotificationId)
                    .setContentText("Content Text for group summary")
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setContentIntent(resultPendingIntent);


            if (singleNotificationId == bundleNotificationId)
                singleNotificationId = bundleNotificationId + 1;
            else
                singleNotificationId++;

            resultIntent = new Intent(this, MainActivity.class);
            resultIntent.putExtra("notification", "Single notification clicked");
            resultIntent.putExtra("notification_id", singleNotificationId);
            resultIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
            resultPendingIntent = PendingIntent.getActivity(this, singleNotificationId, resultIntent, PendingIntent.FLAG_UPDATE_CURRENT);


            NotificationCompat.Builder notification = new NotificationCompat.Builder(this, "channel_id")
                    .setGroup(bundle_notification_id)
                    .setContentTitle("New Notification " + singleNotificationId)
                    .setContentText("Content for the notification")
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setGroupSummary(false)
                    .setContentIntent(resultPendingIntent);

            notificationManager.notify(singleNotificationId, notification.build());
            notificationManager.notify(bundleNotificationId, summaryNotificationBuilder.build());
            break;

    }
}

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    Bundle extras = intent.getExtras();
    if (extras != null) {
        int notification_id = extras.getInt("notification_id");
        Toast.makeText(getApplicationContext(), "Notification with ID " + notification_id + " is cancelled", Toast.LENGTH_LONG).show();
        notificationManager.cancel(notification_id);
    }
}

}

Ответы [ 2 ]

0 голосов
/ 17 сентября 2018

Сводное уведомление не будет автоматически очищено при использовании последнего уведомления этой группы.Вы должны очистить сводное уведомление вручную самостоятельно.

Это означает, что вы должны отслеживать все уведомления, созданные вашими приложениями.

private int countForNotificationsInGroup = 0 ;

Увеличивать это значение каждый раз, когда вы создаете новое уведомление в соответствии с этим сводным уведомлением.

Затем уменьшить количество уведомлений при использовании каждого уведомления.Когда счетчик достигнет нуля, очистите числовое уведомление.

@Override
protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);

    Bundle extras = intent.getExtras();
    if (extras != null) {
        int notification_id = extras.getInt("notification_id");
        Toast.makeText(getApplicationContext(), "Notification with ID " + notification_id + " is cancelled", Toast.LENGTH_LONG).show();
        notificationManager.cancel(notification_id);

        countForNotificationsInGroup = countForNotificationsInGroup - 1;

        if(countForNotificationsInGroup==0)
        {
           //clear summary notification
           notificationManager.cancelAll();
        }
    }
}

Вы можете прочитать больше о правильной обработке связанных уведомлений Android здесь .

0 голосов
/ 17 сентября 2018

Что я понял, что вы хотите удалить все уведомления из системного трея.

Вы можете добавить следующее в свой метод onNewIntent ()

NotificationManager nMgr = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            nMgr.cancelAll();

Надеюсь, это работает для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...