安卓 Notification,希望一篇就够

2,144 阅读5分钟
原文链接: www.jianshu.com

我学习最快的方法就是先看效果,再想原理最后,将它实现。效果是最直观的,而且能够有效的判断所学的东西是不是想要的。现在网上的资料实在太杂,很多花了很多时间去研究,最后发现坑爹了,不是想要的。这篇文章首先会介绍能实现的主要功能。然后是解决问题的基本思想,接着是具体的一些实现。本篇文章和以前的风格有所不同,以前都是文章中代码比较少,附上demo,但发现这样可能不方便读者,所以采用了实现效果以及主要代码的形式。这种方式现在还在测试阶段,如果觉得以前的模式比较好或者其他更好的方式的话可以給我留言,以后的文章会做出相应的调整 。
一、常见使用 使用实现步骤:
1、准备跳转的intent ;
2、配置NotificationCompat.Builder;
3、发送通知 ;

1.最简单的通知
实现效果


普通的通知
//准备跳转的Intent 
Intent jumpIntent=new Intent(context, MainActivity.class); 
jumpIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
//准备PendingIntent
 final PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, jumpIntent, PendingIntent.FLAG_UPDATE_CURRENT);
 //配置 NotificationCompat.Builder NotificationCompat.Builder builder = new NotificationCompat.Builder(context); 
builder.setContentText(content)//设置内容
       .setContentTitle(title) //设置标题
       .setTicker(content) //设置状态栏的信息
       .setSmallIcon(R.mipmap.app_icon); 
       .setPriority(NotificationCompat.PRIORITY_MAX);//设置广播的优先级
 builder.setDefaults(Notification.DEFAULT_ALL);//设置通知的行为,例如声音,震动等
 //发通知
 final int mNotificationId = 1001; 
NotificationManager mNotifyMgr =(NotificationManager) context.getSystemService( Context.NOTIFICATION_SERVICE); 
mNotifyMgr.notify(mNotificationId, builder.build());

2.宽视图文字样式

实现效果:


折叠效果

展开效果
Intent jumpIntent=new Intent(context, MainActivity.class); 
jumpIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP);
 //准备PendingIntent
 final PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, jumpIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
//配置 NotificationCompat.Builder NotificationCompat.Builder builder = new NotificationCompat.Builder(context); 
builder.setContentText(content) 
          .setContentTitle(title) 
          .setTicker(content) //设置状态栏的信息      
          .setSmallIcon(R.mipmap.app_icon); 
          .setPriority(NotificationCompat.PRIORITY_MAX);//设置广播的优先级 
          .setDefaults(Notification.DEFAULT_ALL);//设置通知的行为,例如声音,震动等 
//有区别的地方 NotificationCompat.BigTextStyle bigTextStyle=new NotificationCompat.BigTextStyle(); 
bigTextStyle.bigText(bigContent); 
bigTextStyle.setBigContentTitle(title);
 builder.setStyle(bigTextStyle);
 builder.setContentText(content); 
//发通知 final int mNotificationId = 1001; 
NotificationManager mNotifyMgr =(NotificationManager) context.getSystemService( Context.NOTIFICATION_SERVICE); 
mNotifyMgr.notify(mNotificationId, builder.build());

3、宽视图图片模式
实现效果


折叠效果

展开效果
 Intent jumpIntent=new Intent(context, MainActivity.class); 
jumpIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
//准备PendingIntent 
final PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, jumpIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
//配置 NotificationCompat.Builder NotificationCompat.Builder builder = new NotificationCompat.Builder(context); 
builder.setContentText(content) 
       .setContentTitle(title) 
       .setTicker(content) //设置状态栏的信息  
       .setSmallIcon(R.mipmap.app_icon);    
       .setPriority(NotificationCompat.PRIORITY_MAX);//设置广播的优先级 
       .setDefaults(Notification.DEFAULT_ALL);//设置通知的行为,例如声音,震动等 
//有区别的地方 NotificationCompat.BigPictureStyle bigPictureStyle = new NotificationCompat.BigPictureStyle(); 
bigPictureStyle.bigPicture(resource); 
builder.setStyle(bigPictureStyle);
 //发通知 final int mNotificationId = 1001; 
NotificationManager mNotifyMgr =(NotificationManager) context.getSystemService( Context.NOTIFICATION_SERVICE); 
mNotifyMgr.notify(mNotificationId, builder.build());

4.自定义
普通通知 实现效果 本来是想实现一个音乐播放器的,最后懒于找图标就实现了一个和普通通知一样的效果(原谅我的懒惰)


