Android中通知的使用

不怕跌倒,所以飞翔

参考文献:
ASleepyCoder的Android Notification常见样式总结文章
vipra的Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)

本文主要知识点概要:

  • 通知(Notification)的简单使用
  • 通知(Notification)的一些常用的设置方法
  • 通知(Notification)的进阶使用
  • 通知(Notification)的常见问题

1. 简单使用

  • 创建一个NotificationManager对通知进行管理
  • 通过一个构建器来创建一个Notification对象

1.1创建一个NotificationManager对象

NotificationManager mManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

通过NotificationManager来管理通知内容;

1.2创建一个Notification对象

这个对象是通过构建者模式创建的,这里先贴代码,之后我在详细讲解常用的方法:

        NotificationCompat.Builder nb = new NotificationCompat.Builder(this, "1");
        nb.setContentTitle("通知的标题栏");
        nb.setContentText("通知栏内容");
        nb.setWhen(System.currentTimeMillis());
        nb.setSmallIcon(R.drawable.ic_stat_name);
        nb.setTicker("状态栏中提示的内容");
        nb.setDefaults(Notification.DEFAULT_VIBRATE);
        Notification notification = nb.build();

        mManager.notify(1,notification);

通过以上方法就可以成功的创建一个通知了,这里面具体的设置方法我在后面会详细讲解。

2.一些常用的设置方法

2.1当你创建通知的时候会使用到NotificationCompat来构建一个通知.常用到的方法如下:

  • setContentTitle("") 设置通知的标题
  • setContentText("") 设置通知的内容
  • setSmallIcon(R.mipmap.XXX) 设置通知显示的小图片(这里要注意,如果你设置的图片过大的话会抛出一个异常)这里注意小图标必须有,否则不显示通知
  • setLargeIcon(BitmapFactory.decodeResource(getResources(),R.mipmap.XXX)) 设置通知右下角显示的图片,这里面说的是是大图标,但是我在我的手机上却显示在右边,但是如果你设置一个较大的图片的时候,虽然不会报错,但是不会显示,当我不去设置smallIcon的时候,设置这个的时候整个通知栏都不显示了.其实当只设置smallIcon没有设置LargeIcon的时候,SmallIcon的图标将会出现在LargeIcon的位置,而小图标的位置将不会有图标,但两者同时设置的时候LargeIcon将会出现在LargeIcon位置,SmallIcon也会出现在SmallIcon的位置.
  • setTicker("") 设置状态栏的提示内容
  • setContentIntent(pendingIntent) 设置通知栏点击既执行的意图,和Intent的作用类似,但是写法不同.
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, new Intent(this,XXX.class), 0);
    
    
    这里说明下里面的参数:
    • 参数1 上下文
    • 参数2 请求码
    • 参数3 intent对象
    • 参数4 这个是一个flag表示位,会有一下几种
      • FLAG_ONE_SHOT 表示这个意图只可以使用一次,后续的通知单击后无法打开
      • FLAG_NO_CREATE 发现已经存在时,忽略新的请求,继续使用老的,日常开发中很少使用
      • FLAG_CANCEL_CURRENT 如果新请求的PendingIntent发现已经存在时,取消已经存在的,用心的替换老的
      • FLAG_UPDATE_CURRENT 如果新情求的PendingIntent发现已经存在时,如果Intent有字段改变了,就更新已存在的PendingIntent
  • setNumber(int) 设置通知及和的数量(没见到别人用过)
  • setWhen(System.currentTImeMillis()) 设置通知产生的时间,会在通知信息里显示,一般时系统获取到的时间,如果不去设置取系统的时间
  • setPriority(Notification.PRIORITY_DEFAULT) 设置通知的优先级,这个优先级是从-2~2 这里设置的是默认的是0(一般是在广播中设置这个属性),这里写一下你可以设置的参数吧:
    • Notification.PRIORITY_DEFAULT 默认
    • Notification.PRIORITY_HIGH 高
    • Notification.PRIORITY_LOW 低
    • Notification.PRIORITY_MAX 最高
    • Notification.PRIORITY_MIN 最低
  • setAutoCancel(boolean) 用户点击该通知,是否关闭此条通知
  • setOngoning(boolean) 点击或者侧滑通知,通知是否会消失,一般利用它都是设置一个正在运行的通知,如音乐播放或者下载进度等一些特殊的场景,要设置成true
  • setDefaults(Notification.DEFAULT_VIBRATE) 给通知添加声音,闪灯和震动效果,可以组合使用,具体参数为
    • Notification.DEFAULT_VIBRATE 添加默认震动提醒
    • Notification.DEFAULT_SOUND 添加默认声音提醒
    • Notification.DEFAULT_LIGHTS 添加默认三色灯提醒
    • Notification.DEFAULT_ALL 添加默认以上3种全部提醒
  • setVibrate(long[] pattern) 设置自定义震动模式 如:setVibrate(new long[] {0,200,200,300});//延迟0秒,然后震动200ms,在延迟200ms,接着震动300ms
  • setLights(int RGB,int onTime,int lowLight) 设置自定义灯光,这里说明一下参数和注意事项
    • 参数1: RGB灯光颜色
    • 参数2: 亮持续的时间
    • 参数3: 暗持续的时间
    • 注意: 只有在设置了标识符Flags为Notification.FLAG_SHOW_LIGHTS的时候,才支持三色灯提醒
  • setSound(Uri music) 设置自定义音乐 如:setSound(Uri.parse("file:///sdcard/xx/xx.mp3"))
  • setProgress(int max,int progress,boolean indeterminare) 设置带进度条的通知,这里说一下参数3,代表进度是否确定,当确定的时候是具体的progress,但是不确定的时候是连续的短线.
  • addAction(int icon, CharSequence title, PendingIntent intent) 添加一个点击后出现的按钮,添加多了会出现一排图标,最多可以添加5个.并且每个都能设置相应的点击事件.这个最好看后面的3.2讲的内容,说下参数,参数1:图标的资源id,参数2:图标显示的名称,参数3:图标对应要启动的PendingIntent

