概括:

Android使用notification实现消息提醒,提供通知栏和通知抽屉查看通知和通知详情,Android的notification机制应用非常广泛,是指在应用程序之外显示的消息,布局由系统模板决定,开发者只需要定义模板中各部分的内容,通知详情就会在点开后展开视图显示设置的内容。

目前大体分为状态栏图标通知、悬挂提醒式通知、锁屏通知及圆点通知,从Android8.0开始必须为所有通知分配一个或多个通道,否则通知将不会显示。Android8.0及以上通过通道的importance属性设置重要性,Android8.0以下通过调用setPriority()方法进行设置。

实现:

官方推荐使用notification的内部构造器类Builder创建notification对象,notification类封装了通知的标题、内容、时间、小图标等信息。

        基本步骤:1.使用getSystemService()获取NotificationManager管理类。

                          2.使用notification类创建通知对象,设置标题、内容、图片等样式。

                          3.调用NotificationManager的notify()调出通知栏,显示通知。

                          4.Android8.0及以上版本,需要创建通知通道对通知进行管理。

常用的方法:

       setSmallIcon(long)——设置通知小图标,必选

       setContentTitle(String)——设置通知标题,可选

       setContentText(String)——设置通知内容,可选

       setWhen(long)——设置通知时间,默认系统时间

       setSound(Uri)——设置自定义音乐

       setLargeIcon(Bitmao)——设置通知栏下拉后的大图标

       setContentIntent(PendingIntent)——设置单击通知后跳转的Activity,延迟Intent实现

       setAutoCancel(boolean)——设置单击通知后是否消失,TRUE为消失

       setStyle(notification.Style)——设置通知的样式

       setPriority(int)——设置通知优先级,Android8.0以下使用

       setDefault(int)——设置通知的LED灯、音乐、震动等默认设置

高优先级的悬浮通知:

通知发出后会悬浮在状态栏,引起用户的注意,单击才会消失。Android8.0及以上不仅需要通过创建通知通道时设置importance为IMPORTANCE_HIGH实现,还要调用setFullScreenIntent(PendingIntent)实现悬浮样式;Android8.0以下版本则通过调用setPriority(NotificationCompat.PRIORITY_HIGH)实现。

展开式通知:

通过下滑手势将通知展开,直接获取通知的更多信息,Android8.0及以上提供了多种可展开的通知样式,通过调用setStyle()方法进行设置。

自定义布局的通知:

当系统提供的模板不能满足时可使用自定义布局,将自定义布局扩充为RemoteViews的实例,在构建通知时调用setCustomContentView()设置自定义布局。

添加操作按钮:

除了展示通知信息外,还可以添加之多三个操作按钮,方便用户快速响应,如暂停提醒、回复短信等,但是不应该重复用户用户在点按通知时执行的操作。添加操作按钮需要构建一个PendingIntent和Notification.Action对象,构建通知时调用addAction()方法进行设置,PendingIntent一般用于完成各种任务,如启动后台任务的广播,以便在不干扰当前正在运行的前提下实现快速响应。

通知可见等级设置:

可以通过调用setVisibility()设置在锁定屏幕上的可见等级:

        VISIBILITY_PUBLIC:显示通知的完整内容。

        VISIBILITY_SECRET:不在锁定屏幕上显示通知的任何部分。

        VISIBILITY_PERIVATE:显示通知的基本信息,如图标、标题

更新通知:

只需再次调用NotificationManagerCompat.notify(),将通知的id传递给该方法即可,如果发出的通知已被关闭,则系统会创建新的通知。此外黑可以通过调用setOnlyAlertOnce()方法只设置提醒一次,通知只会在首次出现时通过声音、震动等提醒用户,之后不会再提醒。

移除通知:

通过调用NotificationManager的cancel()或cancelAll()方法移除通知,cancel()用于移除指定id的通知,cancelAll()用于移除所有发出的通知。创建通知时通过setAutoCancel(true)也可以在用户点击通知后移除。

PendingIntent:

即用于延迟的Intent,可以看做是对Intent的封装,通过PendingIntent在将来某个不确定的时刻发生并启动Activity了解更多信息。需要注意的是禁止使用空Intent和隐式Intent,防止被恶意用户劫持修改内容。

PendingIntent实例对象可以调用PendingIntent的getActivity()、getBroadcast()和getService()等方法获取,对应Activity、Broadcast、Service三个组件的应用,共有4个相同的参数:Context、requestCode、Intent、flags,分别对应上下文对象、请求码、请求意图和关键标志位。