我学习最快的方法就是先看效果,再想原理最后,将它实现。效果是最直观的,而且能够有效的判断所学的东西是不是想要的。现在网上的资料实在太杂,很多花了很多时间去研究,最后发现坑爹了,不是想要的。这篇文章首先会介绍能实现的主要功能。然后是解决问题的基本思想,接着是具体的一些实现。本篇文章和以前的风格有所不同,以前都是文章中代码比较少,附上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一下:
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/notification_widget_title"
android:textAppearance="@style/TextAppearance.StatusBar.EventContent" android:textSize="@dimen/d14sp"/>
5.0以上:
1.新建layout-v21文件夹
2.代码设置
<TextView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/notification_widget_title"
android:textAppearance="@android:style/TextAppearance.Material.Notification.Title" android:textSize="14sp"/>
虽然看上去挺靠谱,但其实这样适配是有问题的
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,没错就是没有(任性一回),本篇文章是一个新的尝试,如果你觉得以前的风格比较好或者有更好的风格可以給我建议。
网友评论
楼主的风格,我喜欢!