Як саме використовувати Notification.Builder


100

Я виявив, що я використовую застарілий метод для noficitations (notification.setLatestEventInfo ())

Він говорить про використання Notification.Builder.

  • Як я ним користуюся?

Коли я намагаюся створити новий екземпляр, він говорить мені:

Notification.Builder cannot be resolved to a type

Я помітив, що це працює від API рівня 11 (Android 3.0).
mobiledev Олексій

Відповіді:


86

Це в API 11, тому якщо ви розробляєте що-небудь раніше, ніж 3.0, вам слід продовжувати використовувати старий API.

Оновлення : до пакету підтримки додано клас NotificationCompat.Builder, щоб ми могли використовувати це для підтримки рівня v4 та вище API:

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


Дякую. Цікаво, чому це не згадується на самих функціональних сторінках
Саарико,

15
Так: попередження про депресію на мою думку трохи передчасне, але що я знаю.
Фемі

152

API Notification.Builder 11 або API NotificationCompat.Builder 1

Це приклад використання.

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
Я бачу, що існує техніка цього в пакеті підтримки v4: NotificationCompat.Builder
stanlick

6
Я думаю, що хтось повинен сказати Google, що вони мають серйозні помилки на Notification.Builderсторінці документів. Я робив те, що вони говорили, але це не мало сенсу. Я приходжу сюди і бачу, як це інакше. Я дуже ціную вашу відповідь, оскільки вона дала мені зрозуміти про помилку, яка є в документі.
Енді

5
Документація говорить builder.getNotification(), що застаріла. Там написано, що слід використовувати builder.build().
mneri

26
NotificationBuilder.build () вимагає API рівня 16 або вище. Що-небудь між рівнем API 11 та 15, ви повинні використовувати NotificationBuilder.getNotification ().
Camille Sévigny

4
@MrTristan: Як написано в документації setSmallIcon(), setContentTitle()і setContentText()це мінімальні вимоги.
каре

70

на додаток до обраної відповіді тут є декілька зразкових кодів для NotificationCompat.Builderкласу з 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
Перший код за допомогою нового конструктора Compat, який фактично працював. Молодці!
Джеймс М. В.

1
Добре працювали і для мене. Дві примітки: 1) вам потрібно зробити значок 32x32 для "ic_launcher". Білий малюнок на прозорому фоні 2) вам потрібно буде визначити деяке випадкове число для int FM_NOTIFICATION_ID = [yourFavoriteRandom];
Anders8

1
велике спасибі, моя проблема полягала в тому, що коли я другий раз натиснув на сповіщення, попередній фрагмент був відкритий, і цей рядок "PendingIntent.FLAG_UPDATE_CURRENT" вирішив мою проблему і зробив мій день
Shruti

4

Інструмент сповіщень призначений для Android API рівня 11 і вище (Android 3.0 і новіших версій).

Отже, якщо ви не орієнтовані на планшети Honeycomb, ви не повинні використовувати Builder Notification Builder, а скоріше слідувати старішим методам створення повідомлень, як у наведеному нижче прикладі .


4
Ви можете використовувати Бібліотеку порівнянності, тому ви можете використовувати її в API 4 або вище.
Леандрос

3

ОНОВЛЕННЯ android-N (березень 2016)

Будь ласка, відвідайте посилання " Оновлення сповіщень " для отримання більш детальної інформації.

  • Пряма відповідь
  • Комплектні сповіщення
  • Спеціальні перегляди

Android N також дозволяє згрупувати подібні сповіщення, які відображатимуться як одне повідомлення. Щоб зробити це можливим, Android N використовує існуючий NotificationCompat.Builder.setGroup()метод. Користувачі можуть розширювати кожне сповіщення та виконувати такі дії, як відповідь та відхилення над кожним із повідомлень, окремо з відтінку сповіщень.

Це вже існуючий зразок, який показує просту послугу, яка надсилає сповіщення за допомогою NotificationCompat. Кожна непрочитана розмова від користувача надсилається як окреме повідомлення.

Цей зразок оновлено, щоб скористатися новими функціями сповіщення, доступними в Android N.

зразок коду .


привіт, ви можете сказати, як цей метод працює на Android 6.0, коли ми використовуємо downloader_library. Я на SDK Eclipse - 25.1.7 || ADT 23.0.X сумно || Бібліотека розширення та бібліотека ліцензування Google APK
mfaisalhyder

2

У мене виникли проблеми зі створенням сповіщень (розробляються лише для Android 4.0+). Це посилання показало мені, що я роблю неправильно, і говорить наступне:

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

В основному я бракував одного з таких. Тільки як основа для усунення несправностей з цим, переконайтеся, що у вас є все щонайменше. Сподіваємось, це вбереже когось іншого головний біль.


Тож якщо ви думаєте: "Пізніше я знайду піктограму", ви не отримаєте сповіщення про кохання. Дякую за це;)
Нанна

1

У випадку, якщо це допомагає комусь ... У мене виникли багато проблем із налаштуванням сповіщень за допомогою пакета підтримки при тестуванні на новіші старі API. Мені вдалося змусити їх працювати над новішим пристроєм, але я отримав тестування помилок на старому пристрої. Нарешті, для мене це працювало - видалити весь імпорт, пов'язаний з функціями сповіщення. Зокрема, NotificationCompat та TaskStackBuilder. Здається, що під час налаштування мого коду на початку імпорт, який додається з нової збірки, а не з пакету підтримки. Потім, коли я хотів реалізувати ці елементи пізніше у затемненні, мені не запропонували знову імпортувати їх. Сподіваюся, що це має сенс, і що це допомагає комусь іншому :)


1

Він працює навіть в API 8. Ви можете використовувати цей код:

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

Або я пропоную дотримуватися відмінного підручника з цього приводу


1

Я звик

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

Самостійний приклад

Той самий прийом, що і у цій відповіді, але:

  • автономно: скопіюйте пасту, і вона буде компілюватися та запускатися
  • за допомогою кнопки можна створити стільки сповіщень, скільки вам подобається, і грати з намірами та ідентифікаторами сповіщень

Джерело:

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

Тестовано на Android 22.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.