Android O 之 NotificationChannel

最近遇到用户提的一个BUG,应用通知管理里的文案没有翻译,如下:

Android O 之 NotificationChannel_第1张图片

项目中都找不到相关的字符串,一脸懵逼,deamon、default这从哪来的呢?一通搜索,终于在一个集成的aar包中发现了相关字串。

原来在 Android 0之后,app发送的每个通知都必须依附于一个NotificationChannel,每个notification对象必须发送到指定的NotificationChannel,如果找不到channel,就会报错。同时,开发者可以为需要发送的每个不同的通知类型创建一个通知渠道,用户亦可分别对每个不同的通知渠道中通知的展现方式,进行个性化的设置,如下:

Android O 之 NotificationChannel_第2张图片

这样,Android O就可以通过 channel 对通知分类,用户亦可以根据自己对不同渠道通知的喜好,选择以不同的方式接收特定 channel 的通知了。 

创建通知渠道其实很简单,我们还是用代码来说话:

NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
//第一个参数id:就是通知渠道的id,后续Notification.Builder使用哪个渠道就依靠此id来判断
//第二个参数name:就是用户可以看到的通知渠道的名字
//第三个参数importance:就是通知的重要程度
NotificationChannel channel = new NotificationChannel("channel_01", "daemon", NotificationManager.IMPORTANCE_DEFAULT);
NotificationChannel channel1 = new NotificationChannel("channel_02", "default", NotificationManager.IMPORTANCE_DEFAULT);
channel.setSound(null, null);
//用户可以看到的当前通知渠道的描述
channel.setDescription("channerl为channel_01,name为daemon");
nm.createNotificationChannel(channel);
nm.createNotificationChannel(channel1);
Notification.Builder mBuilder= new Notification.Builder(context, "channel_01");

mBuilder.setSmallIcon(R.mipmap.ic_shuqi_icon);//使用RemoteViews时,设置的是状态栏中的小图标,必须要设置
mBuilder.setAutoCancel(true);//设置是否点击通知后会自动消失
Notification notification = mBuilder.build();
//通过xml创建RemoteViews,并且动态改变布局中的内容
RemoteViews views = new RemoteViews(getPackageName(), R.layout.notification);
views.setImageViewResource(R.id.iv_icon, R.mipmap.ic_shuqi_icon);
views.setImageViewResource(R.id.iv_banner, R.mipmap.ic_shuqi_banner); views.setTextViewText(R.id.tv_title, "书旗小说,幸运翻牌");
views.setTextViewText(R.id.tv_content, "书旗小说,海量好书尽情看!");
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm");
String time = sdf.format(date);
views.setTextViewText(R.id.tv_time, time);
//这里需要注意,如果不设置 notification.bigContentView ,则由于通知的高度是固定的,如果remoteview的布局超过了其通知的高度,就会有一部分显示不出来了
notification.bigContentView = views;
notification.contentView = views;
Intent intentNotification = new Intent();
intentNotification.setData(Uri.parse("shuqi://openapp?params=%7B%22from%22%3A%22aguyac%22%2C%22pageName%22%3A%22browser%22%2C%22params%22%3A%7B%22pageTitle%22%3A%22%E4%B9%A6%E6%97%97%E5%B0%8F%E8%AF%B4%22%2C%22targetUrl%22%3A%22http%3A%2F%2Factivityuae.shuqiread.com%2Fact_305_poker%2Findex.php%3Ffrom%3Daguyac%26forceOrientation%3D1%23%2Factid%2F249%22%7D%7D"));
intentNotification.setPackage("com.shuqi.controller");
intentNotification.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
PendingIntent pi = PendingIntent.getActivity(context, 123, intentNotification, PendingIntent.FLAG_CANCEL_CURRENT);
notification.contentIntent = pi;
nm.notify(9999, notification);

Android O 之 NotificationChannel_第3张图片

你可能感兴趣的:(Android踩坑)