2.2当你创建通知的时候会使用到Notification.常用到的方法如下:

当你使用builder构建出一个Notification的时候,也可以更改一些参数:
notification.flags = Notification.FLAG_AUTO_CANCEL; 设置提醒标识符,具体参数:

  • Notification.FLAG_SHOW_LIGHTS 三色灯提醒,在使用三色灯的时候必须添加的标识符
  • Notification.FLAG_ONGOING_EVENT 发起正在运行事件(活动中)
  • Notification.FLAG_INSISTENT 让声音震动无线循环,直到用户相应(取消或者打开)
  • Notification.FLAG_ONLY_ALERT_ONCE 发起Notification后,铃声和震动只执行一次
  • Notification.FLAG_AUTO_CANCEL 用户单机通知后自动消失
  • Notification.FLAG_NO_CLEAR 只有全部清除时,Notification才会清除(QQ通知无法删除,用的就是这个)
  • Notification.FLAG_FOREGROUND_SERVICE 表示正在运行的服务

3.进阶使用

3.1 自定义的通知栏效果(RemoteViews)

Notification的自定义布局是RemoteViews,和其他RemoteViews一样,在自定义视图布局文件中,仅支持FrameLayout、LinearLayout、RelativeLayout三种布局控件和AnalogClock、Chronometer、Button、ImageButton、ImageView、ProgressBar、TextView、ViewFlipper、ListView、GridView、StackView和AdapterViewFlipper这些显示控件,不支持这些类的子类或Android提供的其他控件。否则会引起ClassNotFoundException异常

一般的步骤如下:

  1. 创建自定义视图
  2. 获取远程视图对象
  3. 设置PendingIntent来相应事件
  4. 发起Notification

3.1.1自定义带按钮的通知栏

  • 创建自定义视图,这里的布局就是一个随便的布局,但是其实你写太大也没有用,这个后面讲.

    RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.view_custom_button);
    
  • 获取远程视图对象
    这里说明一下,前面那个ID是视图中定义的ID,其实这里设置所有内容,都需要根据ID匹配,然后进行设置的,也算是提供的方法了,这里就不要去纠结了.

    • 设置图片

      remoteViews.setImageViewResource(R.id.custom_song_icon, R.drawable.ic_launcher_background);
      
    • 设置监听事件

      remoteViews.setOnClickPendingIntent(R.id.btn_1, pendingIntent);
      
  • 设置相应的pendingIntent,其实和上面设置PendingIntent的方法一样,这里就不去写了.

  • 发起Notification

            Notification notification = builder.setContent(remoteViews)
                    .setWhen(System.currentTimeMillis())
                    .setTicker("正在播放")
                    .setSmallIcon(R.drawable.ic_stat_name)
                    .build();
            notification.flags = Notification.FLAG_AUTO_CANCEL;
    
            mManager.notify(2, notification);
    

其实别的方法都差不多,就是这里注意一下涉及资源的时候,其他的都是一样的.

3.1.2不带按钮的通知栏

其实和上面的都差不多,只是没有的相应的PendingIntent,多了一个设置文字的方法,这里就直接贴代码了!

        //先设定RemoteViews  
        RemoteViews view_custom = new RemoteViews(getPackageName(), R.layout.custom);  
        //设置对应IMAGEVIEW的ID的资源图片  
        view_custom.setImageViewResource(R.id.custom_icon, R.drawable.icon);  
        view_custom.setTextViewText(R.id.custom_title, "标题");  
        view_custom.setTextViewText(R.id.custom_content, "显示的内容"); 

