美文网首页
Android中通知的使用

Android中通知的使用

作者: 笔墨Android | 来源:发表于2017-12-16 21:25 被阅读0次

    不怕跌倒,所以飞翔

    参考文献:
    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()关闭所有通知.

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

    相关文章

      网友评论

          本文标题:Android中通知的使用

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