参考:
Android 开发 8.0版本启动Service的方法
Android 通知栏Notification的整合全面学习
Android 8.0 + Service开启方式兼容处理
Android 8.0中各种通知写法汇总
Android–通知之Notification
Android中pendingIntent的深入理解
Android 6.0、7.0、8.0、9.0差异、适配
Android 5.0、6.0、7.0、8.0、9.0 新特性,DownloadManager踩坑记
用户通知级别 | Android8.0及以上 | Android8.0以下 |
---|---|---|
紧急级别(发出通知声音并显示为提示通知) | IMPORTANCE_HIGH | PRIORITY_HIGH或者PRIORITY_MAX |
高级别(发出通知声音并且通知栏有通知) | IMPORTANCE_DEFAULT | PRIORITY_DEFAULT |
中等级别(没有通知声音但通知栏有通知) | IMPORTANCE_LOW | PRIORITY_LOW |
低级别(没有通知声音也不会出现在状态栏上) | IMPORTANCE_MIN | PRIORITY_MIN |
Android 7.1 及以下是使用NotificationCompat.PRIORITY_它们都是定义的常量
public class NotificationCompat {
public static final int PRIORITY_DEFAULT = 0;
public static final int PRIORITY_LOW = -1;
public static final int PRIORITY_MIN = -2;
public static final int PRIORITY_HIGH = 1;
public static final int PRIORITY_MAX = 2;
}
Android O(8.0):如果App的targetSDKVersion>=26,没有设置channel通知渠道的话,就会导致通知无法展示。
public class NotificationManager {
/**
* Oreo不用Priority了,用importance
* IMPORTANCE_NONE 关闭通知
* IMPORTANCE_MIN 开启通知,不会弹出,但没有提示音,状态栏中无显示
* IMPORTANCE_LOW 开启通知,不会弹出,不发出提示音,状态栏中显示
* IMPORTANCE_DEFAULT 开启通知,不会弹出,发出提示音, 状态栏中显示
* IMPORTANCE_HIGH 开启通知,会弹出, 发出提示音, 状态栏中显示
*/
public static final int IMPORTANCE_NONE = 0;
public static final int IMPORTANCE_MIN = 1;
public static final int IMPORTANCE_LOW = 2;
public static final int IMPORTANCE_DEFAULT = 3;
public static final int IMPORTANCE_HIGH = 4;
}
PendingIntent是一个Intent的描述、包装,给予了这个PendingIntent 的组件在指定的事件发生或指定的时间到达时启动Activty、Service或者Broadcast。
根据是要启动Activity、Service还是Broadcast分别对应一个获取PendingIntent的方法
public static PendingIntent getActivity(Context context, int requestCode,
Intent intent, @Flags int flags) {}
public static PendingIntent getBroadcast(Context context, int requestCode,
Intent intent, @Flags int flags) {}
public static PendingIntent getService(Context context, int requestCode,
Intent intent, @Flags int flags) {}
public final class PendingIntent implements Parcelable {
//相同的PendingIntent只能使用一次,
//且遇到相同的PendingIntent时不会去更新PendingIntent中封装的Intent的extra部分的内容
public static final int FLAG_ONE_SHOT = 1<<30;
//如果要创建的PendingIntent尚未存在,则不创建新的PendingIntent,直接返回null
public static final int FLAG_NO_CREATE = 1<<29;
//如果要创建的PendingIntent已经存在了,
//那么在创建新的PendingIntent之前,原先已经存在的PendingIntent中的intent将不能使用
public static final int FLAG_CANCEL_CURRENT = 1<<28;
//如果要创建的PendingIntent已经存在了,那么在保留原先PendingIntent的同时,
//将原先PendingIntent封装的Intent中的extra部分替换为现在新创建的PendingIntent的intent中extra的内容
public static final int FLAG_UPDATE_CURRENT = 1<<27;
public static final int FLAG_IMMUTABLE = 1<<26;
}
构造PendingIntent时第四个参数flags的设置以及在Notification中的不同作用
状态通知栏主要涉及到2个类: Notification 和 NotificationManager
Notification为通知信息类,它里面对应了通知栏的各个属性
NotificationManager : 是状态栏通知的管理类,负责发通知、清除通知等操作。
注意:NotificationManager 是一个系统Service,所以必须通过 getSystemService(NOTIFICATION_SERVICE)方法来获取,方法如下。
NotificationManager mNotificationManager = (NotificationManager)
getSystemService(NOTIFICATION_SERVICE);
Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
private static final String CHANNEL_ID = "渠道id";
private static final CharSequence CHANNEL_NAME = "渠道名称";
private static final int IMPORTANCE = NotificationManager.IMPORTANCE_HIGH;
private static final int ID = 100;
//第一步:创建通知管理器NotificationManager
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
//第二步:Android8.0及以上为NotificationManager添加NotificationChannel
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
NotificationChannel notificationChannel = getNotificationChannel();
notificationManager.createNotificationChannel(notificationChannel);
}
//第三步:为NotificationManager设置Notification
Notification notification = getNotification();
notificationManager.notify(ID, notification);
private Notification getNotification() {
//构建PendingIntent:点击通知响应事件
Intent resultIntent = new Intent(MainActivity.this, MessageDetailActivity.class);
PendingIntent resultPendingIntent = PendingIntent.getActivity(
MainActivity.this,
0,
resultIntent,
PendingIntent.FLAG_UPDATE_CURRENT);
Bitmap btm = BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher);
//创建Notification
return new NotificationCompat.Builder(MainActivity.this, CHANNEL_ID)
//icon title text必须包含,不然影响桌面图标小红点的展示
.setSmallIcon(android.R.drawable.stat_notify_chat)
.setLargeIcon(btm)
.setContentTitle("notification title_9")
.setContentText("notification content_9")
.setPriority(1000)
.setTicker("New message")//第一次提示消息的时候显示在通知栏上
//用户单击通知后自动消失
.setAutoCancel(true)
.setWhen(System.currentTimeMillis())//设置创建时间
.setShowWhen(true)//显示时间
.setVibrate(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400})
//久按桌面图标时允许的此条通知的数量
.setNumber(3)
.setDefaults(Notification.DEFAULT_LIGHTS)
.setContentIntent(resultPendingIntent)
.setOngoing(true)//设置通知不可删除
.build();
}
@RequiresApi(api = Build.VERSION_CODES.O)//API26
private NotificationChannel getNotificationChannel() {
NotificationChannel channel = new NotificationChannel(CHANNEL_ID,
CHANNEL_NAME,
IMPORTANCE);
String description = "渠道描述1";
channel.setDescription(description);//渠道描述
//是否绕过请勿打扰模式
channel.canBypassDnd();
//闪光灯
channel.enableLights(true);
//锁屏显示通知
channel.setLockscreenVisibility(Notification.VISIBILITY_SECRET);
//闪关灯的灯光颜色
channel.setLightColor(Color.RED);
//桌面launcher的消息角标
channel.canShowBadge();
//是否允许震动
channel.enableVibration(true);
//获取系统通知响铃声音的配置
channel.getAudioAttributes();
//获取通知取到组
channel.getGroup();
//设置可绕过 请勿打扰模式
channel.setBypassDnd(true);
//设置震动模式
channel.setVibrationPattern(new long[]{100, 100, 200});
//是否会有灯光
channel.shouldShowLights();
return channel;
}