Android Notification 状态栏通知

Notification ( 状态栏通知 ) 估计是最常见的,比微信还常见,在现在的智能机从屏幕顶部往下滑,看到的比比皆是

我们先来看看状态栏通知的基本组成

Notification 的基本布局

组成元素 说明
Icon/Photo 大图标
Title/Name 标题
Message 内容信息
Timestamp 通知时间,默认是发出通知的时间,可以通过 setWhen() 设置
Secondary Icon 小图标
内容文字 在小图标的左手边的一个文字

这个布局是我们最常见的,当然还有一些其它布局,不过都是在最基础的布局上扩展而来饿

扩展布局

我们可以通过扩展布局显示消息的前几行或者图片的预览

这样用户可以看多更多的内容 - 有时甚至可以看到整个消息

用户可以通过 pinch-zoom 或者双手指滑动来打开扩展布局

Android 为单条消息提供了两种扩展布局 (文字和图像) 供你开发应用时使用

Notification ( 状态栏通知 )

状态通知栏主要涉及到2个类 NotificationNotificationManager

说明
Notification 通知信息类,它里面对应了通知栏的各个属性
NotificationManager 是状态栏通知的管理类,负责发通知、清除通知等操作

使用的基本流程

  1. 获得 NotificationManager 对象

    NotificationManager mNManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    
  2. 创建一个通知栏的 Builder 构造类

    Notification.Builder mBuilder = new Notification.Builder(this);
    
  3. mBuilder 进行相关的设置,比如标题,内容,图标,动作等

  4. 调用 mBuilder.build() 方法为 notification 赋值

  5. 调用 NotificationManager.notify() 方法发送通知

  6. 另外我们还可以调用 NotificationManager.cancel() 方法取消通知

设置相关的一些方法

首先我们要创建一个 Builder

Notification.Builder mBuilder = new Notification.Builder(this);

后再调用下述的相关的方法进行设置

方法 说明
setContentTitle(CharSequence) 设置标题
setContentText(CharSequence) 设置内容
setSubText(CharSequence) 设置内容下面一小行的文字,API 16+ 才可以用
setTicker(CharSequence) 设置收到通知时在顶部显示的文字信息
setWhen(long) 设置通知时间,一般设置的是收到通知时的 System.currentTimeMillis()
setSmallIcon(int) 设置右下角的小图标,在接收到通知的时候顶部也会显示这个小图标
setLargeIcon(Bitmap) 设置左边的大图标
setAutoCancel(boolean) 用户点击 Notification 点击面板后是否让通知取消(默认不取消)

还可以调用其它方法

  1. setDefaults(int)

    向通知添加声音、闪灯和振动效果的最简单方法是使用默认 ( defaults ) 属性

    可以组合多个属性

    属性 说明
    Notification.DEFAULT_VIBRATE 添加默认震动提醒
    Notification.DEFAULT_SOUND 添加默认声音提醒
    Notification.DEFAULT_LIGHTS 添加默认三色灯提醒
    Notification.DEFAULT_ALL 添加默认以上3种全部提醒
  2. setVibrate(long[])

    设置振动方式,比如

    setVibrate(new long[] {0,300,500,700});
    

    延迟0ms,然后振动300ms,在延迟500ms,接着再振动700ms

  3. setLights(int argb, int onMs, int offMs)

    设置三色灯,参数依次是:灯光颜色,亮持续时间,暗的时间

    不是所有颜色都可以,这跟设备有关,有些手机还不带三色灯

    另外,还需要为 Notification 设置 flags 为 Notification.FLAG_SHOW_LIGHTS 才支持三色灯提醒

  4. setSound(Uri)

    设置接收到通知时的铃声,可以用系统的,也可以自己设置

    获取默认铃声

    .setDefaults(Notification.DEFAULT_SOUND)
    

    获取自定义铃声

    .setSound(Uri.parse("file:///sdcard/xx/xx.mp3"))
    

    获取Android多媒体库内的铃声

    .setSound(Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "5"))
    
  5. setOngoing(boolean)

    设置为 ture,表示它为一个正在进行的通知

    他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)

  6. setProgress(int,int,boolean)

    设置带进度条的通知

    参数依次为:进度条最大数值,当前进度,进度是否不确定

    1. 如果为确定的进度条:调用 setProgress(max, progress, false) 来设置通知,在更新进度的时候在此发起通知更新progress,并且在下载完成后要移除进度条,通过调用 setProgress(0, 0, false) 既可

    2. 如果为不确定(持续活动)的进度条,这是在处理进度无法准确获知时显示活动正在持续,所以调用 setProgress(0, 0, true),操作结束时,调用 setProgress(0, 0, false) 并更新通知以移除指示条

  7. setContentIntent(PendingIntent)

    PendingIntent 和 Intent 略有不同,它可以设置执行次数,主要用于远程服务通信、闹铃、通知、启动器、短信中,在一般情况下用的比较少

    比如这里通过 Pending 启动 Activity

    getActivity(Context, int, Intent, int)
    

    当然还可以启动 Service 或者 Broadcast

    PendingIntent 的位标识符(第四个参数) 可以是以下值值之一

    说明
    FLAG_ONE_SHOT 表示返回的 PendingIntent 仅能执行一次,执行完后自动取消
    FLAG_NO_CREATE 表示如果描述的 PendingIntent 不存在,并不创建相应的 PendingIntent,而是返回 NULL
    FLAG_CANCEL_CURRENT 表示相应的 PendingIntent 已经存在,则取消前者,然后创建新的 PendingIntent,这个有利于数据保持为最新的,可以用于即时通信的通信场景
    FLAG_UPDATE_CURRENT 表示更新的 PendingIntent

    使用示例

    //点击后跳转Activity
    Intent intent = new Intent(context,XXX.class);  
    PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, intent, 0);  
    mBuilder.setContentIntent(pendingIntent)
    
  8. setPriority(int)

    设置优先级

    优先级 用户
    MAX 重要而紧急的通知,通知用户这个事件是时间上紧迫的或者需要立即处理的
    HIGH 高优先级用于重要的通信内容,例如短消息或者聊天,这些都是对用户来说比较有兴趣的
    DEFAULT 默认优先级用于没有特殊优先级分类的通知
    LOW 低优先级可以通知用户但又不是很紧急的事件
    MIN 用于后台消息 (例如天气或者位置信息)。最低优先级通知将只在状态栏显示图标,只有用户下拉通知抽屉才能看到内容

    对应属性:Notification.PRIORITY_HIGH

