我需要在收到 PUSH 通知时生成通知,但当应用程序中发生某些事情时,我还需要生成通知(以便在设备的通知栏中显示它们),所以我使用它NotificationCompat.Builder
。
如您所知,android 已弃用此对 Notification.Builder 的调用:
Notification.Builder (Context context)
现在您必须使用此调用:
NotificationCompat.Builder (Context context, String channelId)
如果您不想指定通知通道,并且想要向应用的所有用户发送常规通知,并且希望在不处理通知通道的情况下接收已安装的所有应用中的所有通知,会发生什么情况?或者,如果要在用户按下应用中的按钮时在通知栏中创建简单通知,会发生什么情况?如何在不指定channelId
的情况下显示通知?我的意思是。。。就像在 API 26 和通知通道出现之前一样工作。
在官方文档的任何地方不指定通知通道就看不到如何工作。
通知频道在 Android 8+ 上是强制性的。因此,您必须使用NotificationCompat.Builder(Context context, String channelId)
并通过NotificationManager.createNotificationChannel(NotificationChannel channel)
在 api 26+ 上创建通道。
在 api <26 上,只是不要调用 createNotificationChannel,而是让通道 id 参数(只是一个字符串)。
val builder = NotificationCompat.Builder(context, "a_channel_id")
builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setSmallIcon(R.drawable.ic_notif)
.setAutoCancel(true)
...
val notificationManager = NotificationManagerCompat.from(context)
notificationManager.notify(NOTIFICATION_ID, builder.build())
在 Api 26+ 上,在以下之前创建频道:
val channel = NotificationChannel("a_channel_id", "channel_name", NotificationManager.IMPORTANCE_HIGH)
channel.description = "channel_description"
channel.enableLights(true)
channel.lightColor = Color.RED
channel.enableVibration(true)
val notificationManager = NotificationManagerCompat.from(context)
notificationManager.createNotificationChannel(channel)
目前没有解决方法。通知通道最近已经宣布(如果我没记错的话,最后一个 I/O),并且(很可能如果不是绝对的话)将继续存在。我所做的是这样的。
为了遵守新标准,我只实施通知通道,但仅在需要时实施。我还在我的应用程序上使用 FCM,这与我所拥有的类似 - 这是我的应用程序类中:
private void initFirebase() {
... // other Firebase stuff.
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) initNotificationChannels();
}
@TargetApi(Build.VERSION_CODES.O)
private void initNotificationChannels() {
NotificationChannel publicChannel = new NotificationChannel(NOTIFICATION_CHANNEL_PUBLIC,
NOTIFICATION_CHANNEL_PUBLIC, NotificationManager.IMPORTANCE_DEFAULT);
publicChannel.setDescription(NOTIFICATION_CHANNEL_PUBLIC);
NotificationChannel privateChannel = new NotificationChannel(NOTIFICATION_CHANNEL_PRIVATE,
NOTIFICATION_CHANNEL_PRIVATE, NotificationManager.IMPORTANCE_HIGH);
publicChannel.setDescription(NOTIFICATION_CHANNEL_PRIVATE);
NotificationManager mNotificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
if (mNotificationManager != null) {
mNotificationManager.createNotificationChannel(publicChannel);
mNotificationManager.createNotificationChannel(privateChannel);
}
}
我的MessagingService
是这样的:
private static final String NOTIFICATION_CHANNEL_PRIVATE = "my.app.package.name.private";
private static final String NOTIFICATION_CHANNEL_PUBLIC = "my.app.package.name.public";
private void buildNotification(....(other params),String source, String message) {
String channelId = getChannelId(source);
Intent resultIntent = new Intent(this, MyActivity.class);
resultIntent.putExtra(EXTRAS_PARAM_ID, myVal);
PendingIntent notificationIntent = buildNotificationIntent(channelId, roomId, roomType);
NotificationCompat.Builder notificationBuilder =
new NotificationCompat.Builder(this, getChannelId(source))
.setSmallIcon(R.drawable.ic_sample
.setContentTitle(title)
.setContentText(message)
.setAutoCancel(true)
.setDefaults(Notification.DEFAULT_SOUND)
.setContentIntent(notificationIntent);
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(id, 0, notificationBuilder.build());
}
private String getChannelId(String source) {
switch(source){
case PRIVATE:
return NOTIFIFICATION_CHANNEL_PRIVATE;
default:
return NOTIFICATION_CHANNEL_PUBLIC;
}
}
我不知道这是否回答了这个问题。但是,拥有低于 api 26 的任何频道都可以工作,而无需在我的应用程序上执行任何操作。
1. instantiate notificationCompat with some channel Id
//which is irrelevant for api < 26
2. handle the case of creating notification channel for api 26+
3. bundled it up.
它只是奏效了。配置通知在 api 26 以下没有任何影响。