Notification讲解

notification即通知在开发中很常见,在开发中我们根据需求要实现各种各样的通知,如普通通知、进度条通知、可展开的通知、媒体通知、自定义布局的通知。本篇文章就来讲解这些通知的实现。

普通通知

为了兼容性我们用v7包下的NotificationCompat 来实现通知,这个类是继承了·v4包下的NotificationCompat。下面先写一个简单的通知,再慢慢讲解。

    NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
                //标题
                builder.setContentTitle("通知标题");
                //内容
                builder.setContentText("通知内容");
                //副内容,文本摘要,
                builder.setSubText("文本摘要\n哈哈哈");
                //ContentInfo 在通知的右侧 时间的下面 用来展示一些其他信息
                builder.setContentInfo("info");
                //number设计用来显示同种通知的数量和ContentInfo的位置一样,如果设置了ContentInfo则number会被隐藏;测试发现在android 7.0版本及以上是不显示contentinfo和number的
                builder.setNumber(5);
                //小图标
                builder.setSmallIcon(R.mipmap.me_pressed);
                Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.mipmap.reward_normal);
                //大图标
                builder.setLargeIcon(bitmap);
                //是否会自动取消通知,ture的话点击就会取消掉,false就不会;不管设置true或false都会被通知栏里的删除按钮删除掉
                builder.setAutoCancel(true);
                //新消息提示,在5.0及以上版本没有效果
                builder.setTicker("你有新通知");
                //设置默认提示音、震动、呼吸灯
                builder.setDefaults(NotificationCompat.DEFAULT_ALL);
                //自定义提示声音,第一个参数是音频文件,第二个参数是声音类型
                //  builder.setSound(Uri.parse(""), NotificationCompat.STREAM_DEFAULT);
                //自定义震动 表示在100、300、500、700开始或者停止震动
                // long []vibrates={100,300,500,700};
                // builder.setVibrate(vibrates);
                //自定义呼吸灯 参数分别是颜色,呼吸灯显示时间300ms,呼吸灯关闭时间100ms
                //  builder.setLights(0x00ff00,300,100);


                //android 5.0开始通知可以显示在锁屏上
                //VISIBILITY_PRIVATE:显示基本信息,隐藏内容
                //VISIBILITY_PUBLIC显示全部信息
                //VISIBILITY_SECRET不显示任何信息
                builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
                //通知时间,默认是System.currentTimeMillis()
                builder.setWhen(System.currentTimeMillis());

                Intent intent = new Intent();
                intent.setAction("android.liu.xin.notification");
                intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
                PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);

                //点击通知后的意图可以是activity、service、broadcast
                builder.setContentIntent(pendingIntent);

              if (notificationManager == null) {
                  notificationManager= (NotificationManager)getSystemService(NOTIFICATION_SERVICE);
                }
               // 显示通知,第一个参数是通知id,第二个是通知notification

                notificationManager.notify(110, builder.build());
              //可以通过这个通知id,通过代码移除通知
               //notificationManager.cancel(int id);
               //或者notificationManager.cancelAll()移除所有通知

这就实现了一个普通的通知,通知显示效果如下图(各个android版本显示效果都有所差别):
android 7.0显示效果(华为)
这个是华为 android 7.0上的显示效果

android 5.0显示效果
这个是android 5.0虚拟机显示的效果

通知必须要设置小图标,否则会报错,标题和内容也应该设置,不然没啥意义,没有设置是空的。如果通知设置了activity的点击意图,在应用退出的情况下,点击通知到那个Activity再按返回键默认是返回桌面的。
那怎么设置可以让它返回到指定界面呢?可以通过以下代码进行设置:

<!--第一步在配置文件中,点击通知要跳转到那个Activity添加以下配置 
这个是android 4.1及以上设置点返回键后要调的Activity
android:parentActivityName=".SplashActivity"
            tools:targetApi="jelly_bean"
