Android学习笔记之Notification

一、通知的基本用法

1.获取通知管理器

NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

2.创建通知渠道(NotificationChannel) 如果是8.0以上系统的话

因为NotificationChannel是8.0的新特性,因此在创建通知渠道之前需要确保当前手机版本是大于8.0的

if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
    initChannels();
}

然后通过调用自定义方法createNotificationChannel()创建了两个渠道

@TargetApi(Build.VERSION_CODES.O)
private void initChannels(){
    String channelId = "chat";
    String channelName = "聊天消息";
    int importance = NotificationManager.IMPORTANCE_HIGH;
    createNotificationChannel(channelId,channelName,importance);
    channelId = "subscribe";
    channelName = "订阅消息";
    importance = NotificationManager.IMPORTANCE_DEFAULT;
    createNotificationChannel(channelId,channelName,importance);
}

自定义的createNotificationCannel()方法接收三个参数,分别是:渠道ID,渠道名称,重要程度。其中渠道ID可以随便定义,只要保证全局唯一性就可以。渠道名称是给用户看的,需要能够表达清楚这个渠道的用途。重要等级的不同则会决定通知的不同行为。

@TargetApi(Build.VERSION_CODES.O)
private void createNotificationChannel(String channelId,String channelName,int importance){
    NotificationChannel channel = new NotificationChannel(channelId,channelName,importance);
    notificationManager.createNotificationChannel(channel);
}

3.创建一条通知

Notification notification = new NotificationCompat.Builder(this,"chat")
        .setContentTitle("聊天标题")
        .setContentText("聊天内容")
        .setWhen(System.currentTimeMillis())
        .setSmallIcon(R.drawable.ic_launcher_round)
        .setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher_round))
        .setAutoCancel(true)
        .build();

其中Builder的构造器接收两个参数,第一个参数为Context,第二个参数为渠道ID。setSmallIcon()方法用于设置通知的小图标,注意只能使用纯alpha图层的图片进行设置,小图标会显示在系统状态栏上。setLargeIcon()方法用于设置通知的大图标,当下拉系统状态栏时,就可以看见设置的大图标了。setAutoCancel()方法可以让我们点击该通知后自动取消。

4.最后发送通知

notificationManager.notify(1,notification);

其中第一个参数是ID,要保证每个通知所指定的ID都是不同的。

二、通知的点击跳转

1.使用PendingIntent进行跳转,先获取PendingIntent的实例

Intent intent = new Intent(this,NotificationActivity.class);
PendingIntent pi = PendingIntent.getActivity(this,0,intent,0);

这里获取PendingIntent实例的方法不只getActivity()一种,还有getBroadcast()和getService()。从名字上也可以看出,它们的区别在于跳转的结果不一样:分别跳转到活动,广播和服务。获取实例的静态方法接收的四个参数分别是:Context,请求码,Intent,Flag。(有关参数的讲解我单独写到下一篇文章中)

2.在Notification的构造器中setContentIntent

.setContentIntent(pi)

PS:如果没有设置ContentIntent的话,之前设置的自动取消(setAutoCancel(true))方法会失效。

三、通知的进阶技巧

1.设置提示音

.setSound(Uri.fromFile(new File("/system/media/audio/ringtones/World.ogg")))

2.设置振动提醒

.setVibrate(new long[]{0,1000,0,1000})

下标为0的值表示静止时长,下标为1的值表示手机振动时长,下标为2的值又表示静止时长,以此类推。

PS:手机振动需要在AndroidManifest.xml文件中配置权限

<uses-permission android:name="android.permission.VIBRATE"/>

3.设置手机前置LED灯闪烁
 

.setLights(Color.GREEN,1000,1000)

其中第一个参数为LED灯的颜色,第二个参数为LED灯亮起的时长,以毫秒为单位,第三个参数为LED灯暗去的时长,以毫秒为单位。

4.通用默认设置

.setDefaults(NotificationCompat.DEFAULT_ALL)

5.设置长文本内容

.setStyle(new NotificationCompat.BigTextStyle().bigText("Learn how to build notifications,send and sync data,and use voice actions." +
        "Get the official Android IDE and developer tools to build apps for Android."))

6.设置大图片

.setStyle(new NotificationCompat.BigPictureStyle().bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.big_image)))

7.设置通知的重要程度

.setPriority(NotificationCompat.PRIORITY_MAX)

该方法一共有5个常量值可选:

PRIORITY_DEFAULT表示默认的重要程度,和不设置效果一样;

PRIORITY_MIN表示最低重要程度,系统可能只会在特定场景下才显示这条通知,比如下拉状态栏的时候;

PRIORITY_LOW表示较低重要程度,系统可能会将这类通知缩小,或者改变其显示的顺序,将其排在后面;

PRIORITY_HIGH表示较高重要程度,系统可能会将这类通知放大,或者改变其显示的顺序,将其排在前面;

PRIORITY_MAX表示最高重要程度,系统会让用户立刻看到。(横幅)

四、关于通知渠道的补充

前面只提及了通知渠道的创建,关于通知渠道其实我们还可以读取它们的状态。

1.获取某个通知渠道

NotificationChannel chatChannel = notificationManager.getNotificationChannel("chat");

这里接收的参数即为channelId,也就是我们创建通知渠道时传入的第一个参数。

2.读取通知渠道的状态

读取状态十分简单,通常都是get方法,比如读取ID值:

chatChannel.getId();

读取渠道名称:

chatChannel.getName();

读取重要程度:

chatChannel.getImportance();

五、显示未读角标

1.在创建通知渠道时,调用了NotificationChannel的setShowBadge(true)方法

@TargetApi(Build.VERSION_CODES.O)
private void createNotificationChannel(String channelId,String channelName,int importance){
    NotificationChannel channel = new NotificationChannel(channelId,channelName,importance);
    channel.setShowBadge(true);
    notificationManager.createNotificationChannel(channel);
}

2.在创建通知时,调用了setNumber()方法,并传入未读消息的数量

.setNumber(2)

PS:即使我们没有调用setShowBadge(true)方法,Android系统默认也是会显示角标的,但是如果你想禁用角标功能,那么记得一定要调用setShowBadge(false)方法。

猜你喜欢

转载自blog.csdn.net/Ein3614/article/details/81633107