Как именно использовать Notification.Builder


100

Я обнаружил, что использую устаревший метод для уведомлений (notification.setLatestEventInfo ())

Он говорит использовать Notification.Builder.

  • Как мне его использовать?

Когда я пытаюсь создать новый экземпляр, он сообщает мне:

Notification.Builder cannot be resolved to a type

Я заметил, что это работает с API уровня 11 (Android 3.0).
mobiledev Alex

Ответы:


86

это есть в API 11, поэтому, если вы разрабатываете что-либо ранее, чем 3.0, вам следует продолжать использовать старый API.

Обновить : класс NotificationCompat.Builder был добавлен в пакет поддержки, поэтому мы можем использовать его для поддержки уровня API v4 и выше:

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


Спасибо. Интересно, почему это не упоминается на самих страницах функций
Саарико

15
Да: предупреждение об устаревании, на мой взгляд, немного преждевременно, но что я знаю.
Femi

152

Notification.Builder API 11 или NotificationCompat.Builder API 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()являются минимальными требованиями.
caw

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, который действительно работал. Отлично сработано!
James MV

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

1
Большое спасибо, Моя проблема заключалась в следующем: когда я щелкнул по уведомлению второй раз, предыдущий фрагмент был открыт, и эта строка «PendingIntent.FLAG_UPDATE_CURRENT» решила мою проблему и сделала мой день
Shruti

4

Конструктор уведомлений предназначен только для Android API уровня 11 и выше (Android 3.0 и выше).

Следовательно, если вы не нацеливаетесь на планшеты Honeycomb, вам не следует использовать конструктор уведомлений, а следует следовать более старым методам создания уведомлений, таким как следующий пример .


4
Вы можете использовать библиотеку совместимости, поэтому вы можете использовать ее с API 4 или выше.
Леандрос

3

ОБНОВЛЕНИЕ android-N (март-2016)

Пожалуйста, посетите ссылку Уведомления об обновлениях для получения более подробной информации.

  • Прямой ответ
  • Связанные уведомления
  • Пользовательские просмотры

Android N также позволяет объединять похожие уведомления, чтобы они отображались как одно уведомление. Чтобы это стало возможным, Android N использует существующиеNotificationCompat.Builder.setGroup() метод. Пользователи могут развернуть каждое из уведомлений и выполнять такие действия, как отвечать и отклонять каждое из уведомлений, индивидуально из тени уведомлений.

Это уже существующий образец, который показывает простую службу, которая отправляет уведомления с помощью NotificationCompat. Каждая непрочитанная беседа пользователя отправляется как отдельное уведомление.

Этот образец был обновлен, чтобы использовать новые функции уведомлений, доступные в Android N.

образец кода .


привет, вы можете сказать, как заставить этот метод работать в Android 6.0, когда мы используем downloader_library. Я использую Eclipse SDK - 25.1.7 || ADT 23.0.X грустно || Библиотека расширений Google APK и библиотека лицензирования 1.0
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()

В основном мне не хватало одного из них. В качестве основы для устранения неполадок убедитесь, что у вас есть как минимум все это. Надеюсь, это избавит кого-то от головной боли.


Так что, если вы думаете: «Я найду иконку позже», вы не получите notify-love. Спасибо за это;)
Nanne

2

Он работает даже в 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);

Или я предлагаю следовать отличному руководству по этому поводу


2

я использовал

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

1

На случай, если это кому-то поможет ... У меня были большие проблемы с настройкой уведомлений с помощью пакета поддержки при тестировании с более новыми и старыми API. Мне удалось заставить их работать на новом устройстве, но на старом устройстве я получал сообщение об ошибке. Что, наконец, заставило меня работать, так это удалить весь импорт, связанный с функциями уведомлений. В частности, NotificationCompat и TaskStackBuilder. Похоже, что при настройке моего кода вначале импорт был добавлен из новой сборки, а не из пакета поддержки. Затем, когда я захотел реализовать эти элементы позже в eclipse, мне не было предложено импортировать их снова. Надеюсь, что это имеет смысл и поможет кому-то другому :)


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.