关于Android 通知

什么是通知渠道

每条通知都要属于一个对应的渠道。每个App都可以自由地创建当前App拥有哪些通知渠道,但是这些通知渠道的控制权都是掌握在用户手上的。用户可以自由地选择这些通知渠道的重要程度,是否响铃、是否振动、或者是否要关闭这个渠道的通知。Google这次对于8.0系统通知渠道的推广态度还是比较强硬的,targetSdkVersion在26以上如果不使用通知渠道的话,那么App的通知将完全无法弹出。

创建通知渠道

上代码

    String channelId = "message";
        String channelName = "消息提示";
        int importance = NotificationManager.IMPORTANCE_HIGH;

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {

            NotificationChannel channel = new NotificationChannel(channelId, channelName, importance);
            NotificationManager notificationManager = (NotificationManager) getSystemService(
                    NOTIFICATION_SERVICE);
            notificationManager.createNotificationChannel(channel);
        }

这里创建了一个叫消息提示的的通知渠道,重要程度为NotificationManager.IMPORTANCE_HIGH 紧急。

创建通知渠道的这部分代码,你可以写在Activity中,也可以写在Application中,实际上可以写在程序的任何位置,只需要保证在通知弹出之前调用就可以了。并且创建通知渠道的代码只在第一次执行的时候才会创建,以后每次执行创建代码系统会检测到该通知渠道已经存在了,因此不会重复创建,也并不会影响任何效率。

显示通知

    NotificationManager notificationManager =
                (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);

        Intent intent = new Intent(getContext(), NotificationActivity.class);
        PendingIntent pi = PendingIntent.getService(getContext(), 0, intent, 0);

        Notification notification = new NotificationCompat.Builder(this, channelId)
                //标题
                .setContentTitle("收到一条聊天消息")
                //内容
                .setContentText("今天中午吃什么")
                //设置发送的时间
                .setWhen(System.currentTimeMillis())
                //设置小图标(通知栏没有下拉的图标)
                .setSmallIcon(R.drawable.icon_done)
                //设置右侧大图标
                .setLargeIcon(BitmapFactory.decodeResource(getResources(),
                        R.drawable.icon_head_hydra_2))
                //设置点击通知后自动删除通知
                .setAutoCancel(true)
                .setContentIntent(pi)
                .build();
        notificationManager.notify(1, notification);


        //似乎只有设置了setContentIntent,AutoCancel才能生效
image.png

多行文字通知

  
        NotificationManager notificationManager =
                (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);

        Intent intent = new Intent(getContext(), NotificationActivity.class);
        PendingIntent pi = PendingIntent.getService(getContext(), 0, intent, 0);

        String title = "多行文字标题";
        String content =
                "多行文字内容,多行文字内容,多行文字内容,多行文字内容,多行文字内容,多行文字内容,多行文字内容,多行文字内容,多行文字内容,多行文字内容,多行文字内容";


        //创建多文字样式
        NotificationCompat.BigTextStyle bigTextStyle = new NotificationCompat.BigTextStyle()
                .setBigContentTitle(title)
                .bigText(content);
        Notification notification = new NotificationCompat.Builder(this, channelId)
                //标题
                .setContentTitle("你有一条新消息")
                //设置小图标(通知栏没有下拉的图标)
                .setSmallIcon(R.drawable.icon_done)
                //设置右侧大图标
                .setLargeIcon(BitmapFactory.decodeResource(getResources(),
                        R.drawable.icon_head_hydra_2))
                //设置发送的时间
                .setWhen(System.currentTimeMillis())
                //设置点击通知后自动删除通知
                .setAutoCancel(true)
                .setContentIntent(pi)
                .setStyle(bigTextStyle)
                .build();
        notificationManager.notify(1, notification);

        //这里设置setContentText 也不会生效,会直接显示bigTextStyle里的内容,下拉之后不会显示setContentTitle,直接显示bigText

弹出样式
image.png

微信消息样式

NotificationManager notificationManager =
                (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);

        Intent intent = new Intent(getContext(), NotificationActivity.class);
        PendingIntent pi = PendingIntent.getService(getContext(), 0, intent, 0);

        String title = "冰冰";
        ArrayList<String> messageList = new ArrayList<String>();
        messageList.add("今晚有空吗?");
        messageList.add("晚上跟我一起去玩吧?");
        messageList.add("怎么不回复我??我生气了!!");
        messageList.add("我真生气了!!!!!你听见了吗!");
        messageList.add("别不理我!!!");
        String content = "[" + messageList.size() + "条]" + title + ": " + messageList.get(0);


        NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();
        for (String msg : messageList) {
            inboxStyle.addLine(msg);
        }
        inboxStyle.setSummaryText("[" + messageList.size() + "条]" + title);


        Notification notification = new NotificationCompat.Builder(this, channelId)
                //标题
                .setContentTitle(title)
                //内容
                .setContentText(content)
                //设置小图标(通知栏没有下拉的图标)
                .setSmallIcon(R.drawable.icon_done)
                //设置右侧大图标
                .setLargeIcon(BitmapFactory.decodeResource(getResources(),
                        R.drawable.icon_head_hydra_2))
                //设置发送的时间
                .setWhen(System.currentTimeMillis())
                //设置点击通知后自动删除通知
                .setAutoCancel(true)
                .setContentIntent(pi)
                .setStyle(inboxStyle)
                .build();
        notificationManager.notify(1, notification);
