一、Android 8.0及以上系统的通知栏适配
1、适配原因:从Android 8.0系统开始,Google引入了通知渠道的概念,每条通知都要属于一个对应的渠道,用户可以自由地选择这些通知渠道的重要程度,是否响铃、是否振动、或者是否要关闭这个渠道的通知。
2、适配步骤:
创建通知渠道:使用NotificationManager
的createNotificationChannel
方法创建通知渠道,需要指定渠道ID、名称、重要性级别等参数。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { CharSequence name = "渠道名称"; String description = "渠道描述"; int importance = NotificationManager.IMPORTANCE_DEFAULT; Channel channel = new NotificationChannel("CHANNEL_ID", name, importance); channel.setDescription(description); // 注册通知渠道 NotificationManager notificationManager = getSystemService(NotificationManager.class); notificationManager.createNotificationChannel(channel); }
创建通知并指定渠道:在创建通知时,通过NotificationCompat.Builder
的setChannelId
方法指定通知所属的渠道。
Notification notification = new NotificationCompat.Builder(this, "CHANNEL_ID") .setContentTitle("标题") .setContentText("内容") .build();
3、注意事项:通知渠道一旦创建之后就不能再修改,因此开发者需要仔细分析自己的App有哪些类型的通知,然后再去创建相应的通知渠道。
二、Android 10及以上系统的通知栏适配
1、适配原因:Android 10对通知行为进行了进一步的规范和限制,例如对后台通知的限制更加严格,只有当应用处于前台或者被用户标记为高优先级时才能发送通知。
2、适配步骤:
判断通知权限是否打开:在发送通知之前,需要先判断通知权限是否已经打开,可以使用NotificationManagerCompat.from(context).areNotificationsEnabled()
方法来判断,如果通知权限没有打开,需要引导用户去设置中打开通知权限。
if (!NotificationManagerCompat.from(this).areNotificationsEnabled()) { // 跳转到通知管理页面 Intent intent = new Intent(); intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS); intent.addCategory(Intent.CATEGORY_DEFAULT); intent.setData(Uri.parse("package:" + getPackageName())); intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); startActivity(intent); }
适配通知类别:根据不同的通知内容和场景,选择合适的通知类别(如普通通知、紧急通知等),并设置相应的优先级和行为,对于紧急通知,可以设置较高的优先级和震动提醒;对于普通通知,可以设置较低的优先级和不震动提醒。
处理后台通知限制:如果应用需要在后台发送通知,需要确保应用满足Android 10的后台通知限制条件,可以将应用设置为高优先级应用(通过设置Service
的foregroundServiceType
属性),或者使用JobScheduler
来定时发送通知。
1、适配原因:不同品牌和型号的手机可能对通知栏的样式、布局和行为进行了定制,导致通知在不同手机上的显示效果不一致。
2、适配步骤:
了解差异:首先需要了解不同品牌和型号手机的通知栏差异,包括样式、布局、动画效果等方面的差异,可以通过官方文档、开发者论坛、用户反馈等途径获取相关信息。
针对性调整:根据不同手机的差异,对通知栏的样式、布局和行为进行针对性的调整,可以修改通知图标的大小、颜色、形状等属性,以适应不同手机的显示效果;可以调整通知文本的字体大小、颜色、行距等属性,以提高可读性;可以优化通知动画效果,使其在不同手机上都能流畅运行。
测试验证:在多个不同品牌和型号的手机上进行测试验证,确保通知栏在各种手机上都能正常显示和运行,可以使用模拟器、真机测试等方式进行测试。
1、问:如果targetSdkVersion低于26但使用了通知渠道相关的API会怎么样?
答:如果targetSdkVersion低于26但使用了通知渠道相关的API,可能会出现兼容性问题,虽然代码仍然可以编译和运行,但在Android 8.0以下的系统中,通知渠道的概念不存在,所以这些API可能无法达到预期的效果,在未来升级targetSdkVersion到26或更高版本时,也需要对这些代码进行相应的修改和测试。
2、问:如何在不同的通知渠道中发送不同类型的通知?
答:可以在创建通知时,通过NotificationCompat.Builder
的setChannelId
方法指定通知所属的渠道ID,然后根据不同类型的通知内容,创建不同的通知实例并指定到相应的渠道中即可。
Notification notification1 = new NotificationCompat.Builder(this, "CHANNEL_ID_1") .setContentTitle("标题1") .setContentText("内容1") .build(); NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this); notificationManager.notify(1, notification1); Notification notification2 = new NotificationCompat.Builder(this, "CHANNEL_ID_2") .setContentTitle("标题2") .setContentText("内容2") .build(); notificationManager.notify(2, notification2);