最常见的 Notification

下面我们就来创建一个最常见的 通知


  1. 创建一个 空的 Android 项目 cn.twle.android.Notification

    在 API 版本选择界面选择 (API16 Android 4.1+)

  2. 下载 /static/i/android/app_icon.zip 解压并把所有目录和文件拖到 res 目录下覆盖原目录

  3. 修改 activity_main.xml 添加两个按钮

    <?xml version="1.0" encoding="utf-8" ?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <Button 
            android:id="@+id/btn_pop_no" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"
            android:text="弹出通知" />
    
        <Button 
            android:id="@+id/btn_clear_no" 
            android:layout_width="wrap_content" 
            android:layout_height="wrap_content"
            android:text="清除通知" />
    
    </LinearLayout>
    
  4. res/layout 目录下创建一个点击通知弹出的界面布局 notify_detail.xml

    很简单的一个布局,就是一个文本框 TextView

    <?xml version="1.0" encoding="utf-8" ?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >
    
        <TextView 
            android:id="@+id/notify_detail" 
            android:layout_width="match_parent" 
            android:layout_height="wrap_content"
            android:text="这是通知详情页" />
    
    </LinearLayout>
    
  5. MainActivity.java 同一个目录下创建一个通知详情页的 NotifyDetailActivity.java

    package cn.twle.android.notification;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    
    public class NotifyDetailActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.notify_detail);
        }
    }
    

    没啥好说,代码都简单到极点了

  6. 然后修改 AndroidManifest.xml 注册 NotifyDetailActivity

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="cn.twle.android.notification">
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
            <activity android:name=".NotifyDetailActivity" />
        </application>
    
    </manifest>
    
  7. 修改 MainActivity.java

    package cn.twle.android.notification;
    
    import android.app.Notification;
    import android.app.NotificationManager;
    import android.app.PendingIntent;
    import android.content.Context;
    import android.content.Intent;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.net.Uri;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    
    public class MainActivity extends AppCompatActivity implements View.OnClickListener {
    
        private Context mContext;
        private NotificationManager mNManager;
        private Notification notify1;
        Bitmap LargeBitmap = null;
        private static final int NOTIFYID_1 = 1;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            mContext = MainActivity.this;
    
            //创建大图标的 Bitmap
            LargeBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.app_icon_128x128);
            mNManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    
            Button btn_pop_no = (Button) findViewById(R.id.btn_pop_no);
            Button btn_clear_no = (Button) findViewById(R.id.btn_clear_no);
    
            btn_pop_no.setOnClickListener(this);
            btn_clear_no.setOnClickListener(this);
        }
    
        @Override
        public void onClick(View v) {
            switch (v.getId()) {
                case R.id.btn_pop_no:
    
                    //定义一个 PendingIntent 点击 Notification 后启动一个 Activity
    
                    Intent it = new Intent(mContext, NotifyDetailActivity.class);
    
                    PendingIntent pit = PendingIntent.getActivity(mContext, 0, it, 0);
    
                    //设置图片,通知标题,发送时间,提示方式等属性
    
                    Notification.Builder mBuilder = new Notification.Builder(this);
    
                    //标题
                    mBuilder.setContentTitle("简单教程")
                            .setContentText("Android 基础教程上线啦")        // 内容
                            .setSubText("简单教程,简单编程")                 // 内容下面的一小段文字
                            .setTicker("简单教程上线啦.......")              // 收到信息后状态栏显示的文字信息
                            .setWhen(System.currentTimeMillis())           // 设置通知时间
                            .setSmallIcon(R.drawable.app_icon_32x32)       // 设置小图标
                            .setLargeIcon(LargeBitmap)                     // 设置大图标
                            .setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_VIBRATE)    //设置默认的三色灯与振动器
    
                            .setSound(Uri.parse("android.resource://" + getPackageName() + "/" + R.raw.sms))  //设置自定义的提示音
    
                            .setAutoCancel(true)                           //设置点击后取消Notification
    
                            .setContentIntent(pit);                        //设置PendingIntent
    
                    notify1 = mBuilder.build();
    
                    mNManager.notify(NOTIFYID_1, notify1);
                    break;
    
                case R.id.btn_clear_no:
    
                    //除了可以根据 ID 来取消 Notification外,还可以调用 ·cancelAll();关闭该应用产生的所有通知
    
                    //取消Notification
    
                    mNManager.cancel(NOTIFYID_1);
    
                    break;
    
            }
        }
    }
    

参考文档

  1. 设计思想Notifications in Android 4.4 and Lower

  2. 译文通知

  3. API文档Notification

  4. Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)

  5. Notification.Builder 官方 API 文档

Android 基础教程

关于   |   FAQ   |   我们的愿景   |   广告投放   |  博客

  简单教程,简单编程 - IT 入门首选站

Copyright © 2013-2022 简单教程 twle.cn All Rights Reserved.