andriod 通知栏消息notification+阿里ARouter的简易集成

847 阅读3分钟

背景:

最新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的版本