So verwenden Sie Notification.Builder genau

100

Ich habe festgestellt, dass ich eine veraltete Methode für Noficitations verwende (notification.setLatestEventInfo ()).

Es heißt, Notification.Builder zu verwenden.

  • Wie benutze ich es?

Wenn ich versuche, eine neue Instanz zu erstellen, wird Folgendes angezeigt:

Notification.Builder cannot be resolved to a type
Saariko
quelle
Mir ist aufgefallen, dass dies ab API Level 11 (Android 3.0) funktioniert.
Mobiledev Alex
Bitte überprüfen
Amit Vaghela

Antworten:

86

Dies ist in API 11 enthalten. Wenn Sie also für etwas früher als 3.0 entwickeln, sollten Sie weiterhin die alte API verwenden.

Update : Die NotificationCompat.Builder-Klasse wurde dem Support Package hinzugefügt, damit wir API Level 4 und höher unterstützen können:

http://developer.android.com/reference/android/support/v4/app/NotificationCompat.Builder.html

Femi
quelle
Vielen Dank. Ich frage mich, warum es das auf den Funktionsseiten selbst nicht erwähnt
Saariko
15
Ja, die Abwertungswarnung ist meiner Meinung nach etwas verfrüht, aber was weiß ich.
Femi
152

Notification.Builder API 11 oder NotificationCompat.Builder API 1

Dies ist ein Anwendungsbeispiel.

Intent notificationIntent = new Intent(ctx, YourClass.class);
PendingIntent contentIntent = PendingIntent.getActivity(ctx,
        YOUR_PI_REQ_CODE, notificationIntent,
        PendingIntent.FLAG_CANCEL_CURRENT);

NotificationManager nm = (NotificationManager) ctx
        .getSystemService(Context.NOTIFICATION_SERVICE);

Resources res = ctx.getResources();
Notification.Builder builder = new Notification.Builder(ctx);

builder.setContentIntent(contentIntent)
            .setSmallIcon(R.drawable.some_img)
            .setLargeIcon(BitmapFactory.decodeResource(res, R.drawable.some_big_img))
            .setTicker(res.getString(R.string.your_ticker))
            .setWhen(System.currentTimeMillis())
            .setAutoCancel(true)
            .setContentTitle(res.getString(R.string.your_notif_title))
            .setContentText(res.getString(R.string.your_notif_text));
Notification n = builder.build();

nm.notify(YOUR_NOTIF_ID, n);
Rabi
quelle
13
Ich sehe, dass es eine Technik gibt, um dies im v4-Support-Paket zu tun: NotificationCompat.Builder
Stanlick
6
Ich denke, jemand sollte Google mitteilen, dass er ernsthafte Tippfehler auf der Notification.BuilderDokumentenseite hat. Ich tat, was sie sagten, aber es ergab keinen Sinn. Ich komme hierher und sehe, dass es anders ist. Ich freue mich sehr über Ihre Antwort, da ich auf den Fehler im Dokument aufmerksam geworden bin.
Andy
5
Die Dokumentation sagt, builder.getNotification()ist veraltet. Es heißt, Sie sollten verwenden builder.build().
Mneri
26
NotificationBuilder.build () erfordert API Level 16 oder höher. Alles zwischen API Level 11 und 15 sollten Sie NotificationBuilder.getNotification () verwenden.
Camille Sévigny
4
@ MrTristan: Wie in der Dokumentation beschrieben setSmallIcon(), setContentTitle()und setContentText()sind die Mindestanforderungen.
Caw
70

Zusätzlich zu der ausgewählten Antwort finden Sie hier einen Beispielcode für die NotificationCompat.BuilderKlasse aus Source Tricks :

// Add app running notification  

    private void addNotification() {



    NotificationCompat.Builder builder =  
            new NotificationCompat.Builder(this)  
            .setSmallIcon(R.drawable.ic_launcher)  
            .setContentTitle("Notifications Example")  
            .setContentText("This is a test notification");  

    Intent notificationIntent = new Intent(this, MainActivity.class);  
    PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent,   
            PendingIntent.FLAG_UPDATE_CURRENT);  
    builder.setContentIntent(contentIntent);  

    // Add as notification  
    NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);  
    manager.notify(FM_NOTIFICATION_ID, builder.build());  
}  