自定义
Intent jumpIntent=new Intent(context, MainActivity.class); 
jumpIntent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP | Intent.FLAG_ACTIVITY_CLEAR_TOP); 
//准备PendingIntent
 final PendingIntent pendingIntent = PendingIntent.getActivity(context, 0, jumpIntent, PendingIntent.FLAG_UPDATE_CURRENT); 
//配置 NotificationCompat.Builder NotificationCompat.Builder builder = new NotificationCompat.Builder(context); 
builder.setContentText(content) 
       .setContentTitle(title)
       .setTicker(content) //设置状态栏的信息 
       .setSmallIcon(R.mipmap.app_icon);    
       .setPriority(NotificationCompat.PRIORITY_MAX);//设置广播的优先级
       .setDefaults(Notification.DEFAULT_ALL);//设置通知的行为,例如声音,震动等
 //有区别的地方
 RemoteViews remoteViews=new  RemoteViews(context.getPackageName(), R.layout.widget_notification);//自定义布局 
//自定义布局中的图片 
remoteViews.setImageViewBitmap(R.id.iv_notification,resource); //自
定义布局中的文字 
remoteViews.setTextViewText(R.id.tv_notification_title,title); 
remoteViews.setTextViewText(R.id.tv_notification,content); builder.setContent(remoteViews);
 //可以设置成折叠模式,但得判断一下sdk,大于16才能使用
 // builder.setCustomBigContentView(remoteViews);

二、提升逼格
1、字体适配背景色 适配原因:当自定义布局时,自定义的颜色很可能会和背景类似导致,看不清楚 适配方法:设置成系统默认系统背景, 字体颜色 说一下网上的常用方法 5.0一下:

 

5.0以上:
1.新建layout-v21文件夹
2.代码设置

 

虽然看上去挺靠谱,但其实这样适配是有问题的
1三星 系统5.0


适配前

适配后

2.华为 系统5.1


适配前

适配后


3.小米 系统6.0


适配前

适配后

看了这几张图,就一个感觉摔手机,就一个通知弄出这么多的差异,这不坑人嘛。生无可念。而且坑爹的是适配以后效果更差了,适配的方法一点都靠谱,但网上一直使用着,着说明中间一定出现问题了,仔细一想,原生的在API21之前默认是黑色背景,之后默认是黑色背景。在一看配置果然有问题targetSdkVersion=19。也就是按api19来处理的,所以三星的才是黑色。于是把targetSdkVersion换成了21果然好使


适配后


于是,想华为的可能是这样,但残酷的现实告诉我华为的并没有按照规范,虽然5xitong.0以上了,但是它并没有按照规范来。哭死算了。综上几个测试,感觉还是暂时不要用这种方法适配。

2.设置控件的点击事件 应用场景,播放器,常用的通知一般都是点一下就去某一个页面。而像酷我这样的播放器通常是有一些按钮,按钮有相应的事件,比如切换歌曲,暂停播放等。

 remoteViews.setOnClickPendingIntent() 
//这个方法有两个参数,控件id和PendingIntent

3.代码中设置控件颜色
//第一个参数是控件名称,第二个是控件的方法,第三个是具体的值,使用时需要注意, 控件包含这个方法。否则可能导致整个通知不显示

remoteViews.setInt(R.id.tv_notification,"setTextColor", Color.parseColor("#00ff00"));

改变颜色

这里单独提到这个是想通过这个方法去适配通知,比如代码中根据不同的api级别设置不同的颜色。但想一想安卓的碎片化也就放弃了。但用这个方法去实现一些个性话的样式还是不错的
4.设置图标(360手机助手不同的通知图标)

//第一个参数控件id,第二个参数bitmap 
remoteViews.setImageViewBitmap(R.id.iv_notification,resource);
 //这里可以在推送内容中加上不同的网址,实现360手机助手的不同通知图标的效果

三、小福利
文章最后送上一个现在正在使用的推送格式

 { "title": "标题", 
   "type": "2",//type 打开不同页面 
   "content": "普通的消息内容", 
   "isClick":"true",//是否要点击事件
   "bigContent": "长内容", 
   "bigImageUrl":""//大图片地址 
   "iconUrl":""//图标地址(可以用于实现360手机助手不同图标)
   "webUrl": "https://www.baidu.com" }

四、后记 本篇文章没有demo,没错就是没有(任性一回),本篇文章是一个新的尝试,如果你觉得以前的风格比较好或者有更好的风格可以給我建议。