Android Notification 状态栏通知
Notification ( 状态栏通知 ) 估计是最常见的,比微信还常见,在现在的智能机从屏幕顶部往下滑,看到的比比皆是
我们先来看看状态栏通知的基本组成
Notification 的基本布局
组成元素 | 说明 |
---|---|
Icon/Photo | 大图标 |
Title/Name | 标题 |
Message | 内容信息 |
Timestamp | 通知时间,默认是发出通知的时间,可以通过 setWhen() 设置 |
Secondary Icon | 小图标 |
内容文字 | 在小图标的左手边的一个文字 |
这个布局是我们最常见的,当然还有一些其它布局,不过都是在最基础的布局上扩展而来饿
扩展布局
我们可以通过扩展布局显示消息的前几行或者图片的预览
这样用户可以看多更多的内容 - 有时甚至可以看到整个消息
用户可以通过 pinch-zoom
或者双手指滑动来打开扩展布局
Android 为单条消息提供了两种扩展布局 (文字和图像) 供你开发应用时使用
Notification ( 状态栏通知 )
状态通知栏主要涉及到2个类 Notification
和 NotificationManager
类 | 说明 |
---|---|
Notification | 通知信息类,它里面对应了通知栏的各个属性 |
NotificationManager | 是状态栏通知的管理类,负责发通知、清除通知等操作 |
使用的基本流程
-
获得
NotificationManager
对象NotificationManager mNManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
-
创建一个通知栏的
Builder
构造类Notification.Builder mBuilder = new Notification.Builder(this);
-
对
mBuilde
r 进行相关的设置,比如标题,内容,图标,动作等 -
调用
mBuilder.build()
方法为 notification 赋值 -
调用
NotificationManager.notify()
方法发送通知 -
另外我们还可以调用
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 点击面板后是否让通知取消(默认不取消) |
还可以调用其它方法
-
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"))
获取Android多媒体库内的铃声
.setSound(Uri.withAppendedPath(Audio.Media.INTERNAL_CONTENT_URI, "5"))
-
setOngoing(boolean)
设置为 ture,表示它为一个正在进行的通知
他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)
-
setProgress(int,int,boolean)
设置带进度条的通知
参数依次为:进度条最大数值,当前进度,进度是否不确定
-
如果为确定的进度条:调用
setProgress(max, progress, false)
来设置通知,在更新进度的时候在此发起通知更新progress,并且在下载完成后要移除进度条,通过调用setProgress(0, 0, false)
既可 -
如果为不确定(持续活动)的进度条,这是在处理进度无法准确获知时显示活动正在持续,所以调用
setProgress(0, 0, true)
,操作结束时,调用setProgress(0, 0, false)
并更新通知以移除指示条
-
-
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)
-
setPriority(int)
设置优先级
优先级 用户 MAX 重要而紧急的通知,通知用户这个事件是时间上紧迫的或者需要立即处理的 HIGH 高优先级用于重要的通信内容,例如短消息或者聊天,这些都是对用户来说比较有兴趣的 DEFAULT 默认优先级用于没有特殊优先级分类的通知 LOW 低优先级可以通知用户但又不是很紧急的事件 MIN 用于后台消息 (例如天气或者位置信息)。最低优先级通知将只在状态栏显示图标,只有用户下拉通知抽屉才能看到内容 对应属性:
Notification.PRIORITY_HIGH
最常见的 Notification
下面我们就来创建一个最常见的 通知
-
创建一个 空的 Android 项目
cn.twle.android.Notification
在 API 版本选择界面选择 (API16 Android 4.1+)
-
下载 /static/i/android/app_icon.zip 解压并把所有目录和文件拖到
res
目录下覆盖原目录 -
修改
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>
-
在
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>
-
在
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); } }
没啥好说,代码都简单到极点了
-
然后修改
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>
-
修改
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; } } }