NotificationCompat.Builder在Android O中已弃用

将我的项目升级到Android O后

buildToolsVersion "26.0.1" 

Android Studio中的Lint显示了以下通知生成器方法的弃用警告:

 new NotificationCompat.Builder(context) 

问题是: Android开发人员更新其描述NotificationChannel的文档,以支持Android O中的通知,并为我们提供了一个片段,但具有相同的不推荐使用的警告:

 Notification notification = new Notification.Builder(MainActivity.this) .setContentTitle("New Message") .setContentText("You've received new messages.") .setSmallIcon(R.drawable.ic_notify_status) .setChannelId(CHANNEL_ID) .build(); 

https://developer.android.com/preview/features/notification-channels.html

我的问题是:还有其他解决scheme用于构build通知,并且仍然支持Android O?

我find的解决scheme是将通道ID作为Notification.Builder构造函数中的parameter passing。 但是这个解决scheme并不是完全可重用的。

 new Notification.Builder(MainActivity.this, "channel_id") 

Solutions Collecting From Web of "NotificationCompat.Builder在Android O中已弃用"

在文档中提到,构build器方法NotificationCompat.Builder(Context context)已被弃用。 我们必须使用具有channelId参数的构造函数:

 NotificationCompat.Builder(Context context, String channelId) 

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

此构造函数在API级别26.0.0-beta1中已弃用。 改用NotificationCompat.Builder(Context,String)。 所有发布的通知都必须指定一个NotificationChannel ID。

https://developer.android.com/reference/android/app/Notification.Builder.html

此构造函数在API级别26中已弃用。请改用Notification.Builder(Context,String)。 所有发布的通知都必须指定一个NotificationChannel ID。

如果要重新使用构build器设置器,可以使用channelId创build构build器,并将该构build器传递给辅助方法,并在该方法中设置首选设置。

调用2-arg构造函数:为了与Android O兼容,请调用support-v4 NotificationCompat.Builder(Context context, String channelId) 。 在Android N或更低版本上运行时, channelId将被忽略。 在Android O上运行时,也会使用相同的channelId创build一个NotificationChannel

过时的示例代码:几个JavaDoc页面(如Notification.Builder调用new Notification.Builder(mContext)上的示例代码已过期。

不推荐使用的构造函数: Notification.Builder(Context context)v4 NotificationCompat.Builder(Context context)不赞成使用Notification[Compat].Builder(Context context, String channelId) 。 (请参阅Notification.Builder(android.content.Context)和第4版NotificationCompat.Builder(上下文上下文) 。

弃用的类:不推荐使用整个类v7 NotificationCompat.Builder 。 (请参阅v7 NotificationCompat.Builder 。)之前,需要v7 NotificationCompat.Builder来支持NotificationCompat.MediaStyle 。 在Android O中, media-compat库的android.support.v4.media包中有一个v4 NotificationCompat.MediaStyle 。 如果您需要MediaStyle请使用那个。

API 14+:在26.0.0及更高版本的支持库中,support-v4和support-v7软件包都支持最低API级别14.v#名称是历史性的。

请参阅最近的支持库修订版本 。

这是在接受的答案中提到的所有Android版本的工作代码。

  NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(getContext(), "M_CH_ID"); notificationBuilder.setAutoCancel(true) .setDefaults(Notification.DEFAULT_ALL) .setWhen(System.currentTimeMillis()) .setSmallIcon(R.drawable.ic_launcher) .setTicker("Hearty365") .setPriority(Notification.PRIORITY_MAX) // this is deprecated in API 26 but you can still use for below 26. check below update for 26 API .setContentTitle("Default notification") .setContentText("Lorem ipsum dolor sit amet, consectetur adipiscing elit.") .setContentInfo("Info"); NotificationManager notificationManager = (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(1, notificationBuilder.build()); 

更新API 26以设置最高优先级

  NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); String NOTIFICATION_CHANNEL_ID = "my_channel_id_01"; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { NotificationChannel notificationChannel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, "My Notifications", NotificationManager.IMPORTANCE_MAX); // Configure the notification channel. notificationChannel.setDescription("Channel description"); notificationChannel.enableLights(true); notificationChannel.setLightColor(Color.RED); notificationChannel.setVibrationPattern(new long[]{0, 1000, 500, 1000}); notificationChannel.enableVibration(true); notificationManager.createNotificationChannel(notificationChannel); } NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this, NOTIFICATION_CHANNEL_ID); notificationBuilder.setAutoCancel(true) .setDefaults(Notification.DEFAULT_ALL) .setWhen(System.currentTimeMillis()) .setSmallIcon(R.drawable.ic_launcher) .setTicker("Hearty365") // .setPriority(Notification.PRIORITY_MAX) .setContentTitle("Default notification") .setContentText("Lorem ipsum dolor sit amet, consectetur adipiscing elit.") .setContentInfo("Info"); notificationManager.notify(/*notification id*/1, notificationBuilder.build()); 

Build.VERSION.SDK_INT >= Build.VERSION_CODES.O有很多答案显示,不是检查Build.VERSION.SDK_INT >= Build.VERSION_CODES.O ,而是稍微简单一些,

将以下行添加到AndroidManifest.xml文件的application部分,如在Android文档中设置Firebase云消息传递客户端应用程序中所述 :

  <meta-data android:name="com.google.firebase.messaging.default_notification_channel_id" android:value="@string/default_notification_channel_id" /> 

然后将一个带有通道名称的行添加到values / strings.xml文件中:

 <string name="default_notification_channel_id">default</string> 

之后,您将能够使用具有2个参数的新版本的NotificationCompat.Builder构造函数(因为具有1参数的旧构造函数已在Android Oreo中弃用):

 private void sendNotification(String title, String body) { Intent i = new Intent(this, MainActivity.class); i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pi = PendingIntent.getActivity(this, 0 /* Request code */, i, PendingIntent.FLAG_ONE_SHOT); Uri sound = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder builder = new NotificationCompat.Builder(this, getString(R.string.default_notification_channel_id)) .setSmallIcon(R.mipmap.ic_launcher) .setContentTitle(title) .setContentText(body) .setAutoCancel(true) .setSound(sound) .setContentIntent(pi); NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); manager.notify(0, builder.build()); } 

这里是示例代码,这是在Android奥利奥和奥利奥以下工作。

  NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE); NotificationCompat.Builder builder = null; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) { int importance = NotificationManager.IMPORTANCE_DEFAULT; NotificationChannel notificationChannel = new NotificationChannel("ID", "Name", importance); notificationManager.createNotificationChannel(notificationChannel); builder = new NotificationCompat.Builder(getApplicationContext(), notificationChannel.getId()); } else { builder = new NotificationCompat.Builder(getApplicationContext()); } builder = builder .setSmallIcon(R.drawable.ic_notification_icon) .setColor(ContextCompat.getColor(context, R.color.color)) .setContentTitle(context.getString(R.string.getTitel)) .setTicker(context.getString(R.string.text)) .setContentText(message) .setDefaults(Notification.DEFAULT_ALL) .setAutoCancel(true); notificationManager.notify(requestCode, builder.build());