Android使用Notification实现通知功能

这篇文章并未详细介绍通知相关的api,而是作者自己对通知的一些大致总结,以便日后查看,请读者自行参考阅读。

andorid关于通知在多个sdk版本中均有修改,因此部分api涉及到版本兼容的问题。编程中我们使用NotificationCompat来实现通知的相关功能。

1.通知中添加按钮的方式

  • Notification可以通过直接调Notification.Builder.addAction(int icon, CharSequence title, PendingIntent intent)或者Notification.Builder.addAction(Action action)来添加按钮
  • 可以通过设置RemoteView自定义布局的方式来添加按钮;

2.通知的各种style

如果普通的通知样式无法满足项目需求,我们可以使用android提供的各种style。
目前style的种类包括BigTextStyle(超长文本)、InboxStyle(多行/列表)、BigPictureStyle(大图片)、MessagingStyle(多条消息)、MediaStyle(started Android Oreo)。

3.自定义的通知View

如果上面普通通知栏和各种style不能满足需求,也可以自己定义通知栏视图remoteVIew,并将其设置给通知的ContentView即可。在android随后更新的sdk版本中增加了BigContentView(started android Jelly_bean)、heasUpContentView(started android Lollipop),分别用于显示通知栏的大视图,悬挂视图。

4.锁屏时展示通知

自android Lollipop版本开始支持锁定屏幕时显示通知。用户可以通过“设置”选择是否将通知显示在锁定屏幕上,并且您可以指定您应用中的通知在锁定屏幕上是否可见。通过 setVisibility() 并指定以下值之一:

  • VISIBILITY_PUBLIC 显示通知的完整内容。
  • VISIBILITY_SECRET 不会在锁定屏幕上显示此通知的任何部分。
  • VISIBILITY_PRIVATE 显示通知图标和内容标题等基本信息,但是隐藏通知的完整内容。设置 VISIBILITY_PRIVATE 后,您还可以提供其中隐藏了某些详细信息的替换版本通知内容。例如,短信 应用可能会显示一条通知,指出“您有 3 条新短信”,但是隐藏了短信内容和发件人。要提供此替换版本的通知,请先使用 NotificationCompat.Builder 创建替换通知。创建专用通知对象时,请通过 setPublicVersion() 方法为其附加替换通知。

5.快捷回复

自android Nougat版本开始增加了通知栏的快捷回复功能,具体实现步骤:给通知栏添加一个action(一般是快捷服务按钮),该action初始化时传入PendingIntent和RemoteInput即可。

//通知快速回复
public void quickReplyClick(View view){
        NotificationCompat.Builder builder = getBuilder();

        Intent intent = new Intent(MainActivity.this, ThirdActivity.class);
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

        RemoteInput remoteInput = new RemoteInput
                .Builder("RemoteInputKey")
                .setLabel("RemoteInputLabel")
                .build();

        NotificationCompat.Action action = new NotificationCompat.Action
                .Builder(R.drawable.air, "回复", pendingIntent)
                .addRemoteInput(remoteInput)
                .build();

        builder.addAction(action);

        // 发送该通知
        notifyDefaultPriority(++mNotificationId,builder);
    }

6.通知分组功能

自android Nougat版本开始增加了通知的分组功能。在android Nougat版本及以上,如果同一应用发出 4 条或更多条通知且未指定分组,则系统会自动将这些通知分为一组。

通知分组的实现方式(只列举关键方法):

