Come usare esattamente Notification.Builder


100

Ho scoperto di utilizzare un metodo obsoleto per le noficitations (notification.setLatestEventInfo ())

Dice di usare Notification.Builder.

  • Come lo uso?

Quando provo a creare una nuova istanza, mi dice:

Notification.Builder cannot be resolved to a type

Ho notato che questo funziona da API livello 11 (Android 3.0).
mobiledev Alex

Risposte:


86

Questo è nell'API 11, quindi se stai sviluppando qualcosa prima della 3.0 dovresti continuare a usare la vecchia API.

Aggiornamento : la classe NotificationCompat.Builder è stata aggiunta al pacchetto di supporto in modo che possiamo usarla per supportare il livello API v4 e versioni successive:

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


Grazie. Mi chiedo perché non lo menzioni nelle pagine delle funzioni stesse
Saariko

15
Sì: l'avviso di deprecazione è un po 'prematuro secondo me, ma cosa ne so.
Femi

152

Notification.Builder API 11 o NotificationCompat.Builder API 1

Questo è un esempio di utilizzo.

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);

13
Vedo che esiste una tecnica per farlo nel pacchetto di supporto v4: NotificationCompat.Builder
stanlick

6
Penso che qualcuno dovrebbe dire a Google che hanno gravi errori di battitura nella Notification.Builderpagina dei documenti. Stavo facendo quello che dicevano, ma non aveva alcun senso. Vengo qui e vedo che è diverso. Apprezzo molto la tua risposta in quanto mi ha reso consapevole dell'errore che è sul documento.
Andy

5
La documentazione dice che builder.getNotification()è deprecata. Dice che dovresti usare builder.build().
mneri

26
NotificationBuilder.build () richiede il livello API 16 o superiore. Qualunque cosa tra il livello API 11 e 15 dovresti usare NotificationBuilder.getNotification ().
Camille Sévigny

4
@MrTristan: come scritto nella documentazione setSmallIcon(), setContentTitle()e setContentText()sono i requisiti minimi.
caw

70

oltre alla risposta selezionata, ecco un po 'di codice di esempio per la NotificationCompat.Builderclasse da 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);  
}  

5
Primo codice che utilizza il nuovo generatore di Compat che ha effettivamente funzionato. Molto bene!
James MV

1
Ha funzionato bene anche per me. Due note: 1) dovrai creare un'icona 32x32 per "ic_launcher". Disegno bianco su sfondo trasparente 2) dovrai definire un numero casuale per int FM_NOTIFICATION_ID = [yourFavoriteRandom];
Anders8

1
grazie mille, il mio problema era: quando ho cliccato sulla notifica la seconda volta, il frammento precedente era aperto e questa riga "PendingIntent.FLAG_UPDATE_CURRENT" ha risolto il mio problema e mi ha fatto la giornata
Shruti

4

Notification Builder è strettamente per Android API di livello 11 e superiore (Android 3.0 e versioni successive).

Quindi, se non stai prendendo di mira i tablet Honeycomb, non dovresti utilizzare Notification Builder ma piuttosto seguire i metodi di creazione delle notifiche precedenti come il seguente esempio .


4
Puoi utilizzare la libreria di compatibilità, quindi puoi usarla su API 4 o versioni successive.
Leandros

3

AGGIORNAMENTO android-N (marzo 2016)

Visitare il collegamento Aggiornamenti notifiche per maggiori dettagli.

  • Risposta diretta
  • Notifiche in bundle
  • Visualizzazioni personalizzate

Android N ti consente anche di raggruppare notifiche simili in modo che appaiano come una singola notifica. Per renderlo possibile, Android N utilizza il NotificationCompat.Builder.setGroup()metodo esistente . Gli utenti possono espandere ciascuna delle notifiche ed eseguire azioni come rispondere e ignorare ciascuna delle notifiche, individualmente dall'area notifiche.

Questo è un esempio preesistente che mostra un semplice servizio che invia notifiche utilizzando NotificationCompat. Ogni conversazione non letta di un utente viene inviata come notifica distinta.

Questo esempio è stato aggiornato per sfruttare le nuove funzionalità di notifica disponibili in Android N.

codice di esempio .


ciao, puoi dirci come far funzionare questo metodo su Android 6.0 quando usiamo downloader_library. Uso Eclipse SDK - 25.1.7 || ADT 23.0.X purtroppo || Libreria di espansione APK di Google e libreria di licenze entrambe 1.0
mfaisalhyder

2

Avevo un problema con la creazione delle notifiche (sviluppo solo per Android 4.0+). Questo collegamento mi ha mostrato esattamente cosa stavo facendo di sbagliato e dice quanto segue:

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()

Fondamentalmente mi mancava uno di questi. Proprio come base per la risoluzione dei problemi con questo, assicurati di avere almeno tutti questi. Si spera che questo salverà qualcun altro dal mal di testa.


Quindi se pensi: "troverò un'icona più tardi", non riceverai nessuna notifica-amore. Grazie per questo;)
Nanne

1

Nel caso in cui aiuti qualcuno ... Ho avuto molti problemi con la configurazione delle notifiche utilizzando il pacchetto di supporto durante il test con API più recenti. Sono stato in grado di farli funzionare sul dispositivo più recente, ma ho ricevuto un errore di test sul vecchio dispositivo. Quello che alla fine ha funzionato per me è stato eliminare tutte le importazioni relative alle funzioni di notifica. In particolare NotificationCompat e TaskStackBuilder. Sembra che durante l'impostazione del codice all'inizio, le importazioni siano state aggiunte dalla build più recente e non dal pacchetto di supporto. Quindi, quando volevo implementare questi elementi in seguito in eclipse, non mi è stato chiesto di importarli di nuovo. Spero che abbia senso e che aiuti qualcun altro :)


1

Funziona anche in API 8 puoi usare questo codice:

 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);

Oppure suggerisco di seguire un ottimo tutorial su questo


1

ho usato

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());

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);


        }
    });
}

0

Esempio autonomo

Stessa tecnica di questa risposta ma:

  • autonomo: copia incolla e verrà compilato ed eseguito
  • con un pulsante per generare tutte le notifiche che desideri e giocare con intenti e ID di notifica

Fonte:

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);
    }
}

Testato su Android 22.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.