我搜索了许多与此主题相关的其他问题,但发现回答不令人满意,也没有一个对我有用。我想显示一个连续的通知,该通知只能由应用终止。但是我写的代码在几天前有效,但现在不行。
private void GenNotification(String title, String body)
{
try
{
Log.i(Config.TAGWorker, "Generating Notification . . .");
Intent myIntent = new Intent(this, MainActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(
this,
0,
myIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
Notification notification = new NotificationCompat.Builder(this)
.setContentTitle(title)
.setContentText(body)
.setChannelId("myID")
.setTicker("Notification!")
.setWhen(System.currentTimeMillis())
.setContentIntent(pendingIntent)
.setDefaults(Notification.DEFAULT_SOUND)
.setAutoCancel(false)
.setSmallIcon(R.drawable.floppy)
.setOngoing(true)
.build();
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Service.NOTIFICATION_SERVICE);
mNotificationManager.notify(1, notification);
}
catch (Exception e)
{
Log.e(Config.TAGWorker, e.getMessage());
}
}
Logcat中没有记录关于这些的例外。该代码在服务的onCreate中调用。该服务正确启动,我可以在Log cat中看到,也没有异常,但未显示通知。我的操作系统是适用于诺基亚(PI)的Android ONE]
您正在使用不建议使用的NotificationCompat.Builder
构造函数,该构造函数使用单个参数(上下文);并且从Android 8.0(API级别26)开始将无法使用。
所以,解决这个问题:
步骤1:使用Notification channel创建一个NotificationManager
NotificationManager mNotificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
// Notification channels are only available in OREO and higher.
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
NotificationChannel notificationChannel = new NotificationChannel
("PRIMARY_CHANNEL_ID",
"Service",
NotificationManager.IMPORTANCE_HIGH);
notificationChannel.enableLights(true);
notificationChannel.setLightColor(Color.RED);
notificationChannel.enableVibration(true);
notificationChannel.setDescription("Description");
mNotificationManager.createNotificationChannel(notificationChannel);
}
注意:根据需要更改参数值
步骤2::使用不建议使用的Notification.Builder
类及其两个参数的构造函数,该构造函数将第二个参数作为您在第一步中分配的通道ID,在此将其设置为“ PRIMARY_CHANNEL_ID”
Notification.Builder
您是否检查了您的字符串(标题和正文)是否为空,如果它为空,则不会显示通知如果您的android 7.0以上版本,还请检查您每次启动服务时是否调用通知通道当您想起相同的ID为1时,清除通知。