image.png
image.png

进度条样式

NotificationManager notificationManager =
        (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);

Intent intent = new Intent(getContext(), NotificationActivity.class);
PendingIntent pi = PendingIntent.getService(getContext(), 0, intent, 0);

Notification notification = new NotificationCompat.Builder(this, channelId)
        //标题
        .setContentTitle("正在下载")
        //内容
        .setContentText("50%")
        //设置发送的时间
        .setWhen(System.currentTimeMillis())
        //设置小图标(通知栏没有下拉的图标)
        .setSmallIcon(R.drawable.icon_done)
        //设置右侧大图标
        .setLargeIcon(BitmapFactory.decodeResource(getResources(),
                R.drawable.icon_head_hydra_2))
        //设置点击通知后自动删除通知
        .setAutoCancel(true)
        .setContentIntent(pi)
        //主要是这句
        .setProgress(100, 50, false)
        .build();
notificationManager.notify(1, notification);

//setProgress(100, 50, false)
image.png

大图样式

NotificationManager notificationManager =
        (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);

Intent intent = new Intent(getContext(), NotificationActivity.class);
PendingIntent pi = PendingIntent.getService(getContext(), 0, intent, 0);


NotificationCompat.BigPictureStyle bigPictureStyle =
        new NotificationCompat.BigPictureStyle()
        .bigPicture(BitmapFactory.decodeResource(getResources(),
                R.drawable.icon_head_hydra_5))
        .setBigContentTitle("图片标题");


Notification notification = new NotificationCompat.Builder(this, channelId)
        //标题
        .setContentTitle("你有一条新消息")
        .setContentText("图片")
        //设置小图标(通知栏没有下拉的图标)
        .setSmallIcon(R.drawable.icon_done)
        //设置右侧大图标
        .setLargeIcon(BitmapFactory.decodeResource(getResources(),
                R.drawable.icon_head_hydra_2))
        //设置发送的时间
        .setWhen(System.currentTimeMillis())
        //设置点击通知后自动删除通知
        .setAutoCancel(true)
        .setContentIntent(pi)
        .setStyle(bigPictureStyle)
        .build();
notificationManager.notify(1, notification);
image.png
image.png

自定义通知栏view

RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.custom_view_layout);
        // 设置点击事件
        remoteViews.setOnClickPendingIntent(R.id.iv_play_or_pause, getActivityPendingIntent(1));
        remoteViews.setOnClickPendingIntent(R.id.iv_next, getActivityPendingIntent(2));
        remoteViews.setOnClickPendingIntent(R.id.iv_cancel, getActivityPendingIntent(3));

        remoteViews.setTextViewText(R.id.tv_title, "标题");
        remoteViews.setTextViewText(R.id.tv_summery, "艺术家");

NotificationManager notificationManager =
                (NotificationManager) getContext().getSystemService(Context.NOTIFICATION_SERVICE);

        Intent intent = new Intent(getContext(), NotificationActivity.class);
        PendingIntent pi = PendingIntent.getService(getContext(), 0, intent, 0);

        Notification notification = new NotificationCompat.Builder(this, channelId)
                //设置发送的时间
                .setWhen(System.currentTimeMillis())
                //设置小图标(通知栏没有下拉的图标)
                .setSmallIcon(R.drawable.icon_done)
                //设置右侧大图标
                .setLargeIcon(BitmapFactory.decodeResource(getResources(),
                        R.drawable.icon_head_hydra_2))
                //设置点击通知后自动删除通知
                .setAutoCancel(true)
                .setContentIntent(pi)
                .setContent(remoteViews)
                .build();
        notificationManager.notify(1, notification);
image.png

关于通知栏块是很混乱的,Android系统大版本更新的时候经常有变动。国内厂商修改很严重,我手上有小米和vivo的测试机,以上的代码在不同的手机上表现也各不相同。如果有用到复杂视图的通知栏,最好是自定义通知栏view。

传送门

资料

Android通知栏微技巧,8.0系统中通知栏的适配
NotifyUtil
NotificationDemo

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,295评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,928评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,682评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,209评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,237评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,965评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,586评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,487评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,016评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,136评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,271评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,948评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,619评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,139评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,252评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,598评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,267评论 2 358