Jak dokładnie używać Notification.Builder

100

Zauważyłem, że używam przestarzałej metody dla noficitations (notification.setLatestEventInfo ())

Mówi, aby użyć Notification.Builder.

  • Jak tego używam?

Kiedy próbuję utworzyć nową instancję, mówi mi:

Notification.Builder cannot be resolved to a type
Saariko
źródło
Zauważyłem, że działa to od poziomu API 11 (Android 3.0).
mobiledev Alex

Odpowiedzi:

86

To jest w API 11, więc jeśli tworzysz coś wcześniejszego niż 3.0, powinieneś nadal używać starego API.

Aktualizacja : klasa NotificationCompat.Builder została dodana do pakietu pomocy technicznej, dzięki czemu możemy użyć jej do obsługi poziomu API v4 i nowszych:

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

Femi
źródło
Dzięki. Zastanawiam się, dlaczego nie wspomina o tym na samych stronach funkcji
Saariko
15
Tak: ostrzeżenie o wycofaniu jest moim zdaniem nieco przedwczesne, ale co ja wiem.
Femi
152

Notification.Builder API 11 lub NotificationCompat.Builder API 1

To jest przykład użycia.

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
źródło
13
Widzę, że jest to technika to zrobić w pakiecie wsparcia v4: NotificationCompat.Builder
stanlick
6
Myślę, że ktoś powinien powiedzieć Google, że ma poważne literówki na Notification.Builderstronie z dokumentami. Robiłem to, co mówili, ale nie miało to żadnego sensu. Przychodzę tutaj i widzę, że jest inaczej. Naprawdę doceniam twoją odpowiedź, ponieważ to uczyniło mnie świadomym błędu, który jest na doktorze.
Andy,
5
Dokumentacja mówi, że builder.getNotification()jest przestarzała. Mówi, że powinieneś użyć builder.build().
mneri
26
NotificationBuilder.build () wymaga interfejsu API na poziomie 16 lub wyższym. Cokolwiek pomiędzy API Level 11 i 15, powinieneś użyć NotificationBuilder.getNotification ().
Camille Sévigny
4
@MrTristan: Jak napisano w dokumentacji setSmallIcon(), setContentTitle()i setContentText()są minimalne wymagania.
krakanie
70

oprócz wybranej odpowiedzi tutaj jest przykładowy kod dla NotificationCompat.Builderklasy z 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
źródło
5
Pierwszy kod wykorzystujący nowy konstruktor Compat, który faktycznie zadziałał. Dobra robota!
James MV
1
U mnie też działało dobrze. Dwie uwagi: 1) musisz utworzyć ikonę 32x32 dla „ic_launcher”. Biały rysunek na przezroczystym tle 2) musisz zdefiniować jakąś losową liczbę dla int FM_NOTIFICATION_ID = [yourFavoriteRandom];
Anders8
1
dziękuję bardzo, mój problem był następujący: kiedy kliknąłem powiadomienie po raz drugi, poprzedni fragment był otwarty, a ta linia „PendingIntent.FLAG_UPDATE_CURRENT” rozwiązała mój problem i sprawiła, że ​​mój dzień
Shruti
4

Narzędzie Notification Builder jest przeznaczone wyłącznie dla interfejsu API systemu Android na poziomie 11 lub nowszym (Android 3.0 i nowsze).

Dlatego jeśli nie kierujesz reklamy na tablety Honeycomb, nie powinieneś używać narzędzia Notification Builder, ale raczej postępować zgodnie ze starszymi metodami tworzenia powiadomień, takimi jak poniższy przykład .

Ye Myat Min
źródło
4
Możesz użyć biblioteki zgodności, więc możesz jej używać w API 4 lub nowszym.
Leandros,
3

UPDATE android-N (marzec-2016)

Aby uzyskać więcej informacji, odwiedź łącze Aktualizacje powiadomień .

  • Bezpośrednia odpowiedź
  • Dołączone powiadomienia
  • Widoki niestandardowe

Android N umożliwia także grupowanie podobnych powiadomień, aby pojawiały się jako pojedyncze powiadomienie. Aby było to możliwe, Android N korzysta z istniejącegoNotificationCompat.Builder.setGroup() metody. Użytkownicy mogą rozwijać każde z powiadomień i wykonywać czynności, takie jak odpowiadanie i odrzucanie każdego z powiadomień, indywidualnie z poziomu powiadomień.

To jest wcześniej istniejący przykład, który przedstawia prostą usługę, która wysyła powiadomienia przy użyciu NotificationCompat. Każda nieprzeczytana rozmowa użytkownika jest wysyłana jako osobne powiadomienie.

Ten przykład został zaktualizowany, aby wykorzystać nowe funkcje powiadomień dostępne w systemie Android N.

przykładowy kod .

Amit Vaghela
źródło
cześć, czy możesz powiedzieć, jak ta metoda działa w systemie Android 6.0, gdy korzystamy z biblioteki downloader_library. Jestem na Eclipse SDK - 25.1.7 || ADT 23.0.X niestety || Biblioteka rozszerzeń Google APK i biblioteka licencjonowania zarówno 1.0
mfaisalhyder
2

Miałem problem z tworzeniem powiadomień (tylko dla Androida 4.0+). Ten link pokazał mi dokładnie, co robię źle i mówi, co następuje:

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

Zasadniczo brakowało mi jednego z nich. Jako podstawę do rozwiązywania problemów z tym, upewnij się, że masz przynajmniej wszystkie z nich. Miejmy nadzieję, że to uratuje komuś ból głowy.

Nlinscott
źródło
Więc jeśli pomyślisz: „później znajdę ikonę”, nie otrzymasz żadnego powiadomienia-miłości. Dzięki za tę;)
Nanne
1

Na wypadek, gdyby to komuś pomogło ... Miałem duży problem z konfiguracją powiadomień za pomocą pakietu wsparcia podczas testowania na nowszych i starszych interfejsach API. Udało mi się zmusić je do pracy na nowszym urządzeniu, ale otrzymałem test błędu na starym urządzeniu. W końcu udało mi się usunąć wszystkie importy związane z funkcjami powiadomień. W szczególności NotificationCompat i TaskStackBuilder. Wygląda na to, że podczas konfigurowania mojego kodu na początku import został dodany z nowszej kompilacji, a nie z pakietu wsparcia. Potem, gdy chciałem później zaimplementować te elementy podczas zaćmienia, nie zostałem poproszony o ich ponowne importowanie. Mam nadzieję, że to ma sens i pomaga komuś innemu :)

snatr
źródło
1

Działa nawet w API 8, możesz użyć tego kodu:

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

Lub proponuję zapoznać się z doskonałym samouczkiem na ten temat

dondondon
źródło
1

używałem

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
źródło
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
źródło
0

Samodzielny przykład

Ta sama technika jak w tej odpowiedzi, ale:

  • samowystarczalny: skopiuj wklej, a zostanie skompilowany i uruchomiony
  • za pomocą przycisku, aby wygenerować tyle powiadomień, ile chcesz i grać z intencją i identyfikatorami powiadomień

Źródło:

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

Przetestowano w systemie Android 22.

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
źródło