Android基础知识(二十):Notification、提醒式通知(横幅)踩坑与通知界面设置跳转
一、Notification通知与基本用法
通知Notification是Android系统中比较有特色的一个功能,当某个应用程序希望用户发出一些提示消息,而该应用程序又不在前台运行时,就可以借助通知来实现。
首先上代码,如下为Notification的一个简单的例子,其中使用NotificationManager来管理通知。通过设置通知的标题、通知内容、通知时间以及通知图标等内容,设置该应用程序的通知样式,并使用NotificationManager的notify方法显示通知,其第一个参数为通知的id,用于唯一标识该通知;第二个参数为notification。
关于Notification常用的设置setXX()方法及其说明如下所示。其中的设置方法setContentIntent(PendingIntent)用于设置当点击通知之后,将要跳转的Activity,PendingIntent与Intent类似,但是前者更加倾向于在某个合适的时机去执行某个动作,而Intent则是倾向于立即执行某个动作。
对于PendingIntent的实例获取中,Android提供了几个静态方法getActivity()、getBroadcast()、以及getService()方法。这几个方法的参数是一致的,第一个参数为Context,第二个参数一般用不到,通常传入0,第三个参数为Intent对象,通过该对象构建出PendingIntent的意图,第四个参数用于确定PendingIntent的行为,有4个值可选
FLAG_ONE_SHOT:该PendingIntent只作用一次。在该PendingIntent对象通过send()方法触发之后,将自动调用cancel进行销毁。
FLAG_NO_CREATE:如果AlarmManager管理的PendingIntent已经存在,那么将不进行任何操作,直接返回。
FLAG_CANCEL_CURRENT:如果AlarmManager管理的PendingIntent已经存在,那么将会取消当前的PendingIntent,从而创建一个新的PendingIntent。
FLAG_UPDATE_CURRENT:如果AlarmManager管理的PendingIntent已经存在,让新的Intent更新之前Intent对象数据。
二、Android 8.0消息通知适配
随着Android版本的更新,其对消息通知也做出了更改,如上的代码中可以看到当Android SDK的版本大于26时,原本的NotificationCompat.Builder(context)已经过时,并且在Android 8.0中,这样使用的通知是无法显示的。也就是说,在Android 8.0系统以上的手机使用上述代码,通知完全无法显示。
从Android 8.0系统开始,Google引入了通知渠道这个概念。通知渠道是指每条通知都要属于一个对应的渠道,每个APP可以自由地创建当前APP拥有哪些通知渠道,但是这些通知渠道的控制权都是掌握在用户手上的。用户可以自由地选择这些通知渠道的重要程度、是否响铃、是否震动或者是否关闭这个渠道的通知。
因此,Android 8.0及其以上系统中,为了能够显示通知,需要做如下的通知适配。对NotificationManager设置一个渠道,并设置该渠道的ID、Name、渠道重要程度以及设置是否震动等。
通知渠道类NotificationChannel的常用设置方法setXXX()如下表所示。
此外,一个APP可以设置多个渠道,即多个NotificationChannel,如下所示,在应用中设置两个通知渠道,分别命名为聊天通知消息,以及其他通知。
在手机中可以看到,该应用下的通知类别有聊天通知消息以及其他消息的通知渠道,用户可以通过不同的渠道对该应用的不同通知类型进行设置。
三、消息通知填坑——提醒式通知
诸如微信,QQ等应用一样,当应用程序有新的通知时候,Android系统会有提醒式通知。那么什么是提醒式通知呢?
从Android 5.0开始,通知可以短暂地显示在浮动窗口中,称之为提醒式通知。提醒式通知会在应用发出通知后立即出现,稍后便会消失,但仍显示在抽屉式通知栏中。
可能会触发提醒式通知的条件有如下3种:
用户的Activiity处于全屏模式(应用使用fullScreenIntent)
通知的优先级很高,且在搭载Android 7.1(API级别25)及更低版本的设备上使用铃声或震动。
在搭载Android 8.0(API级别为26)及更高版本的设备上,通知渠道的重要程度比较高。
- 坑1:fullScreenIntent的使用
经过实践,在小米手机中,设置用户的Activity处于全屏模式即使用fullScreenIntent方法,无论其第二个参数是否为true,其都会自动跳转到将要跳转的Activity,并且即使设置了setAutoCancel(true),由于该跳转不是点击通知发生的,所以通知并不会消失。
- 坑2:Android 8.0通知渠道重要程度
前面在做Android 8.0通知适配中,设置了通知渠道的重要程度都为最高NotificationManager.IMPORTANCE_HIGH,但是依旧没有提醒式通知。
据郭霖大神解释,国产手机默认只给微信、QQ这类程序开横幅(即提醒式通知),其余应用需要手动去设置里面选择打开横幅才会有,而之所以这么做一方面是和国内开发公司的素质相关,由于国内许多开发公司的APP根本不区分通知重要还是不重要,都会拉到最高权限,这是对用户的一种伤害。
所以,在通知渠道设置了一大堆乱七八糟的东西,系统就丢给你一句:然并卵!!
四、通知设置界面跳转
Android为开发者提供了管理读取通知渠道配置的权限,如果某个功能必须按照指定要求来配置通知渠道才能使用,那么可以提示用户手动更改通知渠道配置。
对于不同的Android版本,由于版本的不同其设置权限是不一样的,所以需要对APP所运行的客户端的Android版本进行判断,并根据不同的版本调用不同的代码进入到系统的通知设置界面。
第一张图Android 8.1下通知渠道名为聊天通知消息的通知具体设置界面,而第二张图为Android5.0至7.0之间的通知设置界面。
参考资料:《第一行代码 Android 第2版》
Android通知栏微技巧,8.0系统中通知栏的适配
AndroidTotal/Android权限之通知、自启动跳转