// Remove notification  
private void removeNotification() {  
    NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);  
    manager.cancel(FM_NOTIFICATION_ID);  
}  
ANemati
quelle
5
Erster Code mit dem neuen Compat Builder, der tatsächlich funktioniert hat. Gut gemacht!
James MV
1
Hat auch bei mir gut funktioniert. Zwei Hinweise: 1) Sie müssen ein 32x32-Symbol für den "ic_launcher" erstellen. Weiße Zeichnung auf transparentem Hintergrund 2) Sie müssen eine Zufallszahl für int FM_NOTIFICATION_ID = [yourFavoriteRandom] definieren.
Anders8
1
Vielen Dank, mein Problem war: Als ich zum zweiten Mal auf Benachrichtigung klickte, war das vorherige Fragment geöffnet und diese Zeile "PendingIntent.FLAG_UPDATE_CURRENT" löste mein Problem und machte meinen Tag
Shruti
4

Notification Builder ist ausschließlich für Android API Level 11 und höher (Android 3.0 und höher) vorgesehen.

Wenn Sie nicht auf Honeycomb-Tablets abzielen, sollten Sie daher nicht den Notification Builder verwenden, sondern ältere Methoden zur Erstellung von Benachrichtigungen wie das folgende Beispiel befolgen .

Ye Myat Min
quelle
4
Sie können die Kompatibilitätsbibliothek verwenden, um sie auf API 4 oder höher zu verwenden.
Leandros
3

UPDATE android-N (März 2016)

Weitere Informationen finden Sie unter dem Link Benachrichtigungsaktualisierungen .

  • Direkte Antwort
  • Gebündelte Benachrichtigungen
  • Benutzerdefinierte Ansichten

Mit Android N können Sie auch ähnliche Benachrichtigungen bündeln, um sie als einzelne Benachrichtigung anzuzeigen. Um dies zu ermöglichen, verwendet Android N die vorhandene NotificationCompat.Builder.setGroup()Methode. Benutzer können jede Benachrichtigung erweitern und Aktionen wie Antworten und Ablehnen für jede Benachrichtigung einzeln im Benachrichtigungsschatten ausführen.

Dies ist ein bereits vorhandenes Beispiel, das einen einfachen Dienst zeigt, der Benachrichtigungen mit NotificationCompat sendet. Jede ungelesene Konversation eines Benutzers wird als eindeutige Benachrichtigung gesendet.

Dieses Beispiel wurde aktualisiert, um die neuen Benachrichtigungsfunktionen von Android N zu nutzen.

Beispielcode .

Amit Vaghela
quelle
Hallo, können Sie sagen, wie diese Methode unter Android 6.0 funktioniert, wenn wir downloader_library verwenden? Ich bin auf Eclipse SDK - 25.1.7 || ADT 23.0.X leider || Google APK Expansion Library und Licensing Library beide 1.0
mfaisalhyder
2

Ich hatte ein Problem beim Erstellen von Benachrichtigungen (nur für Android 4.0+ entwickelt). Dieser Link hat mir genau gezeigt, was ich falsch gemacht habe und sagt Folgendes:

Required notification contents

A Notification object must contain the following:

A small icon, set by setSmallIcon()
A title, set by setContentTitle()
Detail text, set by setContentText()

Grundsätzlich fehlte mir eines davon. Stellen Sie als Grundlage für die Fehlerbehebung sicher, dass Sie mindestens alle diese Funktionen haben. Hoffentlich erspart dies jemand anderem Kopfschmerzen.

Nlinscott
quelle
Wenn Sie also denken: "Ich werde später ein Symbol finden", erhalten Sie keine Benachrichtigungsliebe. Danke für diesen einen;)
Nanne
1

Für den Fall, dass es jemandem hilft ... Ich hatte große Probleme beim Einrichten von Benachrichtigungen mithilfe des Support-Pakets beim Testen gegen neuere ältere APIs. Ich konnte sie auf dem neueren Gerät zum Laufen bringen, bekam aber einen Fehlertest auf dem alten Gerät. Was mich schließlich zum Laufen brachte, war das Löschen aller Importe im Zusammenhang mit den Benachrichtigungsfunktionen. Insbesondere der NotificationCompat und der TaskStackBuilder. Es scheint, dass beim Einrichten meines Codes am Anfang die Importe vom neueren Build und nicht vom Support-Paket hinzugefügt wurden. Als ich diese Elemente später in Eclipse implementieren wollte, wurde ich nicht aufgefordert, sie erneut zu importieren. Hoffe das macht Sinn und hilft jemand anderem raus :)

