背景:
最新app需要实现推送功能,由于项目本身是使用了阿里的ARouter实现不同模块的不同页面的跳转,而notification中的 setContentIntent方法只能使用Intent,于是有了这串代码。
步骤:
1. 定义一个NotificationUtil
/**
* 状态栏Notification工具类
*/
public class StatusBarNotificationUtil {
private static final String CHANNEL_ID = BaseApplication.getContext().getPackageName();//通道id
private static final CharSequence CHANNEL_NAME = "会话类型";//通道名称
// private static final int NOTIFIACTION_IMPORTANCE = NotificationManager.IMPORTANCE_UNSPECIFIED;//通知重要性
private static PriorityEnum priorityEnum = PriorityEnum.DEFAULT;//通知重要性
public enum PriorityEnum {
DEFAULT, //默认
HIGH, //高:发出声音
LOW, //低:不发出声音,也不在状态栏中显示
UNSPECIFIED, //紧急:发出声音并以浮动通知的形式显示
MIN, //中:不发出声音
NONE //不重要的通知:不显示在阴影中
}
/**
* 设置通知重要性
*/
public void setNotificationPriority(PriorityEnum priorityEnum) {
this.priorityEnum = priorityEnum;
}
/**
* IMPORTANCE_DEFAULT
* IMPORTANCE_HIGH
* IMPORTANCE_LOW
* IMPORTANCE_MAX
* IMPORTANCE_MIN
*
* @param priorityEnum
* @return
*/
@RequiresApi(api = Build.VERSION_CODES.N)
private int getNotificationEnum(PriorityEnum priorityEnum) {
int priority;
switch (priorityEnum) {
case LOW:
priority = NotificationManager.IMPORTANCE_LOW;
break;
case MIN:
priority = NotificationManager.IMPORTANCE_MIN;
break;
case HIGH:
priority = NotificationManager.IMPORTANCE_HIGH;
break;
case NONE:
priority = NotificationManager.IMPORTANCE_NONE;
break;
case DEFAULT:
priority = NotificationManager.IMPORTANCE_DEFAULT;
break;
case UNSPECIFIED:
//priority = NotificationManager.IMPORTANCE_UNSPECIFIED;
//break;
default:
priority = NotificationManager.IMPORTANCE_DEFAULT;
break;
}
return priority;
}
/**
* 开始通知
*
* @param context 页面上下文
* @param title 通知栏标题
* @param content 通知栏内容
* @param idIco 通知栏图片id
* @param NotificationCode 通知code
* @param AutoCancel 通知栏是否可点击消除
* @param Ongoing 通知栏是否可清除
* @param data 参数
*/
public void showNotification(Context context,
String title,
String content,
int idIco,
int NotificationCode,
boolean AutoCancel,
boolean Ongoing,
NotificationData data) {
Context ApplicationContext = BaseApplication.getContext();
long[] vibrate = {0, 500, 1000, 1500};
PendingIntent pendingIntent = null;
NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
Notification.Builder notification;
if (data != null) {
Intent intent = setNotificationIntent(NotificationCode, data, ApplicationContext);
pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
// 此处必须兼容android O设备,否则系统版本在O以上可能不展示通知栏
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
notification = NotificationBuilderByO(title, content, idIco, AutoCancel, Ongoing, ApplicationContext, vibrate, pendingIntent, manager);
} else {
notification = new Notification
.Builder(ApplicationContext)
.setAutoCancel(AutoCancel)
.setOngoing(Ongoing)
.setContentTitle(title)
.setContentText(content)
.setWhen(System.currentTimeMillis())
.setSmallIcon(idIco)
.setLargeIcon(BitmapFactory.decodeResource(ApplicationContext.getResources(), idIco))
.setVibrate(vibrate)
.setContentIntent(pendingIntent)
// .setDeleteIntent(pendingIntentCancel)
// .setPriority(NotificationCompat.PRIORITY_HIGH)
.setDefaults(Notification.DEFAULT_ALL)//使用默认的声音、振动、闪光
.setSound(MediaStore.Audio.Media.INTERNAL_CONTENT_URI);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
notification.setGroupSummary(false)
.setGroup("group");
}
//NotificationCode决定了是否覆盖消息,相同的update,不同add
manager.notify(NotificationCode, notification.build());
}
}
/**
* 设置Intent
*
* @param NotificationCode
* @param data
* @param applicationContext
* @return
*/
private Intent setNotificationIntent(int NotificationCode, NotificationData data, Context applicationContext) {
Intent intent = new Intent(applicationContext, NotificationBroadcastReceiver.class);
intent.setAction(data.getAction());
if (data.getAction().equals(NotificationAction.jump)) {
intent.putExtra("Data", new Gson().toJson(data));
}else if(data.getAction().equals(NotificationAction.click)){
}else if(data.getAction().equals(NotificationAction.cancel)){
}
intent.putExtra(NotificationBroadcastReceiver.TYPE, NotificationCode);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
return intent;
}
@RequiresApi(api = Build.VERSION_CODES.O)
private Notification.Builder NotificationBuilderByO(String title,
String content,
int idIco,
boolean AutoCancel,
boolean Ongoing,
Context applicationContext,
long[] vibrate,
PendingIntent pendingIntent,
NotificationManager manager) {
Notification.Builder notification;
notification = new Notification
.Builder(BaseApplication.getContext(), CHANNEL_ID)
.setAutoCancel(AutoCancel)
.setOngoing(Ongoing)
.setContentTitle(title)
.setContentText(content)
.setWhen(System.currentTimeMillis())
.setSmallIcon(R.mipmap.ic_launcher)
.setLargeIcon(BitmapFactory.decodeResource(applicationContext.getResources(), idIco))
.setContentIntent(pendingIntent)
// .setDeleteIntent(pendingIntent)
// .setPriority(NotificationCompat.PRIORITY_HIGH)
.setChannelId(BaseApplication.getContext().getPackageName());
NotificationChannel channel = new NotificationChannel(
CHANNEL_ID,
CHANNEL_NAME,//这块Android9.0分类的比较完整,你创建多个这样的东西,你可以在设置里边显示那个或者第几个
getNotificationEnum(priorityEnum)
);
// // 设置通知出现时声音,默认通知是有声音的
// channel.setSound(null, null);
// // 设置通知出现时的闪灯(如果 android 设备支持的话)
// channel.enableLights(true);
// channel.setLightColor(Color.RED);
// // 设置通知出现时的震动(如果 android 设备支持的话)
// channel.enableVibration(true);
// channel.setVibrationPattern(vibrate);
// Configure the notification channel.
channel.setDescription("通知");
channel.enableLights(true);
channel.setLightColor(Color.RED);
channel.setVibrationPattern(new long[]{100, 200, 300, 400, 500, 400, 300, 200, 400});
manager.createNotificationChannel(channel);
return notification;
}
}
其中关键点在于PendingIntent.getBroadcast,没错就是广播。
2. 定义一个NotificationBroadcastReceiver
public class NotificationBroadcastReceiver extends BroadcastReceiver {
public static final String TYPE = "type"; //这个type是为了Notification更新信息的,这个不明白的朋友可以去搜搜,很多
@Override
public void onReceive(Context context, Intent intent) {
Log.i("Notification广播接收者","进入");
String action = intent.getAction();
int type = intent.getIntExtra(TYPE, -1);
NotificationData data = new Gson().fromJson(intent.getStringExtra("Data"),NotificationData.class);
if (type != -1) {
NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(type);
}
switch (action){
case NotificationAction.jump:
if(Declare.isLogin && data.getUsername().equalsIgnoreCase(Declare.LoginUser)) {
//跳转事件
Postcard postcard = ARouter.getInstance()
.build(data.getPath());
//设置参数
for (ParameterEntity parameter : data.getParameters()) {
postcard.withString(parameter.getLabel(), parameter.getValue());
}
postcard.navigation();
}
break;
case NotificationAction.click:
//处理重连事件
WebSocketConfig.reconnection();
break;
case NotificationAction.cancel:
//处理清除事件
break;
}
}
}
其中otificationAction.jump,就是跳转的action,我们只需要在这里面实现ARouter跳转即可
3.使用
//--------参数
NotificationData notificationData = new NotificationData(NotificationAction.jump);
notificationData.setPath("/hxb/test");
//---------参数
final StatusBarNotificationUtil statusBarNotificationUtil = new StatusBarNotificationUtil();
statusBarNotificationUtil.setNotificationPriority(StatusBarNotificationUtil.PriorityEnum.UNSPECIFIED);
statusBarNotificationUtil.showNotification(BaseApplication.getContext(),
"您有一条新消息",
"hmp",
R.mipmap.ic_launcher,
Declare.NotificationCode,
false,
false,
notificationData);
最后放出源码
其通知栏notification已经适配了android o的版本