在android4.1以下设置  点返回键后要调的Activity:
  <meta-data android:name="android.support.PARENT_ACTIVITY"
                android:value=".SplashActivity"/>        
-->
 <activity android:name=".NotificationActivity"
            android:parentActivityName=".SplashActivity"
            tools:targetApi="jelly_bean">
            <intent-filter>
                <action android:name="android.liu.xin.notification"/>
                <category android:name="android.intent.category.DEFAULT"/>
            </intent-filter>
            <meta-data android:name="android.support.PARENT_ACTIVITY"
                android:value=".SplashActivity"/>
        </activity>            
//第二步再通过以下代码设置 TaskStackBuilder是android4.1才添加的api
 Intent intent = new Intent();
 intent.setAction("android.liu.xin.notification");
 intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
 PendingIntent pendingIntent = null;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN) {
    TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
    stackBuilder.addParentStack(NotificationActivity.class);
    stackBuilder.addNextIntent(intent);
    pendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
 } else {
   pendingIntent = PendingIntent.getActivity(this, 0, intent,   PendingIntent.FLAG_UPDATE_CURRENT);
        }
  //点击后的意图
builder.setContentIntent(pendingIntent);

这个只有在android4.1及以上按返回键才生效。

进度条通知

通过NotificationCompat.Builder的setProgress(int max,int progress,boolean indeterminate)方法来进行设置进度条,第一个参数是进度最大值,第二个参数是进度,第三个参数是是否是不明确的进度。
在Demo中我写了一个后台下载应用,可以在通知中查看下载进度的功能。下面是部分代码:

int progress = intent.getIntExtra("progress", 0);
            boolean iscomplet = intent.getBooleanExtra("iscomplete", false);
            int isSuccess = intent.getIntExtra("isSuccess", 0);
            if (notificationManager == null || progressBuilder == null) {
                notificationManager = (NotificationManager) context.getSystemService(context.NOTIFICATION_SERVICE);
                progressBuilder = new NotificationCompat.Builder(context);
                //取消显示通知时间
                //  progressBuilder.setShowWhen(false);
                progressBuilder.setTicker("下载中...");
                progressBuilder.setContentTitle("下载进度" + progress + "%");
                progressBuilder.setSmallIcon(R.mipmap.me_pressed);
                if (isSuccess == 1) {
                    //设置进度条
                    progressBuilder.setProgress(100, progress, false);
                    if (iscomplet) {
                        progressBuilder.setContentText("下载完成");
                        progressBuilder.setAutoCancel(true);
                        //设置是否是正在执行的通知,true的画就不能通过滑动或删除按钮删除
                        progressBuilder.setOngoing(false);
                        progressBuilder.setContentIntent(installApk(context));

                    } else {
                        progressBuilder.setAutoCancel(false);
                        progressBuilder.setOngoing(true);
                    }
                } else {
                    //取消进度条
                    progressBuilder.setProgress(0, 0, false);
                    progressBuilder.setContentText("下载失败");
                    progressBuilder.setAutoCancel(true);
                    progressBuilder.setOngoing(false);
                }

            } else {
                progressBuilder.setContentTitle("下载进度" + progress + "%");
                if (isSuccess == 1) {
                    progressBuilder.setProgress(100, progress, false);
                    if (iscomplet) {
                        progressBuilder.setContentText("下载完成");
                        progressBuilder.setAutoCancel(true);
                        progressBuilder.setOngoing(false);
                        progressBuilder.setContentIntent(installApk(context));
                    } else {
                        progressBuilder.setAutoCancel(false);
                        progressBuilder.setOngoing(true);
                    }
                } else {
                    progressBuilder.setProgress(0, 0, false);
                    progressBuilder.setContentText("下载失败");
                    progressBuilder.setAutoCancel(true);
                    progressBuilder.setOngoing(false);
                }
            }


            notificationManager.notify(120, progressBuilder.build());

效果如图:

