# Android11-通知的使用

1.使用通知

1.1 创建一个通知

  • 第一步:获得NotificationManager对象来对通知进行管理。

    可以调用Context的getSystemService()方法获取。该方法接收一个字符串参数,用于确定获取哪个系统服务,获取通知传入Context.NOTIFICATION_SERVICE

    • 代码如下:
     //创建一个NotificationManager对象
     NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
    
  • 第二步:创建一个Notification对象

使用一个Builder构造器来创建一个Notification对象。

//创建Notification
 Notification notification = new NotificationCompat.Builder(MainActivity.this)
         .setContentTitle("这是通知内容标题")
         .setContentText("正式通知内容")
         .setWhen(System.currentTimeMillis())
         .setSmallIcon(R.mipmap.ic_launcher)
         .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
         .build();
  • 第三步:显示通知

    调用NotificationManager的notify()方法可以让通知显示出来,该方法接收两个参数,第一个是id,保证每个通知指定的id都是不同的,第二个是要显示的Notification对象

manager.notify(1, notification);
  • 完整代码如下
sendNotice = (Button) findViewById(R.id.send_notification);
       sendNotice.setOnClickListener(new View.OnClickListener() {
           @Override
           public void onClick(View v) {
               //获得NotificationManager对象
               NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
               //创建Notification
               Notification notification = new NotificationCompat.Builder(MainActivity.this)
                       .setContentTitle("这是通知内容标题")
                       .setContentText("正式通知内容")
                       .setWhen(System.currentTimeMillis())
                       .setSmallIcon(R.mipmap.ic_launcher)
                       .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
                       .build();
               //发送通知
               manager.notify(1, notification);
           }
       });

1.2实现通知的点击功能

使用PendingIntent可以实现这一功能。PendingIntent和Intent类似,但是PendingIntent更加倾向于在某个合适的时机去执行某个某个动作,而Intent更加倾向于立即执行某个动作。

1.2.1PendingIntent的用法

  • PendingIntent提供了几个静态方法用于获取PendingIntent的实例:getActivity()getBroadcast()getService()
  • 这几个静态方法接受的参数都是相同的:
- 第一个是Context

- 第二个一般用不到,通常传0即可。

- 第三个是一个Intent对象

- 第四个是用于确定PendingIntent的行为 
  • 完整代码如下
//初始化Intent
Intent intent = new Intent(MainActivity.this, NotificationActivity.class);
//使用Intent获得PendingIntent对象
PendingIntent pi = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification notification = new NotificationCompat.Builder(MainActivity.this)
   .setContentTitle("这是通知内容标题")
   .setContentText("正式通知内容")
   .setWhen(System.currentTimeMillis())
   .setSmallIcon(R.mipmap.ic_launcher)
   .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
   //设置PendingIntent
   .setContentIntent(pi)
   .build();
//显示通知
manager.notify(1,notification);
}

1.3实现点击通知之后删除通知的功能
实现这个功能有两种方法,

  • 第一种是在实例化notification时setAutoCancel传入true。
Notification notification = new NotificationCompat.Builder(MainActivity.this)
.setContentTitle("这是通知内容标题")
.setContentText("正式通知内容")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
//设置PendingIntent
.setContentIntent(pi)
//设置点击通知时删除通知
.setAutoCancel(true)
.build();
  • 第二种是显示的调用NotificationManager的cancel()方法将它取消,这个方法接收通知的id用于指定取消哪个通知
//获得NotificationManager对象
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//取消id为1的通知
manager.cancel(1);

2.通知的高级功能

2.1通知发出时播放音频
使用setSound()方法,接收一个Uri参数,指定通知发出时要播放的音频

Notification notification = new NotificationCompat.Builder(MainActivity.this)
.setContentTitle("这是通知内容标题")
.setContentText("正式通知内容")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
//设置PendingIntent
.setContentIntent(pi)
//设置点击通知时删除通知
.setAutoCancel(true)
//播放音频
.setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Luna.ogg")))
.build();

2.2通知发出时手机振动

使用setVibrate()方法,接收一个virbrate参数,它是一个长整型数组,用于设置手机静止和振动的时长。下标为0的值表示手机静止的时长,下标为1的值表示手机振动时长,下标为2的值表示手机静止的时长。

Notification notification = new NotificationCompat.Builder(MainActivity.this)
.setContentTitle("这是通知内容标题")
.setContentText("正式通知内容")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
//设置PendingIntent
.setContentIntent(pi)
//设置点击通知时删除通知
.setAutoCancel(true)
//播放音频
.setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Luna.ogg")))
//设置手机接收到通知时立刻振动1秒,静止1秒,再振动一秒
.setVibrate(new long[] {0, 1000, 1000, 1000})
.build();

注意:使用手机的震动功能还需在AndroidManifest.xml文件中添加权限声明

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.anwser_mac.notificationtest">
    //声明权限
    <uses-permission android:name="android.permission.VIBRATE"/>

2.3 实现通知未读时LED灯闪烁

Notification notification = new NotificationCompat.Builder(MainActivity.this)
    .setContentTitle("这是通知内容标题")
    .setContentText("正式通知内容")
    .setWhen(System.currentTimeMillis())
    .setSmallIcon(R.mipmap.ic_launcher)
    .setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
    //设置PendingIntent
    .setContentIntent(pi)
    //设置点击通知时删除通知
    .setAutoCancel(true)
    //播放音频
    .setSound(Uri.fromFile(new File("/system/media/audio/ringtones/Luna.ogg")))
    //设置手机接收到通知时立刻振动1秒,静止1秒,再振动一秒
    .setVibrate(new long[] {0, 1000, 1000, 1000})
    //设置LED灯,绿色闪烁
    .setLights(Color.GREEN, 1000, 1000)
    .build();
  • 注:如果不想进行这么繁杂设置,可以直接使用通知的默认效果,它会根据手机环境来决定播放什么铃声,及如何振动等

    Notification notification = new NotificationCompat.Builder(this)
    .setDefaults(NotificationCompat.DEFAULT_ALL)
    .build();
    

2.4设置通知显示长文本内容,超出范围自动换行
在setStyle方法中创建一个NotificationCompat.BigTextStyle对象,然后调用该对象的bigText方法

    .setStyle(new NotificationCompat.BigTextStyle().bigText("hhhhhhhhhhhhhhhhhhhhhhhhhhhhzheshi 一段很长长的文本"))

2.5设置通知显示一张大图

具体用法跟2.4类似,但是这次创建的是一个NotificationCompat.BitPictureStyle对象。

.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher_round)))

2.6设置通知的重要程度
调用setPriority()方法来设置通知的重要程度,分为5歌级别

  1. PRIORITY_DEFAULT : 表示默认程度,和不设置的效果一样。
  2. PRIORITY_MIN :最低的重要程度,系统可能只会在特定的场景才会显示这条通知,比如用户下拉状态栏的时候。
  3. PRIORITY_LOW : 较低的重要程度,系统可能会降这类通知缩小,或改变其显示的顺序
  4. PRIORITY_HIGHT : 较高的重要程度,系统可能会将这类通知放大,或改变其显示的顺序,将其排在比较靠前的位置。
  5. PRIORITY_MAX : 最高的重要程度,这类通知消息必须要让用户立即看到,甚至需要用户做出相应操作。
  • 具体写法如下:
setPriority(NotificationCompat.PRIORITY_MAX)
2017-04-13_11-58-07.gif

推荐阅读更多精彩内容