Ich habe festgestellt, dass dies ein Problem darstellt, wenn die Heads-Up-Display-Benachrichtigung von Lollipop verwendet wird. Siehe Design-Richtlinien. Hier ist (ungefähr) der vollständige Code zur Implementierung.
Bislang war ein 'Abbrechen'-Button weniger wichtig, aber jetzt ist er präsenter.
Erstellen der Benachrichtigung
int notificationId = new Random().nextInt(); // einfach einen Zähler in einer Hilfsklasse verwenden...
PendingIntent dismissIntent = NotificationActivity.getDismissIntent(notificationId, context);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
builder.setPriority(NotificationCompat.PRIORITY_MAX) // HIGH, MAX, FULL_SCREEN und setDefaults(Notification.DEFAULT_ALL) machen es im Heads-Up-Display-Stil
.setDefaults(Notification.DEFAULT_ALL) // erfordert auch die VIBRATE-Berechtigung
.setSmallIcon(R.drawable.ic_action_refresh) // Erforderlich!
.setContentTitle("Nachricht von Test")
.setContentText("Nachricht")
.setAutoCancel(true)
.addAction(R.drawable.ic_action_cancel, "Abbrechen", dismissIntent)
.addAction(R.drawable.ic_action_boom, "Aktion!", someOtherPendingIntent);
// Holt eine Instanz des NotificationManager-Dienstes
NotificationManager notifyMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
// Baut die Benachrichtigung und gibt sie aus.
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(); // da finish() in onCreate() aufgerufen wird, wird onDestroy() sofort aufgerufen
}
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 SystemUI sich auf einen Back-Stack konzentriert)