通知构建器(Notification.Builder)在Android O中已经过时。

29

最近随着 Android O 中的通知渠道(Notification Channels)的推出,Notification.Builder(context) 已经被弃用。

问题:

我曾尝试使用 Notification.Builder(context, StringID) 代替 Notification.Builder(context),并成功收到了来自 Android O 设备的通知。
然而,当我在 Android 23(M)上尝试时,却没有收到通知。我对代码进行了调试,发现一旦 debugger 到达 Notification.Builder(context, StringID) 这一行就停止执行了。

修复方法:

为解决这个问题,我使用了 if/else 条件语句来区分 Android O 设备和其他设备。

以下是我的代码片段:

Notification.Builder notificationBuilder;

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    notificationBuilder = new Notification.Builder(mContext,
            mContext.getResources().getString(R.string.notification_id_channel));
} else {
    notificationBuilder = new Notification.Builder(mContext);
}

在Android Studio中,Lint显示以下弃用行:

enter image description here

问题:

是否有办法去掉那个弃用警告行?


2
应该有一个快速修复(在弃用的光标中使用Alt-Enter)来添加一个注释到方法,以抑制弃用警告。或者,切换到NotificationCompat.Builder,特别是当支持库v26版退出beta版时。 - CommonsWare
2
只需切换到NotificationCompat - tyczj
2
不,NotificationCompat.Builder(Context context)也已经随着API级别O被弃用了。https://developer.android.com/reference/android/app/Notification.Builder.html - Red M
2
是的,它被替换为NotificationCompat(Context context, String channelId)。你有看过你发布的链接吗? - tyczj
2
我非常确定它可以工作,因为我使用它并且它能够正常运行,所以你为什么不先尝试一下,而不是说它不会工作呢?NotificationCompat是专门用于处理不同操作系统版本的。 - tyczj
显示剩余9条评论
3个回答

45

您的解决方案是使用 NotificationCompat.Builder(Context context, String channelId)。如果您使用它,就不必检查 API 级别,该 Builder 会忽略 Oreo 以下设备上的通道 ID。

我已在 API 版本 15、22、23 和 26 上进行了测试,结果完美无误。


这应该是正确的答案。 - Gatschet
6
channel ID应该是什么值?” - Narendra Singh
3
频道 ID 是由您为 Oreo 中创建的每个通知频道定义的唯一静态字符串。我只需将相应的频道 ID 传递给构建器,就好像我正在为 Oreo 构建通知一样。如果通知没有发布在 Oreo 上(并且对应的频道不存在),构建器不会在乎您给它哪个频道 ID,它会忽略它,因此这适用于所有 API 级别。 - Wess
1
你还需要注意支持 NotificationCompat 的版本。将 support.v7.app.NotificationCompat 替换为 support.v4.app.NotificationCompat,并在传递 channeId 参数后,您将不再看到已弃用的检查。 - codepeaker
虽然您仍需要检查API级别,以根据API级别设置优先级或重要性。 - LoveForDroid

3
你需要定义一个唯一的channelId(例如"MyChannelId_01"),然后调用NotificationCompat.Builder(ctx,"MyChannelId_01")。构建的通知将发布在此NotificationChannel "MyChannelId_01"上。
这使您可以定义通知的重要性(这控制发布到此频道的中断性通知的方式。值为IMPORTANCE_UNSPECIFIED、IMPORTANCE_NONE、IMPORTANCE_MIN、IMPORTANCE_LOW、IMPORTANCE_DEFAULT或IMPORTANCE_HIGH)。
你可以在这里找到一个例子:创建通知渠道

并不要忘记切换到英语! - tim4dev

2

我曾经遇到这个问题,既然我要针对 Android 22 和 24 进行开发,我就这样做:

NotificationCompat.Builder notification = new NotificationCompat.Builder(MainActivity.this, "")

我相信肯定会有人说这是一种hack,但它消除了警告,而且我没有遇到任何问题。

看起来,传递一个空字符串对于小于 Android 26 的版本有效。

也许其他人可以说明这是否会对26造成影响。

谢谢。


你救了我的一天! - Sabrina

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接