通知是安卓里很常见的东西。当一条微信或者QQ消息到来,或者某些软件推送推广消息时,显示在系统通知栏里的一条条通知就是我们所说的这个通知。那么在安卓里应该如何创建一个通知呢?
## 创建一个通知
#### 获取通知服务
要创建一个通知,首先需要一个NotificationManager来对通知进行管理。这个是一个系统服务,所以我们可以通过
```java
Notification manager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
```
获取到一个NotificationManager
#### 创建通知
接下来我们需要构造一个Notification对象,在其中添加我们的通知信息,最后将其发布。
但是在Android迭代的多个版本中,每个版本或多或少都会对通知这一部分进行更改。API的不稳定性在通知模块上面凸显地尤为严重
所以support库中土工了一个NotificationCompat类,使用这个类的构造器(其中的一个Builder方法,不是类的构造器)可以创建一个在所有Android系统版本上都能正常工作的Notification了
下面是如何创建一个Notification的代码
```java
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
// Builder(Context)在9.0上已经被启用,取而代之的是Builder(Context, String)方法。后面的String方法通过查询资料发现是用于通知分类的,但是按照网上的说法填入"default"在创建通知时出错,待解决
Notification notification = new NotificationCompat.Builder(this).setContentTitle("This is content title").setContentText("This is content text").setWhen(System.currentTimeMillis()).setSmallIcon(R.mipmap.ic_launcher).setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher)).build();
notificationManager.notify(1, notification);
```
这里面的方法的作用已经非常明显了。这里只说明一下个别方法的具体作用:
+ setSmallIcon():设置显示在通知栏上的小图标。注意,如果不去设置setAutoCancel()的话,小图标是需要在代码中进行取消显示的
+ setLargeIcon():设置通知正文内的大图标
+ setWhen():设置通知创建时间。创建时间会显示在相应的通知上面。
最后,调用
```java
manager.notify(1, notification)
```
进行通知发布
#### 设置通知点击事件
上面的代码可以成功创建一个基础的通知,但是用户在点击这个通知的时候程序并不能对其有所反应。这时候我们就需要`PandingIntent`来对点击进行响应。`PandingIntent`和`Intent`很像,都是是去指明一个“意图”。只不过它更加倾向于在某个合适的时候执行某个动作。可以简单地吧`PendingIntent`理解为延迟执行的`Intent`
修改上述代码为如下代码,即可相应用户点击操作
```java
Intent intent = new Intent(this, NotificationActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification notification = new NotificationCompat.Builder(this, "1").setContentTitle("This is content title").setContentText("This is content text").setWhen(System.currentTimeMillis()).setSmallIcon(R.mipmap.ic_launcher).setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.ic_launcher)).setContentIntent(pendingIntent).setAutoCancel(true).build();
notificationManager.notify(1, notification);
```
#### 通知的其他进阶特性
##### 1. 设置通知声音
很多时候,在消息到来时我们需要发出声音去提醒用户。
```java
Notification notification = new NotificationCompat.Builder(this)
...
.setSount(Uri.fromFile(new File("/system/media/audio/ringtones/Luna.ogg")))
.build();
```
##### 2. 设置通知震动
```java
Notification notification = new NotificationCompat.Builder(this)
...
.setVibrate(new long[] {0, 1000, 1000, 1000})
.build();
```
其中,数组下标为0与双数的元素代表手机振动的时长,单数表示静止的时长。以ms为单位。
除此之外,震动需要声明权限
```xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.csc.notificationtest">
...
<use-permission android:name="android.permission.VIBRATE" />
...
</manifest>
```
##### 3. 设置通知LED灯
有些手机会在前面板设置一个LED等,我们可以为通知设置LED灯
```java
Notification notification = new NotificationCompat.Builder(this)
...
.setLights(Color.GREEN, 1000, 1000)
.build();
```
第一个参数为LED灯的颜色,第二个参数为指定LED灯亮起的时长,毫秒为单位,第三个参数用于指定LED等暗去的时长,毫秒为单位。
##### 4. 设置系统默认通知效果
```java
Notification notification = new NotificationCompat.Builder(this)
...
.setDefault(NotificationCompat.DEAULT.ALL)
.build();
```
##### 5. 设置通知优先级别
```java
Notification notification = new NotificationCompat.Builder(this)
...
.setPriority(NotificationCompat.PRIORITY_MAX)
.build();
```
可以设置通知的优先级别。通知的优先级别如下:
+ PRIORITY_MIN:最低级别,系统可能只会在特定的场景才显示这条通知,比如用户下拉状态栏时
+ PRIORITY_LOW:较低级别,系统可能会将这类通知缩小,或改变其显示顺序将其向后排序
+ PRIORITY_HIGH:较高级别,系统可能会放大这类通知,或者改变其显示顺序将其向前排序
+ PRIORITY_MAX:最高级别,这类通知会让用户立即看到(弹窗),甚至需要用户做出响应动作
+
【学习】Android中Notification的使用笔记