private final String GROUP_NOTIFICATION_ONE = "GROUP1";
private final int  GROUP_NOTIFICATION_ID = 0;

    //通知分类
    public void classifyClick(View view){
        NotificationCompat.Builder builder1 = getBuilder();//创建一个普通的通知buidler对象,方法很简单
        builder1.setGroup(GROUP_NOTIFICATION_ONE);//设置group
        notifyDefaultPriority(++mNotificationId,builder1);//弹出第一条通知
        notifyDefaultPriority(++mNotificationId,builder1);//弹出第二条通知

        NotificationCompat.Builder builder2 = getBuilder();//创建一个普通的通知buidler对象,方法很简单
        builder2.setContentTitle("test classify");
        builder2.setGroup(GROUP_NOTIFICATION_ONE);//设置相同的group
        builder2.setGroupSummary(true);//这一句必须要,这条通知是作为summary notification(我的理解是将已经发送的相同group的通知进行归类)
        notifyDefaultPriority(GROUP_NOTIFICATION_ID,builder2);//这条通知的notification id是个常量,弹出通知
    }

7.通知通道NotificationChannel

自android Oreo版本开始增加了通知通道的概念,在targetSdkVersion>=26时弹出通知需要做兼容处理:为Notification设置channel,否则通知将会弹出失败。

private void setNotifyChannel(NotificationCompat.Builder builder,String channelId,String channelName,int importance){
        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){
            NotificationManager nm = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE);
            NotificationChannel notificationChannel = nm.getNotificationChannel(channelId);
            if(notificationChannel==null){
                notificationChannel = new NotificationChannel(channelId,channelName,importance);
                nm.createNotificationChannel(notificationChannel);
            }
            builder.setChannelId(channelId);
        }
    }

8.通知的重要程度

Android 利用通知的重要程度来决定通知应在多大程度上干扰用户(视觉上和听觉上)。通知的重要程度越高,干扰程度就越高。

  • 在搭载 Android Oreo(API 级别 26)及更高版本的设备上,通知的重要程度由通知发布到的渠道NotificationChannle的 importance 决定。用户可以在系统设置中更改通知渠道的重要程度。
  • 在搭载 Android 7.1(API 级别 25)及更低版本的设备上,每条通知的重要程度均由通知的 priority 决定。

以上便是通知的相关知识~
其他可参考官网

这里增加说明下可能会触发悬浮式通知的条件示例:

  • 用户的 Activity 处于全屏模式(应用使用 fullScreenIntent)。
  • 通知的优先级很高,且在搭载 Android 7.1(API 级别 25)及更低版本的设备上使用铃声或振动。
  • 在搭载 Android 8.0(API 级别 26)及更高版本的设备上,通知渠道的重要程度比较高。

对应的有三种实现方式:

为Notification设置全屏时的PendingIntent:setFullScreenIntent(PendingIntent intent, boolean highPriority)即可(第二个参数表示是否是高优先级,需传值true。在android Oreo的平台上则需要NotificationChannel的优先级设置为IMPORTANCE_HIGH或者IMPORTANCE_MAX才有效)

为Notification设置优先级setPriority(NotificationCompat.PRIORITY_HIGH)或者builder.setPriority(NotificationCompat.PRIORITY_MAX)(在android Oreo的平台上只需要NotificationChannel的优先级设置为IMPORTANCE_HIGH或者IMPORTANCE_MAX),同时android 7.1及以下的平台还需要设置setSound(Uri sound)才行(android 8.0平台无需设置震动或铃声)