snatr
quelle
1

Es funktioniert sogar in API 8, Sie können diesen Code verwenden:

 Notification n = 
   new Notification(R.drawable.yourownpicturehere, getString(R.string.noticeMe), 
System.currentTimeMillis());

PendingIntent i=PendingIntent.getActivity(this, 0,
             new Intent(this, NotifyActivity.class),
                               0);
n.setLatestEventInfo(getApplicationContext(), getString(R.string.title), getString(R.string.message), i);
n.number=++count;
n.flags |= Notification.FLAG_AUTO_CANCEL;
n.flags |= Notification.DEFAULT_SOUND;
n.flags |= Notification.DEFAULT_VIBRATE;
n.ledARGB = 0xff0000ff;
n.flags |= Notification.FLAG_SHOW_LIGHTS;

// Now invoke the Notification Service
String notifService = Context.NOTIFICATION_SERVICE;
NotificationManager mgr = 
   (NotificationManager) getSystemService(notifService);
mgr.notify(NOTIFICATION_ID, n);

Oder ich schlage vor, ein hervorragendes Tutorial dazu zu befolgen

Dondondon
quelle
1

Ich habe benutzt

Intent intent = new Intent(this, MainActivity.class);
        intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent,
                PendingIntent.FLAG_ONE_SHOT);

        Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
        NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setContentTitle("Firebase Push Notification")
                .setContentText(messageBody)
                .setAutoCancel(true)
                .setSound(defaultSoundUri)
                .setContentIntent(pendingIntent);

        NotificationManager notificationManager =
                (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(0, notificationBuilder.build());
Nilesh Panchal
quelle
0
          // This is a working Notification
       private static final int NotificID=01;
   b= (Button) findViewById(R.id.btn);
    b.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            Notification notification=new       Notification.Builder(MainActivity.this)
                    .setContentTitle("Notification Title")
                    .setContentText("Notification Description")
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .build();
            NotificationManager notificationManager=(NotificationManager)getSystemService(NOTIFICATION_SERVICE);
            notification.flags |=Notification.FLAG_AUTO_CANCEL;
            notificationManager.notify(NotificID,notification);


        }
    });
}
Manoj Perumarath
quelle
0

In sich geschlossenes Beispiel

Gleiche Technik wie in dieser Antwort, aber:

  • in sich geschlossen: Kopieren Einfügen und es wird kompiliert und ausgeführt
  • Mit einer Schaltfläche können Sie so viele Benachrichtigungen generieren, wie Sie möchten, und mit Absichts- und Benachrichtigungs-IDs spielen

Quelle:

import android.app.Activity;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class Main extends Activity {
    private int i;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        final Button button = new Button(this);
        button.setText("click me");
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                final Notification notification = new Notification.Builder(Main.this)
                        /* Make app open when you click on the notification. */
                        .setContentIntent(PendingIntent.getActivity(
                                Main.this,
                                Main.this.i,
                                new Intent(Main.this, Main.class),
                                PendingIntent.FLAG_CANCEL_CURRENT))
                        .setContentTitle("title")
                        .setAutoCancel(true)
                        .setContentText(String.format("id = %d", Main.this.i))
                        // Starting on Android 5, only the alpha channel of the image matters.
                        // https://stackoverflow.com/a/35278871/895245
                        // `android.R.drawable` resources all seem suitable.
                        .setSmallIcon(android.R.drawable.star_on)
                        // Color of the background on which the alpha image wil drawn white.
                        .setColor(Color.RED)
                        .build();
                final NotificationManager notificationManager =
                        (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
                notificationManager.notify(Main.this.i, notification);
                // If the same ID were used twice, the second notification would replace the first one. 
                //notificationManager.notify(0, notification);
                Main.this.i++;
            }
        });
        this.setContentView(button);
    }
}

Getestet in Android 22.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
quelle