Android--Notification基础介绍

来源:互联网 发布:淘宝店铺0信誉出售 编辑:程序博客网 时间:2024/05/29 17:05

1、通知

我们使用的每个应用都有通知的功能,最常看到的就是 QQ 和微信了。通知是我们可以在应用的常规 UI 外部向用户显示的消息。当我们告知系统发出通知时,它将先以图标的形式显示在通知区域中。用户可以打开抽屉式通知栏查看通知的详细信息。 通知区域和抽屉式通知栏均是由系统控制的区域,用户可以随时查看。

通知区域中的通知:

抽屉式通知栏中的通知:

相信大家对这个样式都很熟悉了。

通知的目的是告知用户 App 事件。在平时的使用中,通知主要有以下几个作用:

  • 显示接收到短消息、及时消息等信息(如QQ、微信、新浪、短信)。
  • 显示客户端的推送消息,如广告、优惠、版本更新、推荐新闻等,常用的第三方 SDK 有:JPush、个推、信鸽、网易云信(偏重 IM)、阿里云推送。
  • 显示正在进行的事物,例如:后台运行的程序,如音乐播放进度、下载进度等。

所以我们在设计通知的时候要注意与用户交互和实时的任务提醒。

2、基本方法

现在都是使用建造者模式来构建 Notification 对象,可以使用的分别有 Notification.Builder 和 NotificationCompat.Builder。由于 Notification.Builder 仅支持 Android 4.1及之后的版本,为了解决兼容性问题, Google 在 Android Support v4 中加入了 NotificationCompat.Builder 类。

Notification 对象必须包含以下内容:

  • 小图标,由 setSmallIcon() 设置
  • 标题,由 setContentTitle() 设置
  • 详细文本,由 setContentText() 设置

除了以上三项,其它均为可选项。虽然如此,但还是应该给 Notification 设置一个点击事件,这样就可以直接跳转到 App 的某个 Activity 、启动一个 Service 或者发送一个 Broadcast。否则,Notification 仅仅只能起到通知的效果,而不能与用户交互。

当系统接收到通知时,可以通过震动、响铃、呼吸灯等多种方式进行提醒。

Notification.Builder 的其它方法:

  • setSubText(CharSequence):设置内容下面一小行的文字。
  • setTicker(CharSequence):设置收到通知时在顶部显示的文字信息。
  • setWhen(long):设置通知时间,一般设置的是收到通知时的System.currentTimeMillis()。
  • setLargeIcon(Bitmap):设置左边的大图标。
  • setAutoCancel(boolean):用户点击 Notification 面板后是否让通知取消(true 为取消,默认不取消),只有在存在点击事件时才有效。
  • setDefaults(int):向通知添加声音、闪灯和振动效果的最简单、 使用默认(defaults)属性,可以同时设置多个属性,不会冲突:
    • Notification.DEFAULT_VIBRATE(添加默认震动提醒)
    • Notification.DEFAULT_SOUND(添加默认声音提醒)
    • Notification.DEFAULT_LIGHTS(添加默认三色灯提醒)
    • Notification.DEFAULT_ALL(添加默认以上3种全部提醒)
  • setVibrate(long[]):设置振动方式,比如: setVibrate(new long[]{0,300,500,700});
    延迟0ms,然后振动300ms,在延迟500ms, 接着再振动700ms。
  • setLights(int argb, int onMs, int offMs):设置三色灯,参数依次是:灯光颜色,亮持续时间,暗的时间,不是所有颜色都可以,这跟设备有关,有些手机还不带三色灯。另外,还需要为Notification设置flags为 Notification.FLAG_SHOW_LIGHTS 才支持三色灯
  • setSound(Uri):设置接收到通知时的铃声,可以用系统的,也可以自己设置,例子如下:
    • .setDefaults(Notification.DEFAULT_SOUND) //获取默认铃声
    • .setSound(Uri.parse(“file:///sdcard/xx/xx.mp3”)) //获取自定义铃声
    • .setSound(Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, “5”)) //获取Android多媒体库内的铃声
  • setOngoing(boolean):设置为ture,表示它为一个正在进行的通知。通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)。
  • setProgress(int,int,boolean):设置带进度条的通知 参数依次为:进度条最大数值,当前进度,进度是否不确定。
    如果为确定的进度条:调用setProgress(max, progress, false)来设置通知, 在更新进度的时候在此发起通知更新progress,并且在下载完成后要移除进度条 ,通过调用setProgress(0, 0, false)既可。
    如果为不确定(持续活动)的进度条, 这是在处理进度无法准确获知时显示活动正在持续,所以调用setProgress(0, 0, true) ,操作结束时,调用setProgress(0, 0, false)并更新通知以移除指示条。
  • setPriority(int):设置优先级(Notification.PRIORITY_XX):
    • MAX 重要而紧急的通知,通知用户这个事件是时间上紧迫的或者需要立即处理的。
    • HIGH 高优先级用于重要的通信内容,例如短消息或者聊天,这些都是对用户来说比较有兴趣的。
    • DEFAULT 默认优先级用于没有特殊优先级分类的通知。
    • LOW 低优先级可以通知用户但又不是很紧急的事件。
    • MIN 用于后台消息 (例如天气或者位置信息)。最低优先级通知将只在状态栏显示图标,只有用户下拉通知抽屉才能看到内容。
  • setContentIntent(PendingIntent):这个我们在下面特别介绍。