在android Lollipop及以上平台,可以自定义悬挂视图remoteView,将其设置为Notification的heasUpContentView即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android中通知Notification使用实例(振动、灯光、声音)

    本文实例讲解了通知Notification使用方法,此知识点就是用作通知的显示,包括振动.灯光.声音等效果,分享给大家供大家参考,具体内容如下 效果图: MainActivity: import java.io.File; import android.app.Activity; import android.app.Notification; import android.app.NotificationManager; import android.app.PendingIntent; im

  • android中创建通知栏Notification代码实例

    ///// 第一步:获取NotificationManager NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); ///// 第二步:定义Notification Intent intent = new Intent(this, OtherActivity.class); //PendingIntent是待执行的Intent PendingIntent pi

  • android使用NotificationListenerService监听通知栏消息

    NotificationListenerService是通过系统调起的服务,在应用发起通知时,系统会将通知的应用,动作和信息回调给NotificationListenerService.但使用之前需要引导用户进行授权.使用NotificationListenerService一般需要下面三个步骤. 注册服务 首先需要在AndroidManifest.xml对service进行注册. <service android:name=".NotificationCollectorService&q

  • Android使用Notification在状态栏上显示通知

    在使用手机时,当有未接来电或者是新短消息时,手机会给出相应的提示信息,这些提示信息通常会显示到手机屏幕的状态栏上.Android也提供了用于处理此类信息的类,他们是Notification和NotificationManager.其中,Notification代表的是具有全局效果的通知:而NotificationManager则是用于发送Notification通知的系统服务. 使用Notification和NotificationManager类发送和显示通知也比较简单,大致可分为以下4个步骤

  • Android种使用Notification实现通知管理以及自定义通知栏实例(示例四)

    示例一:实现通知栏管理 当针对相同类型的事件多次发出通知,作为开发者,应该避免使用全新的通知,这时就应该考虑更新之前通知栏的一些值来达到提醒用户的目的.例如我们手机的短信系统,当不断有新消息传来时,我们的通知栏仅仅是更改传来短信的数目,而不是对每条短信单独做一个通知栏用于提示. 修改通知 可以设置一条通知,当然可以更新一条通知,我们通过在调用NotificationManager.notify(ID, notification)时所使用的ID来更新它.为了更新你之前发布的通知,你需要更新或者创建

  • Android 通知使用权(NotificationListenerService)的使用

    Android  通知使用权(NotificationListenerService)的使用 简介 当下不少第三方安全APP都有消息管理功能或者叫消息盒子功能,它们能管理过滤系统中的一些无用消息,使得消息栏更清爽干净.其实此功能的实现便是使用了Android中提供的通知使用权权限.Android4.3后加入了通知使用权NotificationListenerService,就是说当你开发的APP拥有此权限后便可以监听当前系统的通知的变化,在Android4.4后还扩展了可以获取通知详情信息.下面

  • Android中通过Notification&NotificationManager实现消息通知

    notification是一种让你的应用程序在没有开启情况下或在后台运行警示用户.它是看不见的程序组件(Broadcast Receiver,Service和不活跃的Activity)警示用户有需要注意的事件发生的最好途径. 1.新建一个android项目 我新建项目的 minSdkVersion="11",targetSdkVersion="19".也就是支持最低版本的3.0的. 2.习惯性地打开项目清单文件AndroidManifest.xml,添加一个权限:&

  • Android中AlarmManager+Notification实现定时通知提醒功能

    AlarmManager简介 AlarmManager实质是一个全局的定时器,是Android中常用的一种系统级别的提示服务,在指定时间或周期性启动其它组件(包括Activity,Service,BroadcastReceiver).本文将讲解一下如何使用AlarmManager实现定时提醒功能. 闹钟配置 周期闹钟 Intent intent = new Intent(); intent.setAction(GlobalValues.TIMER_ACTION_REPEATING); Pendi

  • Android开发 -- 状态栏通知Notification、NotificationManager详解

    本想自己写一个的,但是看到这篇之后,我想还是转过来吧,实在是非常的详细: 在Android系统中,发一个状态栏通知还是很方便的.下面我们就来看一下,怎么发送状态栏通知,状态栏通知又有哪些参数可以设置? 首先,发送一个状态栏通知必须用到两个类:  NotificationManager . Notification. NotificationManager :  是状态栏通知的管理类,负责发通知.清楚通知等. NotificationManager 是一个系统Service,必须通过 getSys

  • Android 中Notification弹出通知实现代码

    NotificationManager 是状态栏通知的管理类,负责发通知.清除通知等操作. NotificationManager 是一个系统Service,可通过getSystemService(NOTIFICATION_SERVICE)方法来获取 接下来我想说的是android5.0 后的弹出通知, 网上的方法是: //第一步:实例化通知栏构造器Notification.Builder: Notification.Builder builder =new Notification.Build

随机推荐