Android 8.0 适配——发送通知

前言

Android 8.0对通知栏进行了比较大的改动,引入了通知渠道的概念,发出通知的时候,可以根据渠道来发送,目的是提高用户体验,方便用户管理通知信息,同时也提高了通知到达率。同时用户具有管理每个渠道的权限(设置声音、震动等),并且可以关闭某个渠道的通知。

官方说明

关于8.0之后的一些变更,具体可以参考地址(需科学上网):
https://developer.android.google.cn/about/versions/oreo/android-8.0-changes
关于8.0之后的通知功能重新设计的说明:
https://developer.android.google.cn/about/versions/oreo/android-8.0

通知.png

通知适配

先来看看8.0之前是如何发送通知的
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification notification = null;
Intent intent = new Intent(context, SecondActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, REQUEST_CODE_NOTIFY, intent, PendingIntent.FLAG_UPDATE_CURRENT);
notification = new Notification.Builder(context)
                        .setSmallIcon(R.mipmap.ic_launcher)
                        .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                        .setContentTitle("API 24")
                        .setContentText("消息内容")
                        .setContentIntent(pendingIntent)
                        .setAutoCancel(true)
                        .setWhen(System.currentTimeMillis())
                        .build();
notificationManager.notify(123, notification);

但是这段代码在8.0之后的机器上就无法发送通知,会提示没有指定通知渠道


错误.png
接下来看看8.0之后是如何适配的

其实核心就是要给每个通知指定通知渠道,这样通知才可以正常发送,通知展示的方式取决于用户的设置

NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification notification = null;
Intent intent = new Intent(context, SecondActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(context, REQUEST_CODE_NOTIFY, intent, PendingIntent.FLAG_UPDATE_CURRENT);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    String id = "渠道ID";
    String channelName = "渠道A";
    NotificationChannel channel = new NotificationChannel(id, channelName, NotificationManager.IMPORTANCE_HIGH);
    notificationManager.createNotificationChannel(channel);
    notification = new Notification.Builder(context, id)
                            .setSmallIcon(R.mipmap.ic_launcher)
                            .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                            .setContentTitle("API 26")
                            .setContentText("渠道A")
                            .setContentIntent(pendingIntent)
                            .setAutoCancel(true)
                            .setWhen(System.currentTimeMillis())
                            .build();
}
notificationManager.notify(123, notification);

结尾

以上就是8.0之后发送通知时要注意的地方,可以使用Build.VERSION.SDK_INT >= Build.VERSION_CODES.O来判断一下手机的版本来选择发送的方式,避免产生一些不必要的错误提示。

你可能感兴趣的:(Android 8.0 适配——发送通知)