7月 022020
 

在学习《android权威编程指南》第3版28章通知消息时,发现使用书上的代码始终无法在测试机上显示状态栏通知,很是郁闷,后来终于在android官网的文档中找到了答案。(见: https://developer.android.com/training/notify-user/build-notification?hl=zh-cn#java

问题其实出在我的测试机的Android版本上 (我的机器是Android 9.0)。

官网对创建通知时, 有以下主要注意点:

  1. Android 8.0以上 NotificationCompat.Builder 构造函数除了要求context参数,还要求您提供channel  id参数。这是兼容 Android 8.0(API 级别 26)及更高版本所必需的,但会被较旧版本忽略。
  2. 也就是说Android 8.0及以上的版本, 必须先通过 createNotificationChannel() 创建NotificationChannel 的实例,  再将 NotificationChannel 的实例的id用于NotificationCompat.Builder的构造,在系统中注册应用的通知渠道,然后才能在 Android 8.0 及更高版本上提供通知。

 

就是说需要把书上的代码做以下改变:

原来的代码:

            Notification notification = new NotificationCompat.Builder(this)
                    .setTicker(resources.getString(R.string.new_pictures_title))
                    .setSmallIcon(android.R.drawable.ic_menu_report_image)
                    .setContentTitle(resources.getString(R.string.new_pictures_title))
                    .setContentText(resources.getString(R.string.new_pictures_text))
                    .setContentIntent(pi)
                    .setAutoCancel(true)
                    .build();

修改为新代码:

            NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
            String channelId = "default";
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
                String channelName = "默认通知";
                notificationManager.createNotificationChannel(new NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_HIGH));
            }

            Notification notification = new NotificationCompat.Builder(this, channelId)
                    .setTicker(resources.getString(R.string.new_pictures_title))
                    .setSmallIcon(android.R.drawable.ic_menu_report_image)
                    .setContentTitle(resources.getString(R.string.new_pictures_title))
                    .setContentText(resources.getString(R.string.new_pictures_text))
                    .setContentIntent(pi)
                    .setAutoCancel(true)
                    .build();

DONE!!!

Sorry, the comment form is closed at this time.