文章目录
一、通知渠道
1、什么是通知渠道
- Android 8.0 开始引入了通知渠道的概念
- 每条通知都要属于一个对应通知渠道
- 每个应用都可以创建自己的通知渠道,但控制权在用户手上
- 用户可以自由选择通知渠道的重要程度,以及关闭通知渠道
- 通知渠道一经创建就不能再修改
以咸鱼为例,图中所示的就是咸鱼拥有的通知渠道。可以自由选择接收哪些渠道的通知。
![](https://i-blog.csdnimg.cn/blog_migrate/283805bfc6b45914a33033ef817da4a9.png#pic_center)
2、创建通知渠道
(1)获取 NotificationManager
对通知进行管理
// Context.getSystemService(),该方法接收一个字符串参数用于确定获取系统的哪个服务。
NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
(2)创建通知渠道
- 第一步,
构建
通知渠道,传入三个参数
/**
+ 1、 构建通知渠道,传入三个参数
+ param channelId 渠道 Id,全局唯一即可
+ param channelName 渠道名称,显示给用户,需要清楚表达渠道的用途
+ param importance 通知的重要等级,不同的通知等级决定通知的不同行为,
+ 从高到底主要有 IMPORTANCE_HIGH、IMPORTANCE_DEFAULT、IMPORTANCE_LOW、IMPORTANCE_MIN这几种
+ 当然这里只是初始状态下的重要等级,用户可以随时手动更改某个通知渠道的重要等级,开发者是无法干预的。
*/
NotificationChannel notificationChannel =
new NotificationChannel(channelId, channelName, importance);
- 第二步,使用
NotificationManager 创建
通知渠道,传入第一步构建的渠道
// 2、创建通知渠道,传入第一步构建的渠道
manager.createNotificationChannel(notificationChannel);
- 由于上述两个方法都是 Andorid 8.0 中新增的,因此使用这两个方法时应该进行版本判断,所以应该写成如下形式。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
/**
* 1、 构建通知渠道,传入三个参数
* param channelId 渠道 Id,全局唯一即可
* param channelName 渠道名称,显示给用户,需要清楚表达渠道的用途
* param importance 通知的重要等级,不同的通知等级决定通知的不同行为,
* 从高到底主要有 IMPORTANCE_HIGH、IMPORTANCE_DEFAULT、IMPORTANCE_LOW、IMPORTANCE_MIN这几种,
* 当然这里只是初始状态下的重要等级,用户可以随时手动更改某个通知渠道的重要等级,开发者是无法干预的。
*/
NotificationChannel notificationChannel
= new NotificationChannel(channelId, channelName, importance);
// 2、创建通知渠道,传入第一步构建的渠道
manager.createNotificationChannel(notificationChannel);
}
二、使用通知
1、创建的位置
Activity
BroadcastReceiver
Service
在 Activity 中创建的场景比较少,因为一般只有程序进入后台的时候才需要使用通知,但是创建通知整体步骤相同。
2、创建通知的步骤
(1)使用 Builder
构造器来创建Notification
对象
为了保证即使 Android 的版本变化了,原先的 API 也能正常工作,所以我们使用 AndroidX 库中提供的兼容 API,保证我们的程序在不同的版本上都能正常工作。
/**
* 调用 AndroidX 中的兼容 API 方法,NotificationCompat.Builder()
* param context
* param channelId 渠道Id,需要和我们创建的渠道 Id 相匹配
*/
Notification notification =
new NotificationCompat.Builder(context, channelId);
// 上述对象在调用最终的 build() 方法之前可以连缀任意多的设置方法来创建一个丰富的 Notification 对象
Notification notification =
new NotificationCompat.Builder(context, channelId)
// 指定通知的标题内容,下拉状态栏显示
.setContentTitle("This is content title")
// 指定通知的正文内容,下拉状态栏显示
.setContentText("This is content text")
// 设置通知的小图标,显示在状态栏上,只能使用纯 alpha 图层的图片
.setSmallIcon(R.drawable.small_icon)
// 设置通知的大图标,下拉状态栏显示
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.large_icon))
.build();
(2)调用 NotificationManager
的 notify()
方法
/**
* 调用 NotificationManager 的 notify() 方法就可以让通知显示出来了
* param 参数 Id, 保证每个通知的 Id 都是不同的
* param Notification 对象
*/
manager.notify(1, notification);
3、代码示例
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private NotificationManager mNotificationManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 1、创建通知管理器
mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// 2、创建通知渠道
// 创建通知渠道的代码只有在第一次执行的时候会创建,当下次在执行创建代码时,
// 系统会检测到该通知渠道已经存在,因此不会重复创建,不会影响运行效率。
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel channel = new NotificationChannel("normal", "Normal", NotificationManager.IMPORTANCE_DEFAULT);
mNotificationManager.createNotificationChannel