wake-up-neo.com

So schließen Sie eine Benachrichtigung, nachdem auf eine Aktion geklickt wurde

Seit API-Level 16 (Jelly Bean) besteht die Möglichkeit, einer Benachrichtigung mit Aktionen hinzuzufügen

builder.addAction(iconId, title, intent);

Wenn ich einer Benachrichtigung eine Aktion hinzufüge und auf die Aktion geklickt wird, wird die Benachrichtigung nicht verworfen. Wenn die Benachrichtigung selbst angeklickt wird, kann sie mit verworfen werden

notification.flags = Notification.FLAG_AUTO_CANCEL;

oder

builder.setAutoCancel(true);

Dies hat jedoch offensichtlich nichts mit den mit der Benachrichtigung verbundenen Aktionen zu tun.

Irgendwelche Hinweise? Oder ist das noch nicht Teil der API? Ich habe nichts gefunden.

129
endowzoner

Wenn Sie beim Benachrichtigungsmanager notify angerufen haben, haben Sie ihm eine ID gegeben - das ist die eindeutige ID, mit der Sie später darauf zugreifen können (dies ist vom Benachrichtigungsmanager:

notify(int id, Notification notification)

Um abzubrechen, würden Sie anrufen:

cancel(int id)

mit der gleichen id. Sie müssen also im Grunde die ID im Auge behalten oder sie möglicherweise in ein Bündel packen, das Sie dem Intent im PendingIntent hinzufügen?

140
Kaediil

Bei der Verwendung der Heads-Up-Display-Benachrichtigung von Lollipop wurde ein Problem festgestellt. Siehe Gestaltungsrichtlinien . Hier ist der vollständige (ish) Code, der implementiert werden soll.

Bisher war es weniger wichtig, einen "Ablehnen" -Knopf zu haben, aber jetzt ist es mehr in Ihrem Gesicht.

heads up notification

Erstellen der Benachrichtigung

int notificationId = new Random().nextInt(); // just use a counter in some util class...
PendingIntent dismissIntent = NotificationActivity.getDismissIntent(notificationId, context);

NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setPriority(NotificationCompat.PRIORITY_MAX) //HIGH, MAX, FULL_SCREEN and setDefaults(Notification.DEFAULT_ALL) will make it a Heads Up Display Style
        .setDefaults(Notification.DEFAULT_ALL) // also requires VIBRATE permission
        .setSmallIcon(R.drawable.ic_action_refresh) // Required!
        .setContentTitle("Message from test")
        .setContentText("message")
        .setAutoCancel(true)
        .addAction(R.drawable.ic_action_cancel, "Dismiss", dismissIntent)
        .addAction(R.drawable.ic_action_boom, "Action!", someOtherPendingIntent);

// Gets an instance of the NotificationManager service
NotificationManager notifyMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

// Builds the notification and issues it.
notifyMgr.notify(notificationId, builder.build());

NotificationActivity

public class NotificationActivity extends Activity {

    public static final String NOTIFICATION_ID = "NOTIFICATION_ID";

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
        manager.cancel(getIntent().getIntExtra(NOTIFICATION_ID, -1));
        finish(); // since finish() is called in onCreate(), onDestroy() will be called immediately
    }

    public static PendingIntent getDismissIntent(int notificationId, Context context) {
        Intent intent = new Intent(context, NotificationActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
        intent.putExtra(NOTIFICATION_ID, notificationId);
        PendingIntent dismissIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
        return dismissIntent;
    }

}

AndroidManifest.xml (Erforderliche Attribute, um zu verhindern, dass sich die SystemUI auf einen Backstack konzentriert.)

<activity
    Android:name=".NotificationActivity"
    Android:taskAffinity=""
    Android:excludeFromRecents="true">
</activity>
61
aaronvargas

Wenn Sie die Aktionsschaltflächen in erweiterten Benachrichtigungen verwenden, müssen Sie zusätzlichen Code schreiben und sind eingeschränkter.

Sie müssen Ihre Benachrichtigung manuell abbrechen, wenn der Benutzer auf eine Aktionsschaltfläche klickt. Die Benachrichtigung wird nur für die Standardaktion automatisch abgebrochen.

Auch wenn Sie einen Rundfunkempfänger über die Schaltfläche starten, wird die Benachrichtigungsschublade nicht geschlossen.

Am Ende habe ich eine neue NotificationActivity erstellt, um diese Probleme zu beheben. Diese Zwischenaktivität ohne Benutzeroberfläche bricht die Benachrichtigung ab und startet dann die Aktivität, die ich eigentlich von der Benachrichtigung aus starten wollte.

Ich habe Beispielcode in einem verwandten Beitrag gepostet Durch Klicken auf Android Benachrichtigungsaktionen wird die Benachrichtigungsleiste nicht geschlossen .

16
Vicki

Meiner Meinung nach ist die Verwendung von BroadcastReceiver eine sauberere Möglichkeit, eine Benachrichtigung abzubrechen:

In AndroidManifest.xml:

<receiver 
    Android:name=.NotificationCancelReceiver" >
    <intent-filter Android:priority="999" >
         <action Android:name="com.example.cancel" />
    </intent-filter>
</receiver>

In Java File:

Intent cancel = new Intent("com.example.cancel");
PendingIntent cancelP = PendingIntent.getBroadcast(context, 0, cancel, PendingIntent.FLAG_CANCEL_CURRENT);

NotificationCompat.Action actions[] = new NotificationCompat.Action[1];

NotificationCancelReceiver

public class NotificationCancelReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        //Cancel your ongoing Notification
    };
}
6

Sie können immer cancel() das Notification von dem aus, was von der Aktion aufgerufen wird (z. B. in onCreate() der Aktivität, die an das PendingIntent gebunden ist, das Sie an addAction()).

5
CommonsWare

Vergessen Sie in neuen APIs nicht TAG:

notify(String tag, int id, Notification notification)

und entsprechend

cancel(String tag, int id) 

anstatt:

cancel(int id)

https://developer.Android.com/reference/Android/app/NotificationManager

3
Malachiasz

Setzen Sie einfach diese Zeile:

 builder.setAutoCancel(true);

Und der vollständige Code lautet:

NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
    builder.setSmallIcon(Android.R.drawable.ic_dialog_alert);
    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.google.co.in/"));
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
    builder.setContentIntent(pendingIntent);
    builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.misti_ic));
    builder.setContentTitle("Notifications Title");
    builder.setContentText("Your notification content here.");
    builder.setSubText("Tap to view the website.");
    Toast.makeText(getApplicationContext(), "The notification has been created!!", Toast.LENGTH_LONG).show();

    NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    builder.setAutoCancel(true);
    // Will display the notification in the notification bar
    notificationManager.notify(1, builder.build());
0
Hanisha