Notification,是一种具有全局效果的通知,可以在系统的通知栏中显示。我们在使用手机的过程中经常可以收到各种类型的app发送通知。通知主要有以下几个作用
下面我介绍下如何在app内发送通知的。大致可以分为以下步骤
我们可以通过Notificaiton.Builder设置各种属性,这里我先创建一个最简易的通知,我们只要设置了小图标、标题、文本内容这3个属性便可以成功创建出Notification(这3个属性缺一不可)。当然我们也可以设置通知显示的效果,如响铃、震动等我们也只需在此进行设置即可,这里就不一一介绍。发送一条简易通知具体代码如下
//获取NotificationManager实例
NotificationManager notifyManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
//通过构建者模式创建Notification,最简易通知只要设置以下3个属性就可以了
NotificationCompat.Builder builder = new NotificationCompat.Builder(this)
.setSmallIcon(R.mipmap.wechat_small)
.setContentTitle("这是最简易通知--我是标题")
.setContentText("只有小图标、标题、内容--我是内容");
//发送通知,第一个参数为Id开发者可以通过Id对通知进行更新和取消
notifyManager.notify(2, builder.build());
我们在使用手机时,有时候下滑通知栏会发现有大量通知,不胜其烦。好在8.0系统后,Google引入了通知渠道这个概念,也就是说在8.0系统上用户可以自主选择关闭或者开启某类通知。如果你的项目的 targetSdkVersion 是在26或更高以上的版本,通过上面方式发送通知在8.0系统的手机上是收不到的,并且会弹出一条吐司提示channel为空,所以我们要进行适配。
对于通知的适配,在8.0系统就是多了个通知渠道(NotificationChannel),也就是说我们只要在发送通知时,创建通知渠道即可,下面就介绍下如何创建。
首先,创建通知渠道前提就是确保我们的项目targetSdkVersion指定在26或以上的版本。
然后我们在代码中进行通知渠道的创建,其代码的位置只要保证在发送通知前调用即可,你可以在application进行创建,这里我是直接在activity中进行创建的。并且创建通知渠道的代码只在第一次执行的时候才会创建,以后每次执行创建代码系统会检测到该通知渠道已经存在了,因此不会重复创建,也并不会影响任何效率。其代码如下
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
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);
}
我们在onCreate方法里面进行手机版本判断,大于等于8.0时则需要创建NotificationChannel,其中createNotificationChannel()方法是进行渠道创建的,代码如下
/**
* 8.0以上手机需要构建通知渠道,才能够打开通知栏
*
* @param channelId 通知栏id
* @param channelName 通知栏名
* @param importance 通知栏级别 例如NotificationManager.IMPORTANCE_HIGH;
*/
@TargetApi(Build.VERSION_CODES.O)
public void createNotificationChannel(String channelId, String channelName, int importance) {
NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
NotificationManager notificationManager = (NotificationManager) getSystemService(
NOTIFICATION_SERVICE);
notificationManager.createNotificationChannel(channel);
}
这里的代码还是非常简单的,我们先new出NotificaitonChannel对象,然后通过manager进行渠道的创建。NotificaitonChannel创建时我们传入3个参数:通知栏ID,名称和级别。这里我们说明下其中第三个参数–重要等级,主要有这几种级别,每种级别对应显示方式不一样。
接着我们就可以发送一条通知其方式跟之前notification的发送是一样的只不过我们在创建notification的时候需要传入通知渠道Id,这里模拟发送了两条不同渠道的通知,分别对应上面创建的渠道,这样我们就完成了8.0系统通知栏的适配。
//发送一条聊天消息
findViewById(R.id.btn_notify_chat).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification notification = new NotificationCompat.Builder(HomeActivity.this, "chat")
.setContentTitle("收到一条聊天消息")
.setContentText("今天中午吃什么?")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
.setAutoCancel(true)
.setDefaults(Notification.FLAG_ONLY_ALERT_ONCE)
.build();
manager.notify(1, notification);
}
});
//发送一条订阅消息
findViewById(R.id.btn_notify_subcri).setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
NotificationManager manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
Notification notification = new NotificationCompat.Builder(HomeActivity.this, "subscribe")
.setContentTitle("收到一条订阅消息")
.setContentText("地铁沿线30万商铺抢购中!")
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
.setAutoCancel(true)
.build();
manager.notify(2, notification);
}
});
最后,经过适配后,8.0系统的用户便可以在设置里面进行通知的管理,关闭了渠道则不会接收到此通知了。如图
这里比较简易的介绍如何适配,更具体的使用和适配可以去官网进行补充。谢谢。
参考:
链接1: https://blog.csdn.net/guolin_blog/article/details/79854070
链接2: https://www.cnblogs.com/travellife/p/Android-Notification-xiang-jie.html