Android 通知(Notification)高级用法和注意事项

前言

  前一节已经对Android通知栏的初级用法进行了讲解,这篇高级用法主要讲解自定义布局的实现.

Notofication 自定义布局说明

  对于自定义布局来说,其实和普通的通知的整个流程是一致的,重点不同的是,把内容、标题和点击事件的处理整合在一个自定义布局里面.我们特别需要注意优一下几点.

  • 大小
    • 默认布局高度为64
    • 最大扩展高度为256
  • 颜色
    • 尽量使用系统默认颜色,不同手机系统背景颜色不一致,导致显示效果有差异
  • 点击事件
    • 重点处理
    • 如果使用PendingIntent.getBroadcast,需要手动处理,状态栏的收起,通知的移除
    • 如果使用PendingIntent.getAcitivity,需要手动处理状态栏的收起

Notofication 构建实例

    // 构建通知的实例 NotificationCompat兼容性优
 NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(context)

Notofication 搭建自定义布局

 final RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.media_notification_layout);
        rv.setTextViewText(R.id.title_tv, title);
        rv.setTextViewText(R.id.content_tv, msg);
        rv.setTextViewText(R.id.time_tv, DateUtil.format(new Date(System.currentTimeMillis()), "HH:mm"));
        if (bitmap == null) {
            rv.setViewVisibility(R.id.content_iv, View.GONE);
        } else {
            rv.setViewVisibility(R.id.content_iv, View.VISIBLE);
            rv.setImageViewBitmap(R.id.content_iv, bitmap);
        }
        rv.setOnClickPendingIntent(R.id.btn1, getPendingIntent(context'type1'));
        rv.setOnClickPendingIntent(R.id.btn2, getPendingIntent(context, 'type2');
        rv.setOnClickPendingIntent(R.id.btn3, getPendingIntent(context,'type3'));

  • 重点说明
    • 当自定布局中出现需要获取网络图片的时候,应该先请求网络资源成功之后,在创建和发送通知 整个流程,因为通知的执行属性导致网络图片无法正常显示

Notification 设置属性

        mBuilder.setChannelId('PUSH_CHANNEL_ID')
                .setCustomContentView(rv)//自定义布局
                .setContentIntent(getPendingIntent(context));
        
         //设置通知自定义扩展布局
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
            builder.setCustomBigContentView(rv);
        }
        
        //设置通知自定义声音
        mBuilder.setSound(Uri.parse("android.resource://" + context.getPackageName() + "/" +'音频文件id');
        //设置通知默认声音
        mBuilder.setDefaults(Notification.DEFAULT_ALL);
            
        //设置通知icon
        if (targetSdkVersion >= 21 && Build.VERSION.SDK_INT >= 21){
            mBuilder.setSmallIcon(R.drawable.notification_small_icon);
            mBuilder.setLargeIcon(BitmapFactory.decodeResource(context.getResources(), R.drawable.notification_large_icon));
        } else {
            mBuilder.setSmallIcon(R.drawable.statusbar_icon);
        }    
        
        
  • 重点说明
    • setSmallIcon,必须设置属性,因为是手机状态栏上面的提示图标
      • 当targetSdkVersion >= 21 && Build.VERSION.SDK_INT >= 21 必须设置setLargeIcon,并且setSmallIcon设置为透明的图标,否则不显示
      • 当 Build.VERSION.SDK_INT>=21 必须设置setCustomBigContentView

Notification 点击事件

 private static PendingIntent getPendingIntent(final Context context) {
        Intent intent = new Intent(context, NotificationBroadcastReceiver.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
        //通知extra内容处理 
        int ownID=1;//放在通知最外层,防止每次进来被初始化
        ownID++;
        requestCode = ownID;
        return PendingIntent.getBroadcast(context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    }
    
    
    private static PendingIntent getPendingIntent(final Context context) {
        Intent intent = new Intent(context, TargetActivity.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_NEW_TASK);
        //通知extra内容处理 
        int ownID=1;//放在通知最外层,防止每次进来被初始化
        ownID++;
        requestCode = ownID;
        return PendingIntent.getAcitivity(context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    }

Notification 点击事件处理

    public class NotificationBroadcastReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            //内容处理
            //根据类型进行处理
            //1、收起状态栏
            //2、移除对应通知
        }
    
    }
  • 重点说明
    • 点击事件分为两类
      • PendingIntent.getBroadcast 通知处理
      • PendingIntent.getActivity 直接处理
    • 自定义布局处理点击事件时,需要手动收起状态栏和移除对应通知

Notification 收起状态栏

 /**
     * 收起通知栏
     *
     * @param context
     */
    public static void collapseStatusBar(Context context) {
        @SuppressLint("WrongConstant") Object service = context.getSystemService("statusbar");
        if (null == service)
            return;
        try {
            @SuppressLint("PrivateApi") Class<?> clazz = Class.forName("android.app.StatusBarManager");
            Method collapse;
            if (Build.VERSION.SDK_INT <= 16) {
                collapse = clazz.getMethod("collapse");
            } else {
                collapse = clazz.getMethod("collapsePanels");
            }
            collapse.setAccessible(true);
            collapse.invoke(service);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

Notification 创建通知管理器

        //创建通知管理器
        if (notificationManager == null) {
            notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        }
        
        //设置通知渠道
        if (Build.VERSION.SDK_INT >= 26) {
            NotificationChannel channel = new NotificationChannel('PUSH_CHANNEL_ID', context.getString(R.string.setting_channel_notification), NotificationManager.IMPORTANCE_DEFAULT);
            notificationManager.createNotificationChannel(channel);
        }
  • 重点说明
    • Build.VERSION.SDK_INT >= 26,需要设置createNotificationChannel,并且设置setChannelId

Notification 发送通知

        //发送通知
         notificationManager.notify(notificationId, mBuilder.build());
  • 重点说明
    • notificationId 用来发送和移除对应的通知

Notification 移除通知

        //移除通知
        if (notificationManager == null) {
            notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
        }
        notificationManager.cancel(notificationId);

Notification 结束语

  基本上通知的初级用法就是这些用法,重点注意高版本适配和某些特殊用法.

Notification 参考文献

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android常驻通知(Notification)是指在用户状态栏中一直显示的通知图标和文本内容,不会因为用户操作或应用进程被销毁而消失。常驻通知通常用于实时监测、后台服务、音乐播放等需要持续提醒用户的场景。 常驻通知的实现步骤如下: 1. 首先,需要创建一个Notification对象,包括通知图标、标题、内容等信息。 2. 然后,创建一个PendingIntent,用于定义用户点击通知后的操作,比如打开应用的某个Activity或执行某个Service。 3. 创建一个NotificationChannel(通知渠道),用于定义通知的重要程度,包括声音、震动等设置。 4. 将Notification对象与PendingIntent关联,并将其设置为常驻通知的优先级。 5. 最后,调用NotificationManager的notify方法,将通知显示在用户的状态栏上。 需要注意的是,常驻通知存在一些使用限制和最佳实践: 1. 用户可以通过设置中的通知管理来关闭或打开特定应用的常驻通知。 2. 常驻通知不适合用于广告或频繁推送的内容,以免打扰用户。 3. 为了避免误导用户,常驻通知的图标和文本内容应与应用的实际情况相符。 4. 如果需要更新通知的内容或操作,可以使用NotificationManager的notify方法进行更新,并保持通知的id不变。 总之,常驻通知Android提供的一个重要功能,可以实现持续提醒用户和后台监测的需求。但应用开发者需要注意使用场景和用户体验,遵循Android的最佳实践,以确保用户对常驻通知的接受和理解。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值