美文网首页
Android 之 Notification

Android 之 Notification

作者: 帅气的欧巴 | 来源:发表于2016-08-22 18:22 被阅读750次

    Notification在手机的运用中是很常见的,当我们收到一个短信时,就会在我们的通知栏显示一个消息的图标和简单信息用来提示我们,这种提示就是采用的Notification来实现的。它还有其它的形式,比如下载的进度条式提示,悬挂,折叠等。
    Notification 常见作用
    1.显示接收到短消息、即使消息等信息 (如QQ、微信、新浪、短信)
    2.显示客户端的推送消息(如有新版本发布,广告,推荐新闻等)
    3.显示正在进行的事物(例如:后台运行的程序)(如音乐播放器、版本更新时候的下载进度等)

    首先要介绍一个PendingIntent
    PendingIntent,跟Intent相似,Intent 是即时启动,intent 随所在的activity 消失而消失,而PendingIntent它不是马上被调用,它主要用于即将发生的事情,我们可以在Notification中给定指定的事件,当用户触发事执行某一些事件。

    一、普通通知#####

    首先创建生成器对象,用的PendingIntent控制跳转,这里跳转到网页

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
    

    进行简单的属性配置

    //小图标设置
    mBuilder.setSmallIcon(R.mipmap.ic_launcher); 
    //设置大图标
    mBuilder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.lanucher));
    //内容标题
    mBuilder.setContentTitle("这是一个标题:"+mNotificationId);  
    //内容文本   
    mBuilder.setContentText("这是内容:"+mNotificationId);       
    //设置数字 右下角
    mBuilder.setNumber(mNotificationId);          
    //设置点击 自动消失              
    mBuilder.setAutoCancel(false);                               
    

    创建PendingIntent 并设置(setContentIntent)

    Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com"));
    PendingIntent pendingIntent = PendingIntent.getActivity(this,
                    REQUEST_CODE,
                    intent,
                    PendingIntent.FLAG_UPDATE_CURRENT);
    //设置PendingIntent
    mBuilder.setContentIntent(pendingIntent);
    

    获取NotificationManager通过NotificationManager进行通知发布

    NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
     // 利用通知管理器去发布通知
    notificationManager.notify(mNotificationId,mBuilder.build());
    

    此处mNotificationId为int类型的,如果两次通知使用同一个mNotificationId 那么将会刷新上一个通知,如果不一样,那么会另外开起一个通知。

    二、大文本模式#####
      NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
            //属性配置
            mBuilder.setSmallIcon(R.mipmap.ic_launcher);
    //        mBuilder.setNumber(mNotificationId);  //设置数字 右下角  如果设置 会多处一行
            mBuilder.setAutoCancel(false);         //设置点击 自动消失
            mBuilder.setDefaults(Notification.DEFAULT_ALL);
            //自定义 意图
            Intent intentCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
            PendingIntent pendingIntentCamera = PendingIntent.getActivity(this,
                    REQUEST_CODE,
                    intentCamera,
                    PendingIntent.FLAG_UPDATE_CURRENT
                    );
            mBuilder.addAction(R.drawable.ic_camera,"拍照1",pendingIntentCamera);
            mBuilder.addAction(R.drawable.ic_camera,"拍照2",pendingIntentCamera);
            mBuilder.addAction(R.drawable.ic_camera,"拍照3",pendingIntentCamera);
            //大视图设置
            NotificationCompat.BigTextStyle bigTextStyle = new NotificationCompat.BigTextStyle();
            bigTextStyle.bigText("大文本:在使用NotificationManager.notify()发送通知的时候,需要传递一个标识符,用于唯一标识这个通知。对于有些场景,并不是无限的添加新的通知,有时候需要更新原有通知的信息,这个时候可以重写构建Notification,而使用与之前通知相同标识符来发送通知,这个时候旧的通知就被被新的通知所取代,起到更新通知的效果。"+mNotificationId);
            bigTextStyle.setBigContentTitle("大标题:"+mNotificationId);
            mBuilder.setStyle(bigTextStyle);
    
            //创建PendingIntent
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com"));
            PendingIntent pendingIntent = PendingIntent.getActivity(this,
                    REQUEST_CODE,
                    intent,
                    PendingIntent.FLAG_UPDATE_CURRENT);
            NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    
            //设置内容响应意图
            mBuilder.setContentIntent(pendingIntent);
            //设置删除时的意图
            mBuilder.setDeleteIntent(pendingIntent);
    
            // 利用通知管理器去发布通知
            notificationManager.notify(mNotificationId,mBuilder.build());
    
    大文本模式

    三、大图模式

    NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
            //属性配置
            mBuilder.setSmallIcon(R.mipmap.ic_launcher);
            mBuilder.setNumber(mNotificationId);  //设置数字 右上角
            mBuilder.setAutoCancel(false);         //设置点击 自动消失
            mBuilder.setDefaults(Notification.DEFAULT_ALL); //设置通知到达 声音 震动 灯光 等
            mBuilder.setContentText("这是内容:"+mNotificationId);
    
            //大图片设置
            NotificationCompat.BigPictureStyle bigPictureStyle = new NotificationCompat.BigPictureStyle();
            bigPictureStyle.setBigContentTitle("大图片");
            bigPictureStyle.setSummaryText("SummarSummarySummarySummarySummarySummarySummarySummarySummarySummarySummarySummarySummarySummaryy");
            bigPictureStyle.bigLargeIcon(BitmapFactory.decodeResource(getResources(),R.drawable.ic_cancel));
            bigPictureStyle.bigPicture(BitmapFactory.decodeResource(getResources(),R.drawable.image));
            mBuilder.setStyle(bigPictureStyle);
    
            //创建PendingIntent
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com"));
            PendingIntent pendingIntent = PendingIntent.getActivity(this,
                    REQUEST_CODE,
                    intent,
                    PendingIntent.FLAG_UPDATE_CURRENT);
            NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            //设置内容响应意图
            mBuilder.setContentIntent(pendingIntent);
            //设置删除时的意图
            mBuilder.setDeleteIntent(pendingIntent);
            // 利用通知管理器去发布通知
            notificationManager.notify(mNotificationId,mBuilder.build());
    
    大图模式
    四、进度条模式#####
     final NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this);
            //属性配置
            mBuilder.setSmallIcon(R.mipmap.ic_launcher);
            mBuilder.setContentTitle("正在下载:"+mNotificationId);
            mBuilder.setNumber(mNotificationId);  //设置数字 右下角
            mBuilder.setAutoCancel(false);         //设置点击 自动消失
            final NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
            new Thread(
                    new Runnable() {
                        @Override
                        public void run() {
    
                            //定义临时变量记录 保证每个线程 单独存在 作为BUG介绍
                            int tempID = mNotificationId;
    
                            int incr;
                            // 循环 刷新 通知
                            for (incr = 0; incr <= 100; incr+=5) {
    
                                mBuilder.setContentText("下载进度:"+incr+"%");
                                //第一个参数:进度指示器设置为最大值
                                //第二个参数:当前完成百分比
                                //第三个参数:活动指示器启用 如果true 那么会是一个进度展示
                                mBuilder.setProgress(100, incr, true);
                                // 显示进度条
                                notificationManager.notify(tempID, mBuilder.build());
    
                                try {
                                    // 睡眠一段时间,此处应该是你的耗时下载
                                    Thread.sleep(1*1000);
                                } catch (InterruptedException e) {
                                    Log.d(TAG, "sleep failure");
                                }
                            }
                            //当循环结束后,更新通知,移除 ProgressBar
                            mBuilder.setContentText("下载成功").setProgress(0,0,false);    
                            notificationManager.notify(tempID, mBuilder.build());
                        }
                    }
            ).start();
    
    进度显示
    五、自定义模式(折叠模式)#####
    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
            //自定义UI 如果不设置smallIcon不会提示
            builder.setSmallIcon(R.mipmap.ic_launcher);
            builder.setAutoCancel(true);
    
            //自定义通知栏使用
            RemoteViews remoteViews = new RemoteViews(getPackageName(),R.layout.layout_ui_big);
            //设置TextView的文本
            remoteViews.setTextViewText(R.id.left_tv,"这是左边的文字");
            //设置某个资源,某个资源所使用的方法,该方法的参数
            remoteViews.setInt(R.id.left_tv,"setTextColor",getResources().getColor(R.color.colorAccent));
            remoteViews.setTextViewText(R.id.right_tv,"这是右边的文字");
            //设置某个ImageView的图片
            remoteViews.setImageViewResource(R.id.middle_image,R.drawable.ic_cancel);
    
    
            PendingIntent pendingIntent = PendingIntent.getActivity(this,0,new Intent(Intent.ACTION_VIEW, Uri.parse("http://www.baidu.com")),PendingIntent.FLAG_CANCEL_CURRENT);
            remoteViews.setOnClickPendingIntent(R.id.middle_image,pendingIntent);
    
            builder.setContent(remoteViews);                //默认情况下通知高度为64dp
        
            builder.setCustomBigContentView(remoteViews);   //注意bigContentView 的最大高度是250dp
    
            NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);
    
    
            /**
             * builder.setLights(intledARGB ,intledOnMS ,intledOffMS );
             *  android支持三色灯提醒,这个方法就是设置不同场景下的不同颜色的灯。
             *  其中ledARGB 表示灯光颜色、 ledOnMS 亮持续时间、ledOffMS 暗的时间。
             */
            builder.setLights(0xff0000ff, 300, 0);
    
            /**
             * 设置震动效果 实现效果:延迟0ms,然后振动300ms,在延迟500ms,接着在振动700ms。
             */
            builder.setVibrate(new long[] {0,300,500,700});
    
            /**
             *  设置声音 builder.setSound(Uri sound);
             *  获取自定义铃声
             *  builder.setSound(Uri.parse("file:///sdcard/xx/xx.mp3"));
             *  获取Android多媒体库内的铃声 数字字符串表示 声音在数据库中的位置
             */
            builder.setSound(Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI, "5"));
    
            /**
             * setOngoing(boolean ongoing)
             *
             * 设置该属性true 通知不可滑动删除
             *
             * 功能:设置为ture,表示它为一个正在进行的通知。
             * 他们通常是用来表示一个后台任务,用户积极参与(如播放音乐)或以某种方式正在等待,因此占用设备(如一个文件下载,同步操作,主动网络连接)
             */
            builder.setOngoing(false);
    
    
            /**
             * setProgress(int max, int progress,boolean indeterminate)
             * 属性:
             * max:进度条最大数值
             * progress:当前进度、
             * indeterminate:表示进度是否不确定,true为不确定,false为确定
             * 功能:设置带进度条的通知,可以在下载中使用
             */
    
            // 利用通知管理器去发布通知
            Notification build = builder.build();
            /**
             * 设置标记
             */
            build.flags=Notification.FLAG_AUTO_CANCEL|Notification.DEFAULT_SOUND;
    
    
            notificationManager.notify(mNotificationId,builder.build());
    
    折叠时 展开时
    六、悬挂式Notification

    悬挂式Notification是android5.0新增加的方式,和前两种显示方式不同的是,前两种需要下拉通知栏才能看到通知,而悬挂式Notification不需要下拉通知栏就直接显示出来悬挂在屏幕上方并且焦点不变仍在用户操作的界面因此不会打断用户的操作,过几秒就会自动消失。
    和前两种Notification不同的是,他需要调用setFullScreenIntent来将Notification变为悬挂式Notification

    //如果描述的PendingIntent已经存在,则在产生新的Intent之前会先取消掉当前的 PendingIntent hangPendingIntent = PendingIntent.getActivity(this, 0, hangIntent, PendingIntent.FLAG_CANCEL_CURRENT);
    builder.setFullScreenIntent(hangPendingIntent, true);
    
    Paste_Image.png

    实现悬挂式通知完整代码

    Notification.Builder builder = new Notification.Builder(this);
    Intent mIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://blog.csdn.net/itachi85/"));
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, mIntent, 0);
    builder.setContentIntent(pendingIntent);
    builder.setSmallIcon(R.drawable.foldleft);
    builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.drawable.lanucher));
    builder.setAutoCancel(true);
    builder.setContentTitle("悬挂式通知"); //设置点击跳转 Intent hangIntent = new Intent();
    hangIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    hangIntent.setClass(this, MyNotificationActivity.class); //如果描述的PendingIntent已经存在,则在产生新的Intent之前会先取消掉当前的 PendingIntent hangPendingIntent = PendingIntent.getActivity(this, 0, hangIntent, PendingIntent.FLAG_CANCEL_CURRENT);
    builder.setFullScreenIntent(hangPendingIntent, true);
    notificationManager.notify(2, builder.build());
    

    以上的通知介绍,基本能完成绝大部分的工作需求。
    此处借用了的部分内容,大家也可以移步看看该作者写的简书

    七、Notification的显示等级

    android5.0加入了一种新的模式Notification的显示等级,共有三种:

    VISIBILITY_PUBLIC只有在没有锁屏时会显示通知

    VISIBILITY_PRIVATE任何情况都会显示通知

    VISIBILITY_SECRET在安全锁和没有锁屏的情况下显示通知

    设置非常简单只要调用setVisibility方法就可以了

    builder.setVisibility(Notification.VISIBILITY_PUBLIC);
    

    我在这里写了个方法来设置Notification等级,用radioGroup来演示Notification的各个显示等级。

    private void selectNotofovatiomLevel(Notification.Builder builder) {
            switch (radioGroup.getCheckedRadioButtonId()) {
                case R.id.rb_public:
                    builder.setVisibility(Notification.VISIBILITY_PUBLIC);
                    builder.setContentText("public");
                    break;
                case R.id.rb_private:
                    builder.setVisibility(Notification.VISIBILITY_PRIVATE);
                    builder.setContentText("private");
                    break;
                case R.id.rb_secret:
                    builder.setVisibility(Notification.VISIBILITY_SECRET);
                    builder.setContentText("secret");
                    break;
                default:
                    builder.setVisibility(Notification.VISIBILITY_PUBLIC);
                    builder.setContentText("public");
                    break;
    
            }
        }
    

    最后部分借鉴至刘望舒
    的Android5.x通知应用解析:
    http://www.jianshu.com/p/e766ce44268b

    相关文章

      网友评论

          本文标题:Android 之 Notification

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