android8.0通知

参考:

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

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) {}

PendingIntent的flag:

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让你完全了解它)

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;
}


你可能感兴趣的:(Android基础)