Как создать уведомление с NotificationCompat.Builder?
Мне нужно создать простое уведомление, которое будет отображаться в панели уведомлений вместе со звуком и значком, если это возможно? Мне также нужно, чтобы он был совместимым с Android 2.2, поэтому я обнаружил, что NotificationCompat.Builder работает со всеми API выше 4. Если есть лучшее решение, не стесняйтесь упомянуть об этом.
9 ответов
NotificationCompat.Builder - самый простой способ создания Notifications
на всех версиях Android. Вы даже можете использовать функции, доступные в Android 4.1. Если ваше приложение работает на устройствах с Android >=4.1, будут использоваться новые функции, если оно работает на Android <4.1, уведомление будет простым старым уведомлением.
Чтобы создать простое Уведомление, просто сделайте (см. Руководство по API Android по Уведомлениям):
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.notification_icon)
.setContentTitle("My notification")
.setContentText("Hello World!")
.setContentIntent(pendingIntent); //Required on Gingerbread and below
Вы должны установить по крайней мере smallIcon
, contentTitle
а также contentText
, Если вы пропустите один, уведомление не будет отображаться.
Осторожно: на Gingerbread и ниже вы должны установить намерение содержимого, в противном случае IllegalArgumentException
будет брошен.
Чтобы создать намерение, которое ничего не делает, используйте:
final Intent emptyIntent = new Intent();
PendingIntent pendingIntent = PendingIntent.getActivity(ctx, NOT_USED, emptyIntent, PendingIntent.FLAG_UPDATE_CURRENT);
Вы можете добавить звук через конструктор, то есть звук из RingtoneManager:
mBuilder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
Уведомление добавляется в панель через NotificationManager:
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(mId, mBuilder.build());
Рабочий пример:
Intent intent = new Intent(ctx, HomeActivity.class);
PendingIntent contentIntent = PendingIntent.getActivity(ctx, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder b = new NotificationCompat.Builder(ctx);
b.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_ALL)
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.ic_launcher)
.setTicker("Hearty365")
.setContentTitle("Default notification")
.setContentText("Lorem ipsum dolor sit amet, consectetur adipiscing elit.")
.setDefaults(Notification.DEFAULT_LIGHTS| Notification.DEFAULT_SOUND)
.setContentIntent(contentIntent)
.setContentInfo("Info");
NotificationManager notificationManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(1, b.build());
Показать Notificaton в Android 8.0
@TargetApi(Build.VERSION_CODES.O)
@RequiresApi(api = Build.VERSION_CODES.JELLY_BEAN)
public void show_Notification(){
Intent intent=new Intent(getApplicationContext(),MainActivity.class);
String CHANNEL_ID="MYCHANNEL";
NotificationChannel notificationChannel=new NotificationChannel(CHANNEL_ID,"name",NotificationManager.IMPORTANCE_LOW);
PendingIntent pendingIntent=PendingIntent.getActivity(getApplicationContext(),1,intent,0);
Notification notification=new Notification.Builder(getApplicationContext(),CHANNEL_ID)
.setContentText("Heading")
.setContentTitle("subheading")
.setContentIntent(pendingIntent)
.addAction(android.R.drawable.sym_action_chat,"Title",pendingIntent)
.setChannelId(CHANNEL_ID)
.setSmallIcon(android.R.drawable.sym_action_chat)
.build();
NotificationManager notificationManager=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.createNotificationChannel(notificationChannel);
notificationManager.notify(1,notification);
}
Я делаю этот метод и работаю нормально. (проверено в Android 6.0.1)
public void notifyThis(String title, String message) {
NotificationCompat.Builder b = new NotificationCompat.Builder(this.context);
b.setAutoCancel(true)
.setDefaults(NotificationCompat.DEFAULT_ALL)
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.drawable.favicon32)
.setTicker("{your tiny message}")
.setContentTitle(title)
.setContentText(message)
.setContentInfo("INFO");
NotificationManager nm = (NotificationManager) this.context.getSystemService(Context.NOTIFICATION_SERVICE);
nm.notify(1, b.build());
}
Уведомление в глубине
КОД
Intent intent = new Intent(this, SecondActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this,0,intent,0);
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(context)
.setSmallIcon(R.drawable.your_notification_icon)
.setContentTitle("Notification Title")
.setContentText("Notification ")
.setContentIntent(pendingIntent );
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, mBuilder.build());
Глубина знаний
Уведомление может быть построено с использованием Уведомления. Классы Builder или NotificationCompat.Builder.
Но если вам нужна обратная совместимость, вы должны использовать класс NotificationCompat.Builder, поскольку он является частью библиотеки поддержки v4, поскольку он заботится о тяжелой работе для обеспечения согласованного вида и функциональных возможностей Notification for API 4 и выше.
Основные свойства уведомлений
Уведомление имеет 4 основных свойства (3 основных свойства отображения + свойство действия 1 щелчка)
- Маленькая иконка
- заглавие
- Текст
- Событие нажатия кнопки (Событие нажатия при нажатии на уведомление)
Событие нажатия кнопки становится необязательным на Android 3.0 и выше. Это означает, что вы можете создать свое уведомление, используя только свойства экрана, если ваш minSdk ориентирован на Android 3.0 или выше. Но если вы хотите, чтобы ваше уведомление запускалось на более старых устройствах, чем Android 3.0, вы должны предоставить событие Click, в противном случае вы увидите IllegalArgumentException.
Дисплей уведомлений
Уведомления отображаются путем вызова метода notify() класса NotificationManger
параметры notify()
Существует два варианта метода уведомления
notify(String tag, int id, Notification notification)
или же
notify(int id, Notification notification)
Метод notify принимает целочисленный идентификатор для уникальной идентификации вашего уведомления. Тем не менее, вы также можете предоставить дополнительный тег String для дальнейшей идентификации вашего уведомления в случае конфликта.
Этот тип конфликта встречается редко, но, скажем, вы создали библиотеку, и другие разработчики используют вашу библиотеку. Теперь они создают свое собственное уведомление, и каким-то образом ваше уведомление и идентификатор уведомления другого разработчика совпадают, тогда вы столкнетесь с конфликтом.
Уведомление после API 11 (больше контроля)
API 11 обеспечивает дополнительный контроль над поведением уведомлений
Уведомление Увольнение
По умолчанию, если пользователь нажимает на уведомление, он выполняет назначенное событие щелчка, но не удаляет уведомление. Если вы хотите, чтобы ваше уведомление было очищено, тогда вы должны добавить этоmBuilder.setAutoClear(истина);
Запретить пользователю отклонять уведомления
Пользователь также может отклонить уведомление, проводя его. Вы можете отключить это поведение по умолчанию, добавив его при создании уведомленияmBuilder.setOngoing(истина);
Размещение уведомления
Вы можете установить относительный приоритет вашего уведомленияmBuilder.setOngoing(int pri);
Если ваше приложение работает с более низким API, чем 11, тогда ваше уведомление будет работать без вышеупомянутых дополнительных функций. Это преимущество выбора NotificationCompat.Builder перед Notification. Builder.
Уведомление после API 16 (более информативно)
С введением API 16 уведомления получили множество новых функций.
Уведомление может быть намного более информативным.
Вы можете добавить большую картинку к вашему логотипу. Предположим, вы получили сообщение от человека с помощью mBuilder.setLargeIcon(растровое изображение), в котором вы можете показать фотографию этого человека. Таким образом, в строке состояния вы увидите значок, при прокрутке вы увидите фотографию человека вместо значка. Есть и другие функции
- Добавить счетчик в уведомлении
- Сообщение тикера, когда вы видите уведомление в первый раз
- Расширяемое уведомление
- Многострочное уведомление и т. Д.
Простой способ сделать уведомления
NotificationCompat.Builder builder = (NotificationCompat.Builder) new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.ic_launcher) //icon
.setContentTitle("Test") //tittle
.setAutoCancel(true)//swipe for delete
.setContentText("Hello Hello"); //content
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(1, builder.build()
);
Класс приложения здесь Код ниже
public class App extends Application {
public static final String CHANNEL_1="CHANNEL1";
@Override
public void onCreate() {
super.onCreate();
createNotificationChannel();
}
private void createNotificationChannel() {
NotificationChannel channel=new NotificationChannel(CHANNEL_1,"Channel 1", NotificationManager.IMPORTANCE_HIGH);
channel.setDescription("This is Channel 1");
NotificationManager notificationManager=getSystemService(NotificationManager.class);
notificationManager.createNotificationChannel(channel);
}
}
Создайте уведомление о показе активности под кодом
NotificationManagerCompat notificationManagerCompat;
notificationManagerCompat = NotificationManagerCompat.from(this);
binding.btnNotification.setOnClickListener(v -> {
Notification notification = new NotificationCompat.Builder(MainActivity.this, CHANNEL_1)
.setSmallIcon(R.drawable.ic_black_24)
.setContentTitle(getResources().getString(R.string.app_name))
.setContentText("Message")
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setCategory(NotificationCompat.CATEGORY_MESSAGE)
.build();
notificationManagerCompat.notify(1, notification);
});
Вы можете попробовать этот код, он прекрасно работает для меня:
NotificationCompat.Builder mBuilder= new NotificationCompat.Builder(this);
Intent i = new Intent(noti.this, Xyz_activtiy.class);
PendingIntent pendingIntent= PendingIntent.getActivity(this,0,i,0);
mBuilder.setAutoCancel(true);
mBuilder.setDefaults(NotificationCompat.DEFAULT_ALL);
mBuilder.setWhen(20000);
mBuilder.setTicker("Ticker");
mBuilder.setContentInfo("Info");
mBuilder.setContentIntent(pendingIntent);
mBuilder.setSmallIcon(R.drawable.home);
mBuilder.setContentTitle("New notification title");
mBuilder.setContentText("Notification text");
mBuilder.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION));
NotificationManager notificationManager= (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(2,mBuilder.build());
Используйте этот код
Intent intent = new Intent(getApplicationContext(), SomeActvity.class);
PendingIntent pIntent = PendingIntent.getActivity(getApplicationContext(),
(int) System.currentTimeMillis(), intent, 0);
NotificationCompat.Builder mBuilder =
new NotificationCompat.Builder(getApplicationContext())
.setSmallIcon(R.drawable.your_notification_icon)
.setContentTitle("Notification title")
.setContentText("Notification message!")
.setContentIntent(pIntent);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(0, mBuilder.build());