Notification也是我学习安卓以来遇到过的一个大坑,各种方法弃用,各种查资料。哎,说多了都是泪。终于可以告一段落,之前也写过Notification的内容,但是是插在一个项目里,这次就单独拿出来,虽然只是代码段,但是我都是测试过的哟。
首先,还是理一下思路:
1、创建Notification
Notification的创建有两种,第一种是直接创建
Notification notification = new Notification();
然后开始在notification下添加参数,但是这种创建方法里有很多参数方法被弃用了,Google现在推荐我们使用构造器来创建,我们主要就是来看下构造器,构造器没啥参数,直接new出来就可以了
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
构造器完成后,我们就开始通过构造器添加参数
builder.setCustomContentView(remoteViews);
这是用来配置自定义布局,参数是一个RemoteViews,再来看RemoteViews的创建
RemoteViews remoteViews = new RemoteViews(getPackageName(), R.layout.layout_notification);
remoteViews.setTextViewText(R.id.TV_Notification, "这是一个测试");
remoteViews.setImageViewResource(R.id.IV_Notification, R.mipmap.ic_launcher);
构造函数的第一个参数是包名,第二个参数是布局资源
RemoteViews的方法还是很简单的,他给我们封装了设置内部控件属性的方法。一个资源ID对应一个值,对于布局内部的按钮也是可以设置点击事件的,我就不解释了。
然后我再列一些普通常用的属性
- builder.setContentTitle("播放音乐")
- .setTicker("通知来啦")
- .setSmallIcon(R.mipmap.ic_launcher)
- .setContentText(saved_FilePath)
- .setAutoCancel(true)
- .setNumber(1)
- .setSound(Uri.parse(saved_FilePath))
- .setPriority(NotificationCompat.PRIORITY_MAX)
- .setContentIntent(pendingIntent);
标题;下拉提示;小图标;内容;点击自动取消;设置id编号;设置提示音;设置优先级;设置点击事件
这里面讲几个点,第一个是音乐,setSound可以是自定义也可以通过默认设置,但是如果自定义那需要的是一个URI,这里的saved_FilePath是一个存放在内部存储里的音乐文件的绝对路径。
第二个要讲的就是PandingIntent看一下他的构造方式
PendingIntent pendingIntent = PendingIntent.getActivity();
他也是通过给定的构造方法来返回一个配置好的PendingIntent,再来看下getActivity方法
public static PendingIntent getActivity(Context context, int requestCode, Intent intent, @Flags int flags)
第一个参数Context大家都懂,第二个参数,是一个标识,用来标识发送者(文档说这个不是很重要),第三个就是一个正常的Intent,最后一个旗帜标识我来列一下
FLAG_ONE_SHOT, FLAG_NO_CREATE, FLAG_CANCEL_CURRENT, FLAG_UPDATE_CURRENT,这些标识的对象都是Notification点击后的效果
1、只能生效一次。
2、没效果
后面两个有点小复杂,都是在同一个Notification触发了好多次的情况下使用
3、当Notification已存在,新来的消息自动取消,PendingIntent维持原状
4、这个就是后来的覆盖原来的
最后就是builder.build()他会返回一个notification对象,并且按照我们的设置的模板已经配置好的
好了,到这里创建就讲完了,其他细节,之后慢慢补充
然后就是调用
这里就要讲两个启动方法
一、作为普通提醒启动
那就要用到之前的NotificationManager
notificationManager.notify(1, builder.build());
如果你在线程里修改了数据,可以再次调用notify去更新数据,不然新数据不生效的,注意不要再主线程里做这个延时的操作哦
二、就是作为前台服务
这个其实比之前的简单,他都不需要NotificationManager
startForeground(1,builder.build());
参数都是一模一样的,当然作用也是一样的,当然要更新数据也是需要再次调用的哦
好了 这篇就到这里 感觉 不错哦