在上面出现了 setSmallIcon() 和 setLargeIcon() 两个设置图标的,它们的不同在于当 setSmallIcon() 与 setLargeIcon() 同时存在时, smallIcon 显示在largeIcon的右下角;当只设置 setSmallIcon() 时, smallIcon 显示在左侧。

在不同的设备上,可能效果不同,同时使用只会出现大图标。

3、第一个通知

上面介绍了很多通知的方法,我们现在先来做一个最简单的通知:

public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //获取NotificationManager实例        final NotificationManager notifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.t2);        //实例化NotificationCompat.Builde并设置相关属性        final NotificationCompat.Builder builder = new NotificationCompat.Builder(this)                .setSmallIcon(R.mipmap.ic_launcher)                .setContentTitle("Title")                .setContentText("content").setLargeIcon(bitmap);        Button button = (Button) findViewById(R.id.click);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                notifyManager.notify(1, builder.build());            }        });    }}

构建一个简单的通知,主要分为三步:

  1. 获取 NotificationManager 实例
  2. 实例化 NotificationCompat.Builde 并设置相关属性
  3. 通过 NotificationManager.notify() 方法显示通知

NotificationManager: 是状态栏通知的管理类,负责发通知、清除通知等。NotificationManager 是一个系统Service,必须通过 getSystemService() 方法来获取。

4、通知点击事件

大家都应该知道应用一般发的通知被点击就会跳转到一个应用程序里,这样说不是就跟 Intent 一样了吗?其实说是给 Notification 加点击事件,就是使用 Intent,然后我们的点击就能触发 Intent,可以说这是通知的核心,我们来看看用什么方法实现。

public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        final NotificationManager notifyManager = (NotificationManager)                getSystemService(Context.NOTIFICATION_SERVICE);        Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.t2);        final NotificationCompat.Builder builder = new NotificationCompat.Builder(this)                .setSmallIcon(R.mipmap.ic_launcher)                .setContentTitle("Title")                .setContentText("content")                .setLargeIcon(bitmap);        Intent intent = new Intent(this, MainActivity.class);        PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent,                PendingIntent.FLAG_UPDATE_CURRENT);        builder.setContentIntent(pIntent);        Button button = (Button) findViewById(R.id.click);        button.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                notifyManager.notify(1, builder.build());            }        });    }}

在上面我们介绍方法的时候说到 setContentIntent(),这里就使用了,这个方法就是用来设置通知的 Intent 的,不过这里不能使用 Intent,而是使用 PendingIntent。

1、PendingIntent

