Android 8.0通知系统适配

概述

Android 8.0 系统,Google引入通知渠道,提高用户体验,方便用户管理通知信息,同时也提高了通知到达率。

通知适配

Android 8.0 功能和 API

  • 配置
    build.gradle 中targetSdkVersion设置大于等于26。这时如果不对通知渠道适配,通知就无法显示。
  • 代码
   /**
     * 显示通知栏
     * @param context 上下文对象
     * @param pushMsg 消息bean类
     */
    private void showNotification(Context context, PushMsgInfo pushMsg) {
        NotificationManager nm = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        // 兼容 8.0 系统
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            createNotificationChannel(context, nm);
        }
        NotificationCompat.Builder builder = createNotificationCompatBuilder(context, pushMsg);

        nm.notify(0, builder.build());
    }

    @NonNull
    private NotificationCompat.Builder createNotificationCompatBuilder(Context context, PushMsgInfo pushMsg) {
        // 通知栏点击接收者
        Intent i = new Intent(context, OnPushClickRecevier.class);
        i.setAction(OnPushClickRecevier.ACTION);
        i.putExtra("data", pushMsg);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context, mMessageId, i, PendingIntent.FLAG_UPDATE_CURRENT);

        NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
        builder.setContentIntent(pendingIntent);
        builder.setSmallIcon(R.drawable.ic_haofang);
        builder.setContentTitle(pushMsg.getTitle());
        builder.setContentText(pushMsg.getDescription());
        builder.setAutoCancel(true);
        builder.setDefaults(Notification.DEFAULT_ALL);
        String stoneRing = "通知声音地址";
        if (!TextUtils.isEmpty(stoneRing)) {
            builder.setSound(Uri.parse(stoneRing));
        }
        return builder;
    }

    @TargetApi(Build.VERSION_CODES.O)
    private void createNotificationChannel(Context context, NotificationManager notificationManager) {
        // 通知渠道
        NotificationChannel mChannel = new NotificationChannel("渠道Id", "渠道名称", NotificationManager.IMPORTANCE_HIGH);
        // 开启指示灯,如果设备有的话。
        mChannel.enableLights(true);
        // 开启震动
        mChannel.enableVibration(true);
        //  设置指示灯颜色
        mChannel.setLightColor(Color.RED);
        // 设置是否应在锁定屏幕上显示此频道的通知
        mChannel.setLockscreenVisibility(Notification.VISIBILITY_PRIVATE);
        // 设置是否显示角标
        mChannel.setShowBadge(true);
        //  设置绕过免打扰模式
        mChannel.setBypassDnd(true);
        // 设置震动频率
        mChannel.setVibrationPattern(new long[]{100, 200, 300, 400});
        //最后在notificationmanager中创建该通知渠道
        notificationManager.createNotificationChannel(mChannel);
    }

注意:
1.创建通知渠道 createNotificationChannel() 一定要写在创建显示通知之前。
2.创建通知渠道的代码只在第一次执行的时候才会创建,以后每次执行创建代码系统会检测到该通知渠道已经存在了,因此不会重复创建,也并不会影响任何效率。

  • NotificationChannel 构造函数
    /**
     * NotificationChannel 构造函数
     * @param id 渠道id
     * @param name 渠道名称
     * @param importance 渠道重要等级 IMPORTANCE_HIGH IMPORTANCE_DEFAULT IMPORTANCE_LOW IMPORTANCE_MIN
     */
    public NotificationChannel(java.lang.String id, java.lang.CharSequence name, int importance) {
        // TODO compiled code
    }

相关文章

公众号
Android 8.0 通知

    原文作者:IT一书生
    原文地址: https://www.jianshu.com/p/b736037a8e42
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