Android8.0系统通知栏的每条通知都有一个对应的渠道,用户可以选择是否要关闭哪个渠道的通知。下面这张图就有两个通知渠道,由用户自由选择是否关闭哪一条渠道的通知,就能避免一些垃圾推送消息的打扰。
如果将项目中的SDK版本指定到了26或者更高,还不进行通知栏的适配,那么就会报错或无法将通知显示出来。
创建一个通知渠道要有ID、名称和等级这三个参数
有四个等级,由高到低:
IMPORTANCE_HIGH: 会弹出,有提示音,状态栏有显示
IMPORTANCE_DEFAULT:不会弹出,有提示音,状态栏有显示
IMPORTANCE_LOW :不会弹出,无提示音,状态栏有显示
IMPORTANCE_MIN :不会弹出,无提示音,状态栏无显示
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private Button btn_sms_notify;
//渠道ID
private static final String channel_Id_sms = "sms";
private static final String channel_Id_express = "express";
//渠道名称
private static final String channel_Name_sms = "短信消息";
private static final String channel_Name_express = "快递消息";
//渠道等级
private static final int importance_sms = NotificationManager.IMPORTANCE_HIGH;
private static final int importance_express = NotificationManager.IMPORTANCE_DEFAULT;
private Button btn_express_notify;
private NotificationManager express_notificationManager;
private NotificationManager sms_notificationManager;
private NotificationManager manager;
private NotificationChannel channel;
private Notification express_notification;
private android.app.Notification sms_notification;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//判断SDK版本
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
/*调用createNotificationChannel()方法,传入id,名字,等级参数*/
createNotificationChannel(channel_Id_sms, channel_Name_sms, importance_sms);
createNotificationChannel(channel_Id_express, channel_Name_express, importance_express);
}
initView();//视图初始化
}
/*创建一个通知渠道需要渠道ID、名称以及等级这三个参数*/
@RequiresApi(api = Build.VERSION_CODES.O)
private void createNotificationChannel(String channel_id, String channel_name, int importance) {
channel = new NotificationChannel(channel_id, channel_name, importance);
manager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
manager.createNotificationChannel(channel);
}
private void initView() {
btn_sms_notify = findViewById(R.id.btn_sms_notify);
btn_sms_notify.setOnClickListener(this);
btn_express_notify = findViewById(R.id.btn_express_notify);
btn_express_notify.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_sms_notify:
//要跳转的意图
Intent intent = new Intent(this, com.example.lin.notificationmanager.Notification.class);
PendingIntent pi = PendingIntent.getActivity(this, 0, intent, 0);
sms_notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
//构建通知对象需传入上下文和通知渠道ID
sms_notification = new NotificationCompat.Builder(this, "sms")
//标题
.setContentTitle("短信信息")
//内容
.setContentText("有一条新短信。")
//自动取消
.setAutoCancel(true)
//小图标
.setSmallIcon(R.mipmap.ic_launcher)
//系统时间
.setWhen(System.currentTimeMillis())
//大图标
.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher))
//要跳转的意图
.setContentIntent(pi)
//处于锁屏状态时LED灯一闪一暗
.setLights(Color.GREEN, 1000, 1000)
//震动200Ms
// VISIBILITY_PUBLIC没有锁屏时会显示通知
// VISIBILITY_PRIVATE任何情况都会显示通知
// VISIBILITY_SECRET在安全锁和没有锁屏的情况下显示通知
.setVisibility(Notification.VISIBILITY_PUBLIC)
.setVibrate(new long[]{0, 200})
//设置横幅通知栏,需开启通知横幅提醒权限
.setPriority(NotificationCompat.PRIORITY_MAX)
/* 显示很长的文字
.setStyle(new NotificationCompat.BigTextStyle().bigText())*/
.build();
//发送通知
sms_notificationManager.notify(1, sms_notification);
break;
case R.id.btn_express_notify:
express_notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
express_notification = new NotificationCompat.Builder(this, "express")
.setContentTitle("快递信息")
.setContentText("快递到了,快去取吧。")
.setSmallIcon(R.mipmap.ic_launcher)
.build();
express_notificationManager.notify(2, express_notification);
break;
}
}
}