进度通知

可展开的通知

可展开的通知有可展开的文本通知、可展开的图片通知、可展开的媒体通知。通过 NotificationCompat.Builder的setStyle()方法实现。支持android4.1及以上版本,在android4.1以下不显示展示的内容

BigTextStyle

可扩展文本通知

 NotificationCompat.BigTextStyle bigTextStyle = new NotificationCompat.BigTextStyle();
               //展开后的标题
                bigTextStyle.setBigContentTitle("展开后的标题");
                //这个setSubText很像。在android7.0它们显示的位置一样。两者都设置了只会显示setSubText
                bigTextStyle.setSummaryText("最后的总结");
                //设置可展开的文本
                bigTextStyle.bigText("展开后的内容解决解决军军军军军军军军军军军军军军军军军军军军军军军军军军军绝大多数少了SDK滴滴代驾开始了快速谁送的"
                );
                builder1.setStyle(bigTextStyle);

InboxStyle

可扩展文本通知
1. 每行内容过长时并不会自动换行
2. addline可以添加多行 测试发现只显示7行

 NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();
                inboxStyle.addLine("第一行");
                inboxStyle.addLine("第二行");
                inboxStyle.addLine("第三行");
                inboxStyle.addLine("第四行");
                inboxStyle.addLine("第五行");
                inboxStyle.addLine("第六行");

                inboxStyle.addLine("hjsdjkddddddddddddddddddddsdjkhddhdhhdh哈哈哈1订单的点点滴滴多");
                inboxStyle.addLine("第七行");
                inboxStyle.addLine("第八行");
                inboxStyle.addLine("第九行");
                inboxStyle.addLine("第十行");
                inboxStyle.addLine("第十一行");
                inboxStyle.setSummaryText("通知总结");
                inboxStyle.setBigContentTitle("展开通知标题");
                builder2.setStyle(inboxStyle);

MediaStyle

媒体通知,类似音乐播放器上的通知

//addAction方法也可以在普通样式用,使用后普通通知可以点击展开,展开部分会显示一排添加的图标,并且可以给每个图标设置不同的点击事件(PendingIntent) addAction支持android4.1及以上。
// 最多可以添加5哥action 并排显示在点击展开的部分 
 builder5.addAction(R.mipmap.pre, "", null);
 builder5.addAction(R.mipmap.start, "", null);
 builder5.addAction(R.mipmap.next, "", null);
 builder5.addAction(R.mipmap.me_pressed,"",null);
 builder5.addAction(R.mipmap.reward_normal,"",null);
 builder5.addAction(R.mipmap.ic_launcher,"",null);
 NotificationCompat.MediaStyle mediaStyle = new NotificationCompat.MediaStyle();
 //设置没展开时显示哪几个action 这里显示的是第0、1、2个
 mediaStyle.setShowActionsInCompactView(0,1, 2);
 //设置删除按钮意图 android5.0以下有效
 mediaStyle.setCancelButtonIntent(pendingIntent1);
 //设置是否显示删除按钮 android5.0以下有效
 mediaStyle.setShowCancelButton(true);
 mediaStyle.setMediaSession(new MediaSessionCompat(this, "mediaSession", new ComponentName(this, Intent.ACTION_MEDIA_BUTTON), null).getSessionToken());
                builder5.setStyle(mediaStyle);
builder5.setStyle(mediaStyle);                

效果图:
可展开的通知

横幅

横幅支持android5.0及以上版本,需要添加悬浮框权限。有的机型可能不适配

 builder4.setVisibility(NotificationCompat.VISIBILITY_PUBLIC);
 //第一个参数横幅跳的意图,第二个是设置是否是高优先级
 builder4.setFullScreenIntent(pendingIntent5, true);

通过以上代码设置可以横幅显示
效果图:
横幅通知

总结

通知就先介绍到这里了,下篇文章介绍RomoteViews和自定义通知。

Notification Demo

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值