it-swarm.com.de

Kann man prüfen, ob eine Benachrichtigung sichtbar ist oder abgebrochen wird?

Ich möchte die Benachrichtigungsdaten aktualisieren, aber die einzige Möglichkeit, die ich gefunden habe, ist, eine neue mit derselben ID zu starten.

Das Problem ist, dass ich keine neue erstellen möchte, wenn das Original storniert wurde. Gibt es eine Möglichkeit festzustellen, ob eine Benachrichtigung sichtbar oder storniert ist? Oder eine Möglichkeit, eine Benachrichtigung nur dann zu aktualisieren, wenn sie existiert?

31
Asaf Pinhassi

So habe ich es gelöst:

    private boolean isNotificationVisible() {
    Intent notificationIntent = new Intent(context, MainActivity.class);
    PendingIntent test = PendingIntent.getActivity(context, MY_ID, notificationIntent, PendingIntent.FLAG_NO_CREATE);
    return test != null;
}

So generiere ich die Benachrichtigung:

    /**
 * Issues a notification to inform the user that server has sent a message.
 */
private void generateNotification(String text) {

    int icon = R.drawable.notifiaction_icon;
    long when = System.currentTimeMillis();
    NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    Notification notification = new Notification(icon, text, when);
    String title = context.getString(R.string.app_name);
    Intent notificationIntent = new Intent(context, MainActivity.class);

    // set intent so it does not start a new activity
    //notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    PendingIntent intent = PendingIntent.getActivity(context, MY_ID, notificationIntent, 0);
    notification.setLatestEventInfo(context, title, text, intent);

    notification.flags |= Notification.FLAG_AUTO_CANCEL; //PendingIntent.FLAG_ONE_SHOT

    notificationManager.notify(MY_ID, notification);
}
32
Asaf Pinhassi

Wenn Sie API >= 23 verwenden, können Sie diese Methode verwenden, um eine aktive Benachrichtigung zu erhalten:

NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
StatusBarNotification[] notifications = mNotificationManager.getActiveNotifications();
for (StatusBarNotification notification : notifications) {
  if (notification.getId() == 100) {
    // Do something.
  }
}
16

Eine Alternative zu deleteIntent ist die folgende, die sich in meiner eigenen App als vorteilhaft erwiesen hat:

Grundsätzlich erstellen Sie mit Ihrer Benachrichtigung eine Absicht, mit der ein IntentService (oder ein anderer Dienst) gestartet wird. In onHandleIntent können Sie ein Flag setzen, das anzeigt, ob die Benachrichtigung aktiv ist.
Sie können festlegen, dass diese Absicht ausgelöst wird, wenn der Benutzer auf die Benachrichtigung tippt ( contentIntent ) und/oder wenn der Benutzer sie aus der Liste löscht ( deleteIntent ).

Um es zu veranschaulichen, mache ich dies in meiner eigenen App. Beim Aufbau der Benachrichtigung habe ich eingestellt

Intent intent = new Intent(this, CleanupIntentService.class);
Notification n = NotificationCompat.Builder(context).setContentIntent(
        PendingIntent.getActivity(this, 0, intent, 0)).build();

Wenn Sie auf die Benachrichtigung tippen, wird meine CleanupIntentService gestartet und ein Flag gesetzt (in dem Dienst, der die Benachrichtigung erstellt hat):

@Override
public int onStartCommand(Intent intent, int flags, int startId) {
    super.onCreate(); // If removed, onHandleIntent is not called
    return super.onStartCommand(intent, flags, startId);
}


@Override
protected void onHandleIntent(Intent intent) {
    OtherService.setNotificationFlag(false);
}
1
stemadsen

Ich denke, Sie können die deleteIntent der Notification-Klasse verwenden.

Ich erinnere mich daran, dass ich in einer meiner Anwendungen eine Sendung (benutzerdefinierte Sendung) abfeuere, wenn eine Benachrichtigung abgebrochen wird oder das Benachrichtigungsfeld gelöscht wurde.

1
Vishal Vyas

In meiner Situation wollte ich prüfen, ob eine Benachrichtigung bereits angezeigt wurde, bevor eine andere angezeigt wurde. Es stellt sich heraus, dass es eine einfache Möglichkeit gibt, dies zu tun, ohne darauf zu achten, wann die Benachrichtigung mit .setAutoCancel(true) am NotificationManagerCompat.Builder gelöscht oder verworfen wurde.

 private val NOTIF_ID = 80085
 private val CHANNEL_ID = "com.package.name.ClassName.WhatNotifycationDoes"  
 private lateinit var mNotificationManagerCompat: NotificationManagerCompat
 private lateinit var mNotificationManager: NotificationManager // this is for creating Notification Channel in newer APIs

override fun onCreate() {
    super.onCreate()

    mNotificationManagerCompat = NotificationManagerCompat.from(this)

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O)
       mNotificationManager = getSystemService(NotificationManager::class.Java)

    showNotification()
    startWatching()
}

private fun showNotification() {
        val contentIntent = Intent(this, MainActivity::class.Java)
                .apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK }
        val contentPendingIntent = PendingIntent.getActivity(this, 1, contentIntent, 0)

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val name = getString(R.string.app_name)
        val importance = NotificationManager.IMPORTANCE_HIGH
        val channel = NotificationChannel(CHANNEL_ID, name, importance)
        channel.description = getString(R.string.your_custom_description)
        mNotificationManager.createNotificationChannel(channel)
    }

    val mNewStatusNotificationBuilder = NotificationCompat.from(this)
    mNewStatusNotificationBuilder = NotificationCompat.Builder(this, CHANNEL_ID)
            .setContentTitle(getString(R.string.app_name))
            .setContentText(getString(R.string.simple_text))
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
            .setContentIntent(contentPendingIntent)
            .setAutoCancel(true) // This dismisses the Notification when it is clicked
            .setOnlyAlertOnce(true) //this is very important, it pops up the notification only once. Subsequent notify updates are muted. unless it is loaded again    

    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.Lollipop)
        mNewStatusNotificationBuilder.setSmallIcon(R.drawable.ic_notification)

    notification = mNewStatusNotificationBuilder.build()

    mNotificationManagerCompat.notify(NOTIF_ID, notification)
}
0
Micklo_Nerd