1. 序言
当某个应用程序希望想用户发出一些提示信息,而该应用程序又不在前台运行时,就可以借助通知来实现。发出一条通知,手机最上方的状态栏中会显示一个通知的图标,下拉状态栏后可以看到通知的详细内容。通知栏和抽屉式通知栏均是由系统控制,用户可以随时查看。
通知的用法比较灵活,既可以在服务中创建,又可以在广播里创建。
Notification的类型
主要有以下几种:
-
状态栏和抽屉式通知栏
发出通知后,通知先以图标的形式显示在状态栏中
之后用户在状态栏向下滑动打开抽屉式通知栏,并在其中查看更多详情及对通知执行操作。
-
提醒式通知
从 Android 5.0 开始,通知可以短暂地显示在浮动窗口中,称之为提醒式通知。这种行为通常适用于用户应立即知晓的重要通知,而且仅在设备未锁定时才显示。
提醒式通知会在应用发出通知后立即出现,稍后便会消失,但仍照常显示在抽屉式通知栏中。 -
锁定屏幕
从 Android 5.0 开始,通知可以显示在锁定屏幕上。
您可以程序化地设置您的应用在安全锁定屏幕上所发布通知的详情可见等级,甚至可以设置通知是否显示在锁定屏幕上
-
应用图标标志
在所支持的设备(搭载 Android 8.0(API 级别 26)及更高版本)启动器中,应用图标通过在相应的应用启动器图标上显示彩色“标志”(又称“通知圆点”)来表示有新通知。
用户可以长按应用图标以查看该应用的通知。然后,用户可以关闭通知或者在长按菜单中对通知执行操作(类似于抽屉式通知栏)
通知的常见用途: -
显示接收的短消息,及时消息等信息(如QQ,微信、新浪、短信等)
-
显示客户端的推送消息,如广告,优惠,版本更新。常见的第三方SDK有:JPush、个推、信鸽、阿里云推送等
-
显示正在进行的事物,如后台运行的程序,如音乐播放,下载进度等。
2. Notification基本使用
这里涉及到的Notification相关使用都是在Android8.0(api 26)之前的,关于Notification在Android8.0 之后的适配后续详细讲述
通知栏主要涉及到两个类:Notification
和 NotificationManager
Notification
为通知信息类,里面对应了通知栏的各个属性NotificationManager
:是状态栏通知的管理类,负责发通知,清除通知等操作。
2.1 创建通知
通知的设计由系统模板决定,您的应用只需要定义模板中各个部分的内容即可。通知的部分详情仅在展开后视图中显示。
- 小图标:必须提供,通过
setSmallIcon()
进行设置。 - 应用名称:由系统提供。
- 时间戳:由系统提供,但您可以通过
setWhen()
将其替换掉或者通过setShowWhen(false)
将其隐藏。 - 大图标:可选内容(通常仅用于联系人照片,请勿将其用于应用图标),通过
setLargeIcon()
进行设置。 - 标题:可选内容,通过
setContentTitle()
进行设置。 - 文本:可选内容,通过
setContentText()
进行设置。
Notification创建前必须要添加的属性:
- 小图标,通过
setSmallcom()
设置 - 标题,通过
setContentTitle()
设置 - 内容,通过
setContentText()
设置
通知栏的创建主要涉及到Notification.Builder
、Notification
和 NotificationManager
,其中Notification.Builder
作用是使用建造者模式构建Notification对象
基本使用步骤如下:
-
创建
NotificationManager
首先需要一个NotificationManager
来对通知进行管理,可以调用Context的getSystemService()
获取到。该方法接收一个字符串参数用于确定获取系统的哪个服务。 -
创建通知栏的Builder构造类:
Notification.Builder
,使用的是建造者模式,创建Notification对象,这里可以在终极build()
之前连缀任意多的设置方法来创建一个丰富的Notification对象。
public class MainActivity extends AppCompatActivity {
private TextView mSendNotifi;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mSendNotifi = (TextView) findViewById(R.id.send_notifi);
mSendNotifi.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendNotification();
}
});
}
private void sendNotification() {
int id = 1;
Drawable drawable = ContextCompat.getDrawable(this, R.drawable.btn_audio_next_normal);
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
/* 创建通知栏的Builder构造类 */
Notification.Builder mBuilder = new Notification.Builder(this);
//设置小图标
mBuilder.setSmallIcon(R.drawable.ic_launcher_background);
//设置大图标
mBuilder.setLargeIcon(bitmap);
//设置标题
mBuilder.setContentTitle("这是标题");
//设置通知正文
mBuilder.setContentText("这是正文,当前ID是:" + id);
//设置摘要
mBuilder.setSubTex