美文网首页view安卓知识Android Tips
3.Notification通知栏上手

3.Notification通知栏上手

作者: KnifeStone | 来源:发表于2017-01-07 23:11 被阅读489次

    apk/源码下载地址

    封面.png

    目录

    1.应用场景
    2.通知栏版本兼容性
    3.small icon规范
    4.发送一个简单的通知
    5.有提醒的通知(声音/振动/闪光灯)
    6.有响应事件的通知
    7.有按钮的通知
    8.有进度条的通知
    9.清除通知
    10.锁屏显示控制
    11.浮动通知
    12.长文本通知 (要系统和厂商OS支持)
    13.自定义通知栏

    demo页面.png 通知栏列表.png

    1.应用场景

    • 显示接收到短消息、即使消息等信息 (如QQ、微信、新浪、短信)
    • 显示客户端的推送消息(如有新版本发布,广告,推荐新闻等)
    • 显示正在进行的事物(例如:后台运行的程序)(如音乐播放器、版本更新时候的下载进度等)
    • 通知栏形式的交互 (例如:切换歌曲、下载安装提示等)

    2.通知栏版本兼容性

    • 各个版本和不同厂商的修改导致通知栏的效果会有一些不一样
    • 推荐用最新版的sdk来开发
    • 用兼容包下的NotificationCompat类来实现通知栏功能
    //不用
    android.app.Notification
    android.app.NotificationManager
    //用
    android.support.v4.app.NotificationCompat.Builder
    android.support.v4.app.NotificationManagerCompat
    

    3.small icon规范

    • 在target 20以上的机器上
    • small icon的图标需要是 透明背景
    • 这个有很多相关介绍的文章,总结起来就是上面2点

    4.发送一个简单的通知

    public void sendSimpleNotification(Context context) {
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
        //设置内容
        builder.setContentTitle("简单的通知的标题")
                //设置内容
                .setContentText("这是通知内容")
                //大图标
                .setLargeIcon(BitmapFactory.decodeResource(
                        context.getResources(), R.mipmap.ic_launcher))
                //设置小图标背景色(默认不设置)
                .setColor(0xffff0000)
                //设置这个标志当用户单击面板就可以让通知将自动取消
                .setAutoCancel(true)
                //小图标
                .setSmallIcon(R.mipmap.ic_launcher);
        //通知管理器
        NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
        //通知标签
        String tag = TAG_TEST;
        //通知Id  一个id对应一个单独的通知栏
        int id = ID_SIMPLE;
        //发送通知
        managerCompat.notify(tag, id, builder.build());
    }
    

    5.有提醒的通知(声音/振动/闪光灯)

    public void sendRemindNotification(Context context){
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
        builder
                .setContentTitle("下雨了")
                .setContentText("家里的衣服收了吗?")
                .setSmallIcon(R.mipmap.ic_launcher)
                //声音
                .setSound(Uri.parse("android.resource://" + context.getPackageName() + "/" + R.raw.remind))
                //振动 振500 停500 再振500
                .setVibrate(new long[]{0, 500, 500, 500})
                //灯光 亮200 灭100
                .setLights(Color.BLUE, 200, 100);
                //也可以全部设置 (灯光 声音 振动)
                //.setDefaults(NotificationCompat.DEFAULT_ALL)
        NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
        managerCompat.notify(TAG_TEST, ID_REMIND, builder.build());
    }
    

    6.有响应事件的通知

    public void sendOnClickNotification(Context context) {
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
        builder
                .setContentTitle("新的邮件")
                .setContentText("尊敬的用户:为回馈老用户....")
                .setSmallIcon(R.mipmap.ic_launcher)
                //点击跳转的意图
                .setContentIntent(responseActivityIntent(context, "查看邮寄"));
        NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
        managerCompat.notify(TAG_TEST, ID_ONCLICK, builder.build());
    }
    /**
     * 响应开启一个服务的意图
     */
    private PendingIntent responseServiceIntent(Context context, int action, String desc) {
        Intent intent = new Intent(context, ResponseService.class);
        intent.putExtra(ResponseService.EXTRA_ACTION, action);
        intent.putExtra(ResponseService.EXTRA_DESC, desc);
        //设置一个action防止PendingIntent被复用 导致数据错乱
        intent.setAction("Service_Intent_Action_" + action);
        return PendingIntent.getService(context, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    }
    

    7.有按钮的通知

    public void sendOnButtonNotification(Context context) {
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
        builder
                .setContentTitle("新的好友")
                .setContentText("隔壁老王添加你为好友?")
                .setSmallIcon(R.mipmap.ic_launcher)
                //添加操作 点击跳转的意图
                .addAction(R.mipmap.ic_launcher, "接受", responseServiceIntent(context, ResponseService.ACTION_ACCEPT, "点击了接收"))
                .addAction(R.mipmap.ic_launcher, "拒绝", responseServiceIntent(context, ResponseService.ACTION_CANCEL, "点击了拒绝"))
                //点击跳转的意图
                .setContentIntent(responseActivityIntent(context, "处理老王的好友请求"));
        NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
        managerCompat.notify(TAG_TEST, ID_ONBUTTON, builder.build());
    }
    /**
     * 响应开启一个活动的意图
     */
    private PendingIntent responseActivityIntent(Context context, String desc) {
        Intent intent = new Intent(context, ResponseActivity.class);
        //设置一个action防止PendingIntent被复用 导致数据错乱
        intent.setAction("Activity_Intent_Action_" + desc);
        intent.putExtra(ResponseActivity.EXTRA_DESC, desc);
        //启动activity的不是activity 就需要加这个
        intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        return PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
    }
    

    8.有进度条的通知

    NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
    builder
            .setContentTitle("文件名")
            .setContentText("下载进度描述/进度等")
            .setSmallIcon(R.mipmap.ic_launcher)
            //indeterminate 模糊的进度显示
            .setProgress(100,50,true)
            //点击跳转的意图
            .setContentIntent(responseActivityIntent(context, "处理下载任务"));
    NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
    managerCompat.notify(TAG_TEST, ID_ONBUTTON, builder.build());
    

    9.清除通知

    //1.设置自动管理通知
    NotificationCompat.Builder.setAutoCancel(true);
    //2.动态清除
    NotificationManagerCompat notifyMg = NotificationManagerCompat.from(context);
    //取消 TAG ID 相应的通知
    notifyMg.cancel(TAG_TEST,id);
    //3.右滑划掉 点击清除
    //4.保持通知不被移除
    NotificationCompat.Builder.setOngoing(true);
    

    10.锁屏显示控制

    //1设置在锁屏页面显示
    NotificationCompat.Builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
    //2设置锁屏上显示的时候 可以自定义在锁屏上的通知栏
    NotificationCompat.Builder.setPublicVersion(null)
    

    11.浮动通知

    //设置HIGH MAX (要系统和厂商OS支持)
    NotificationCompat.Builder.setPriority(NotificationCompat.PRIORITY_MAX)
    

    12.长文本通知 (要系统和厂商OS支持)

    public void sendBigTextNotification(Context context) {
        NotificationCompat.BigTextStyle style = new android.support.v7.app.NotificationCompat.BigTextStyle();
        style.bigText("她的月收在接近四万的样子。她偶尔会接广告啊私活什么的,就像作者私下和媒体约稿一样,为了保证质量也不会多接,加上她本身所在的公司待遇优厚,所以这个不算高但绝对不低的数字确实是她一笔一笔画出来的,我和她认识也是因为我当时有个设计业务找到她。");
        style.setSummaryText("来自火星");
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
        builder
                .setContentTitle("不得不看的一篇文章")
                .setAutoCancel(true)
                .setSmallIcon(R.mipmap.ic_launcher)
                .setStyle(style)
                //点击跳转的意图
                .setContentIntent(responseActivityIntent(context, "处理来自火星的推问"));
        NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
        managerCompat.notify(TAG_TEST, ID_BIG_TEXT, builder.build());
    }
    

    13.自定义通知栏

    public void sendCustomNotification(Context context) {
        NotificationCompat.Builder builder = new NotificationCompat.Builder(context);
        RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.layout_custom_notification);
        remoteViews.setTextViewText(R.id.tv_content, "自定义内容");
        remoteViews.setImageViewResource(R.id.iv_close, R.mipmap.ic_launcher);
        remoteViews.setOnClickPendingIntent(R.id.iv_close, responseActivityIntent(context, "close"));
        builder.setContent(remoteViews)
                .setSmallIcon(R.mipmap.ic_launcher);
        NotificationManagerCompat managerCompat = NotificationManagerCompat.from(context);
        managerCompat.notify(TAG_TEST, ID_CUSTOM, builder.build());
    }
    

    更多参考资料:
    Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
    Android自定义Notification并没有那么简单

    相关文章

      网友评论

        本文标题:3.Notification通知栏上手

        本文链接:https://www.haomeiwen.com/subject/volzvttx.html