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.
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?
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.
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>
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 .
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
};
}
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()
).
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
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());