3.2大图风格通知(4.1之前的版本不支持此功能)

只有在通知栏被展开时显示,何时展开呢?通知栏处在顶端,或者用户通过手势展开的时候显示.分为几种效果,但是写法其实都差不多,下面说说这几种风格,其实这些风格,比普通视图多出一个详情区域!

  • NotificationCompat.BigPictureStyle 大图片风格:详情区域包含一个256dp高度的位图
  • NotificationCompat.BigTextStyle 大文字风格:显示一个大的文字块
  • NotificationCompat.InboxStyle 收件箱风格:显示多行文字
  • NotificationCompat.MediaStyle 音乐风格:显示音乐风格(这个风格特殊说明一下, 出现的是一些列的图标,可以给相应的图标设置相应的事件,这些事件是添加到相应的NotificationCompat.Builder.setStyle()去添加的,最多可以添加5个),这个类是v7包下的

但是这个详情区域出现的方式各不相同,我的手机是按住下拉,有的手机是点击之后出现,有的是直接出现,这里自己多尝试一下就知道了!

3.2.1各个版本中的公共方法和各自的方法

先说一下公共方法!

  • setBigContentTitle("") 大通知栏的标题
  • setSummaryText("") 末尾只一行的文字内容

其他都是单独存在的方法!

  • NotificationCompat.BigPictureStyle
    • bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.small)) 添加一张相应的图片
  • NotificationCompat.BigTextStyle
    • bigText() 添加相应文字的方法
  • NotificationCompat.InboxStyle
    • addLine("") 直接添加每行的显示内容
      -NotificationCompat.MediaStyle
    • setMediaSession(new MediaSessionCompat(this,"MediaSession",new ComponentName(MainActivity.this,Intent.ACTION_MEDIA_BUTTON),null).getSessionToken());
    • setCancelButtonIntent(pendingIntent) 在5.0以下有效,设置取消后的意图
    • setShowCancelButton(boolean) 会在通知栏的右上部分显示一个删除图标5.0一下有效
    • setShowActionInCompactView(2,3) 添加action所在的action组的数组的下标,从0开始,低版本上也可以显示

这个我觉得应该贴一下代码了!

    private void mediaStyle(){
        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
        builder.setContentTitle("MediaStyle");
        builder.setContentText("Song Title");
        builder.setSmallIcon(R.mipmap.ic_launcher);
        builder.setLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.notification));
        builder.setDefaults(NotificationCompat.DEFAULT_ALL);
        Intent intent = new Intent(this,ImageActivity.class);
        PendingIntent pIntent = PendingIntent.getActivity(this,1,intent,0);
        builder.setContentIntent(pIntent);
        //第一个参数是图标资源id 第二个是图标显示的名称,第三个图标点击要启动的PendingIntent
        builder.addAction(R.drawable.ic_previous_white,"",null);
        builder.addAction(R.drawable.ic_stop_white,"",null);
        builder.addAction(R.drawable.ic_play_arrow_white_18dp,"",pIntent);
        builder.addAction(R.drawable.ic_next_white,"",null);
        NotificationCompat.MediaStyle style = new NotificationCompat.MediaStyle();
        style.setMediaSession(new MediaSessionCompat(this,"MediaSession",
                new ComponentName(MainActivity.this,Intent.ACTION_MEDIA_BUTTON),null).getSessionToken());
        //CancelButton在5.0以下的机器有效
        style.setCancelButtonIntent(pIntent);
        style.setShowCancelButton(true);
        //设置要现实在通知右方的图标 最多三个
        style.setShowActionsInCompactView(2,3);
        builder.setStyle(style);
        builder.setShowWhen(false);
        Notification notification = builder.build();
        manger.notify(TYPE_Media,notification);
    }

最后通过NotificationCompat.Builder.setStyle()设置进去就可以了

4.类似与QQ的在手机屏幕顶端出现的通知(只有在5.0以上系统中有效哦)

NotificationCompat.Builder.setFullScreenIntent(pIntent,true);

4.常见的问题

4.1如何取消掉通知栏上的通知

  1. 设置相应的flags = FLAG_AUTO_CANCEL
  2. 通过手动调用NotificationManager.cancle()方法关闭指定的通知或者通过NotificationManager.cancleAll()关闭所有通知.

关于常见的问题,等到以后用到的时候在去好好总结以下,现在总结的话或许会不那么完全,当你读到这篇文章后,要是有什么问题请和我联系,我会及时帮助你解决的,也能促进自己的提高...

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

推荐阅读更多精彩内容