PendingIntent 是一种特殊的 Intent ,字面意思可以解释为延迟的 Intent,用于在某个事件结束后执行特定的 Action,这里就是当用户点击通知时,才会执行 Intent。

PendingIntent 是 Android 系统管理并持有的用于描述和获取原始数据的对象的标志(引用)。也就是说,即便创建该 PendingIntent 对象的进程被杀死了,这个 PendingItent 对象在其他进程中还是可用的。

日常使用中的短信、闹钟等都用到了 PendingIntent。

PendingIntent 主要可以通过以下三种方式获取:

//获取一个用于启动 Activity 的 PendingIntent 对象public static PendingIntent getActivity(Context context, int requestCode, Intent intent, int flags);
//获取一个用于启动 Service 的 PendingIntent 对象public static PendingIntent getService(Context context, int requestCode, Intent intent, int flags);
//获取一个用于向 BroadcastReceiver 广播的 PendingIntent 对象public static PendingIntent getBroadcast(Context context, int requestCode, Intent intent, int flags)

pendingIntent 执行的操作实质上是参数传进来的 Intent 的操作,但是使用 pendingIntent 的目的在于它所包含的 Intent 的操作的执行需要满足某些条件。

PendingIntent 具有以下几种 flag:

  • FLAG_CANCEL_CURRENT:如果当前系统中已经存在一个相同的 PendingIntent 对象,那么就将先将已有的 PendingIntent 取消,然后重新生成一个 PendingIntent 对象。
  • FLAG_NO_CREATE:如果当前系统中不存在相同的 PendingIntent 对象,系统将不会创建该 PendingIntent 对象而是直接返回 null 。
  • FLAG_ONE_SHOT:该 PendingIntent 只作用一次。
  • FLAG_UPDATE_CURRENT:如果系统中已存在该 PendingIntent 对象,那么系统将保留该 PendingIntent 对象,但是会使用新的 Intent 来更新之前 PendingIntent 中的 Intent 对象数据,例如更新 Intent 中的 Extras 。

2、跳转到其它的应用

我们刚刚只是跳转到本应用的 Activity 下,如果我们想要跳转到其它应用应该怎么做呢。

我们要启动另一个应用,最重要的是知道应用的包名,对于这个是比较容易获得的:

PackageManager pm = getPackageManager();Intent intent = pm.getLaunchIntentForPackage("com.android.calculator2");

这是跳转到系统带的一个计算器上,使用这个还需要判断这个包的程序是否存在,这里就不做了。

5、取消通知

上面跳转的例子中我们虽然点击了通知,但它并没有消失,根据平时我们使用其它软件的经验,这个通知已经取到了通知的作用,在点击后就应该让它消失,那该怎么取消呢。

要消除通知有几种方法:

  • 设置了 setAutoCancel() 或 FLAG_AUTO_CANCEL 的通知,点击该通知时会清除它。
  • 通过 NotificationManager 调用 cancel(int id) 方法清除指定 ID 的通知。
  • 通过 NotificationManager 调用 cancel(String tag, int id) 方法清除指定 TAG 和 ID 的通知。
  • 通过 NotificationManager 调用 cancelAll() 方法清除所有该应用之前发送的通知。

如果你是通过 NotificationManager.notify(String tag, int id, Notification notify) 方法创建的通知,那么只能通过 cancel(String tag, int id) 方法才能清除对应的通知,调用 cancel(int id) 无效。

前面提到过 setAutoCancel() 必须是通知中被设置了 Intent 才会有效,我们在刚刚的例子中加上调用这个方法:

builder.setAutoCancel(true);

将 Notification 的 flags 变为 FLAG_AUTO_CANCEL,我们可以这么做:

Notification notification = builder.build();notification.flags = Notification.FLAG_AUTO_CANCEL;

这里需要创建 Notification 实例,不能用 builder.build().flags 来设置。notify() 方法中的 Notification 也要设置为这个才能起到作用。

结束语:本文仅用来学习记录,参考查阅。

原创粉丝点击