android 自定义推送布局_Notification的基本用法以及使用RemoteView实现自定义布局-程序员宅基地

技术标签: android 自定义推送布局  

Notification的作用

Notification是一种全局效果的通知,在系统的通知栏中显示。既然作为通知,其基本作用有:

显示接收到短消息、即时信息等

显示客户端的推送(广告、优惠、新闻等)

显示正在进行的事物(后台运行的程序,如音乐播放进度、下载进度)

Notification的基本操作:

Notification的基本操作主要有创建、更新和取消三种。一个Notification的必要属性有三项,如果不设置的话在运行时会抛出异常:

小图标,通过setSmallIcon方法设置

标题,通过setContentTitle方法设置

内容,通过setContentText方法设置。

除了以上三项,其他均为可选项,不过一般而言,通知需要有交互的功能,所以一般Notification具有Action属性,这样就能跳转到App的某一个Activity、启动一个service或者发送一个Broadcast。

当系统受到通知时,可以通过震动、铃声、呼吸灯等多种方式进行提醒。

下面就从Notification的基本操作逐条介绍:

Notification的创建

Notification的创建过程主要涉及到Notification.Builder、Notification、NotificationManager

Notification.Builder:

使用建造者模式构建Notification对象。由于Notification.Builder仅支持Android4.1及之后的版本,为了解决兼容性的问题,使用V4兼容库中的NotifivationCompat.Builder类。

Notification:通知对应类,保存通知相关的数据。NotificationManager向系统发送通知时会用到。

NotificationManager:通知管理类,调用NotificationManager的notify方法可以向系统发送通知。

获取 NotificationManager 对象:

NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

前面讲到,Notification有三个必要属性以及一个很有必要的属性Action。下面我们就创建一个简单的Notification,主要有以下三步:

获取NotificationManager实例

实例化NotificationCompat.Builder并设置相关属性

通过builder.build方法来生成Notification对象,并发送通知

private voidsendNotification(){

Intent intent= new Intent(this,SettingsActivity.class);

PendingIntent mPendingIntent= PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_ONE_SHOT);

NotificationManager notificationManager=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

NotificationCompat.Builder builder= (NotificationCompat.Builder) new NotificationCompat.Builder(this)//设置小图标

.setSmallIcon(R.mipmap.ic_launcher)//点击后自动清除

.setAutoCancel(true)//设置通知标题

.setContentTitle("最简单的通知")//设置通知内容

.setContentText("真的很简单很简单很简单")//设置通知的动作

.setContentIntent(mPendingIntent)//设置通知时间,默认为系统发出通知的时间

.setWhen(System.currentTimeMillis());//第一个参数为Notification的id

notificationManager.notify(2,builder.build());

}

其中为了实现Action属性,我们需要创建Intent、PendingIntent和setContentIntent()这几步。

不难发现,其中的PendingIntent的设置才是其中的关键。

PendingIntent支持三种待定的意图:启动Activity,启动Service和发送Broadcast。对应于它的三个接口方法。

static PendingIntent

getActivity(Context context,int requestCode,Intent intent,int flags)

获取一个PendingIntent,该意图发生时,相当于Context.startActivity(Intent)

static PendingIntent

getService (Context context,int requestCode,Intent intent,int flags)

获取一个PendingIntent,该意图发生时,相当于Context.startService (Intent)

static PendingIntent

getBroadcast(Context context,int requestCode,Intent intent,int flags)

获取一个PendingIntent,该意图发生时,相当于Context.sendBroadcast(Intent)

其中context和intent不需要讲,主要说一下requestCode和flags。其中requestCode是PendingIntent发送发的请求码,多数情况下设置为0即可,requestCode会影响到flags的效果。

PendingIntent相同:Intent相同且requestCode也相同。(Intent相同需要ComponentName和intent-filter相同)

flags的常见类型有:

FLAG_ONE_SHOT:只能被使用一次,然后就会被自动cancel,如果后续还有相同的PendingIntent。那么他们的send方法就会调用失败。

FLAG_NO_CREATE:如果当前系统中不存在相同的PendingIntent对象,系统不会创建该PendingIntent对象,而是直接返回null。(很少使用)

FLAG_CANCEL_CURRENT:如果当前系统中已经存在一个相同的 PendingIntent 对象,那么就将先将已有的 PendingIntent 取消,然后重新生成一个 PendingIntent 对象。

FLAG_UPDATE_CURRENT:当前描述的PendingIntent如果已经存在,那么它们会被更新,即Intent中的Extras会被替换到最新的。

Notification的更新

更新通知的操作很简单,只需要再次发送一次相同ID的通知即可,如果之前的通知还没有被取消,则会直接更新该通知相关的属性;如果之前的通知已经被取消,则会重新创建一个新的通知。

更新通知和发送通知采用同样的方法。

Notification的取消

取消通知的方式主要有以下5种:

点击通知栏的清除按钮,会清除所有可清除的通知

设置了setAutoCancel()或者设置了flags为FLAG_AUTO_CANCEL的通知,点击通知时会自动清除。

通过NotificationManager调用cancel(int id)来取消指定id的通知

通过NotificationManager调用cancel(String tag,int id)方法清除指定Tag和ID的通知。

通过NotificationManager调用cancelAll()清除所有该应用之前发送的通知

如果是通过NotificationManager.notify(String tag, int id, Notification notify) 方法创建的通知,那么只能通过 NotificationManager.cancel(String tag, int id) 或cancelAll()方法才能清除对应的通知,调用NotificationManager.cancel(int id) 无效。

Notification的通知效果

前面提到了Notification的通知效果,有了通知效果更能提醒用户去查看Notification。

Notification的通知效果有震动、呼吸灯、铃声三种,可以通过builder中的setDefaults(int defaults)方法来设置,属性有以下四种,一旦设置了默认效果,自定义效果就会失效。

//添加默认震动效果,需要申请震动权限//

Notification.DEFAULT_VIBRATE//添加系统默认声音效果,设置此值后,调用setSound()设置自定义声音无效

Notification.DEFAULT_SOUND//添加默认呼吸灯效果,使用时须与 Notification.FLAG_SHOW_LIGHTS 结合使用,否则无效

Notification.DEFAULT_LIGHTS//添加上述三种默认提醒效果

Notification.DEFAULT_ALL

铃声:

//调用系统默认响铃,设置此属性后setSound()会无效//.setDefaults(Notification.DEFAULT_SOUND)//调用系统多媒体裤内的铃声//.setSound(Uri.withAppendedPath(MediaStore.Audio.Media.INTERNAL_CONTENT_URI,"2"));//调用自己提供的铃声,位于 /res/values/raw 目录下

.setSound(Uri.parse("android.resource://com.littlejie.notification/" + R.raw.sound))

震动:

long[] vibrate = new long[]{0, 500, 1000, 1500};//使用系统默认的震动参数,会与自定义的冲突//.setDefaults(Notification.DEFAULT_VIBRATE)//自定义震动效果

.setVibrate(vibrate);

呼吸灯

//ledARGB 表示灯光颜色、 ledOnMS 亮持续时间、ledOffMS 暗的时间

.setLights(0xFF0000, 3000, 3000);

另一种方式:

Notification notification =builder.build();//只有在设置了标志符Flags为Notification.FLAG_SHOW_LIGHTS的时候,才支持呼吸灯提醒。

notify.flags=Notification.FLAG_SHOW_LIGHTS;//设置lights参数的另一种方式//notify.ledARGB = 0xFF0000;//notify.ledOnMS = 500;//notify.ledOffMS = 5000;

还可以通过以下几种Flag来设置通知效果

//提醒效果常用 Flag//三色灯提醒,在使用三色灯提醒时候必须加该标志符

Notification.FLAG_SHOW_LIGHTS//发起正在运行事件(活动中)

Notification.FLAG_ONGOING_EVENT//让声音、振动无限循环,直到用户响应 (取消或者打开)

Notification.FLAG_INSISTENT//发起Notification后,铃声和震动均只执行一次

Notification.FLAG_ONLY_ALERT_ONCE//用户单击通知后自动消失

Notification.FLAG_AUTO_CANCEL//只有调用NotificationManager.cancel()时才会清除

Notification.FLAG_NO_CLEAR//表示正在运行的服务

Notification.FLAG_FOREGROUND_SERVICE

上面讲到的Notification的布局都是系统默认的,当然有时候处于需求,我们可能需要自定义Notification的布局。

那如何实现Notification的自定义布局呢?

这里就需要提出一个新的知识点RemoteView,望文生义,即远程View。

RemoteView表示的是一种View结构,它可以在其他进程中显示(具体来讲是SystemServer进程),由于它是在其他进程中显示,为了更新它的界面,我们不能简单地使用普通View的那一套方法,RemoteView提供了一系列Set方法用于更新界面。

下面就是一个简单的示例;

packagecom.pignet.remoteviewtest;importandroid.app.Notification;importandroid.app.NotificationManager;importandroid.app.PendingIntent;importandroid.content.Context;importandroid.content.Intent;importandroid.support.v7.app.AppCompatActivity;importandroid.os.Bundle;importandroid.view.View;importandroid.widget.Button;importandroid.widget.RemoteViews;public class MainActivity extendsAppCompatActivity {

@Overrideprotected voidonCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

Button btnNotification=(Button) findViewById(R.id.btn_notification);

btnNotification.setOnClickListener(newView.OnClickListener() {

@Overridepublic voidonClick(View v) {

sendNotification();

}

});

}private voidsendNotification(){

NotificationManager notificationManager=(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

Notification notification=newNotification();

notification.icon=R.mipmap.ic_launcher;

notification.when=System.currentTimeMillis();

notification.flags=Notification.FLAG_AUTO_CANCEL;//跳转意图

Intent intent= new Intent(this,SettingsActivity.class);//建立一个RemoteView的布局,并通过RemoteView加载这个布局

RemoteViews remoteViews= newRemoteViews(getPackageName(),R.layout.layout_notification);//为remoteView设置图片和文本

remoteViews.setTextViewText(R.id.message,"第一条通知");

remoteViews.setImageViewResource(R.id.image,R.mipmap.ic_launcher_round);//设置PendingIntent

PendingIntent pendingIntent= PendingIntent.getActivity(this,0,intent,PendingIntent.FLAG_UPDATE_CURRENT);//为id为openActivity的view设置单击事件

remoteViews.setOnClickPendingIntent(R.id.openActivity,pendingIntent);//将RemoteView作为Notification的布局

notification.contentView=remoteViews;//将pendingIntent作为Notification的intent,这样当点击其他部分时,也能实现跳转

notification.contentIntent=pendingIntent;

notificationManager.notify(1,notification);

}

}

有图:

03ac49d3a62cd0f22e1ebd7b2c3bd967.png

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_31512775/article/details/113558367

智能推荐

springaop无法拦截service方法中调用_aop 不能拦截service-程序员宅基地

文章浏览阅读1k次。问题描述:springaop无法拦截service方法中调用,在service类中方法A调用带有切面注解的方法B,切面失效问题分析:AOP底层实现: 拦截器的实现原理就是动态代理,实现AOP机制。Spring 的代理实现有两种:一是基于 JDK Dynamic Proxy 技术而实现的;二是基于 CGLIB 技术而实现的。如果目标对象实现了接口,在默认情况下Spring会采用JDK的动态代理实现AOP; ***总之是类(接口类)级别的代理***;解决思路: 只要将方法A调用方法B过程中添加_aop 不能拦截service

Java实现二维码批量生成_java批量生成二维码-程序员宅基地

文章浏览阅读645次。Java批量生成二维码实例_java批量生成二维码

CentOS8 安装数据库_centos8 安装vastbase数据库-程序员宅基地

文章浏览阅读961次。yum -y localinstall mysql80-community-release-el7-1.noarch.rpmpip3.6 install mycli_centos8 安装vastbase数据库

子类继承父类时各种属性的问题_一个子类继承另一个父类然后子类new对象属性分装不进去-程序员宅基地

文章浏览阅读2.2k次。普通属性子类可以继承父类的属性值,后续操作互不影响。静态属性:public class Main7 extends Father{ //static int test = 11; public static void main(String[] args) { test++; Father father = new Father(); System.out.printl..._一个子类继承另一个父类然后子类new对象属性分装不进去

摄像机内参与OpenGL_摄像机四个内参-程序员宅基地

文章浏览阅读2.4k次,点赞4次,收藏14次。参考转自:https://blog.csdn.net/yanglusheng/article/details/52268234https://blog.csdn.net/sunboyiris/article/details/780826991、 相机参数是三种不同的参数。相机的内参数是六个分别为:1/dx、1/dy、r、u0、v0、f。opencv1里的说内参数是4个其为fx、..._摄像机四个内参

随便推点

Day507.Linux下MySQL的安装与使用 -mysql-程序员宅基地

文章浏览阅读1.6k次,点赞6次,收藏12次。Linux下MySQL的安装与使用一、安装前说明1、Linux系统及工具的准备安装并启动好两台虚拟机: CentOS 7掌握克隆虚拟机的操作mac地址主机名ip地址UUID安装有 Xshell 和 Xftp 等访问CentOS系统的工具CentOS6和CentOS7在MySQL的使用中的区别防火墙:6是iptables,7是firewalld启动服务的命令:6是service,7是systemctl2、查看是否安装过MySQL如果你是用rpm安装, 检

python3 [爬虫实战] 微博爬虫京东客服之Selenium + Chrom浏览器的使用(上)_京东爬虫 对浏览器的要求-程序员宅基地

文章浏览阅读1k次。先暂时记录一下首先 Chrom浏览器一定要匹配好, 不能在百度搜索中下载最新的谷歌浏览器,我现在下的是版本50的浏览器。匹配的chromedriver.exe 是2.9的。32位的同样也使用64位的。 需要把chromedriver.exe 安装在谷歌浏览器的安装目录下,路径是:C:\Program Files (x86)\Google\Chrome\Application与chrome.ex_京东爬虫 对浏览器的要求

[转]十个完全免费的网页原型(线框图)工具_将网站直接转换成原型图-程序员宅基地

文章浏览阅读890次。网页的线框图是非常直观、但是也没什么技术上难点的东西。只需要你大概描出页面上需要的一些元素,比如头部、导航、页脚等等,最多再就是一些交互、内容区域什么的。但这对于任何网络应用的开发都是非常重要的。当然有很多种方法可以做这件事情,最简单的就是拿起纸和笔,但是在这篇文章中,我们要介绍的是一些非常高效好用的在线原型工具,并且他们完全免费。Lumzy 快速原型工具使用Lumzy你可以为你的应用创建_将网站直接转换成原型图

深度学习中关于样本不均衡问题的解决_深度学习重采样-程序员宅基地

文章浏览阅读1k次。深度学习中的样本不均衡问题_深度学习重采样

基于keras采用LSTM实现多标签文本分类(一)_keras lstm多分类-程序员宅基地

文章浏览阅读2.5k次。1.多标签即一条语句可能有多个类别划分。例如,这个酸菜鱼又酸又辣。属于酸和辣两个标签。在采用神经网络学习时,最后一层的激活函数应采用sigmoid激活函数,相当于对这条语句做了多个二分类。2.多分类即每条语句只有一个标签,在采用神经网络学习时,最后一层的激活函数应采用softmax激活函数,最后选取类别中的最大值作为预测结果。关于sigmoid和softmax 的区别此处再说明。本次数据集的格式为:关于LSTM的学习可以参考这篇。关于词向量化的方式,本文采用keras 内置Tokenizer A_keras lstm多分类

常用抓包工具分析_包分析工具-程序员宅基地

文章浏览阅读2.5w次,点赞3次,收藏38次。常用的抓包工具有: tcpdump (linux) wireshark (windows) tcpflow (linux) httpwatch (windows) 浏览器自带抓包工具 (windows)tcpdump (linux)tcpdump是linux下的抓包工具,一般使用比较习惯于,在linux下用tcpdump抓包,结果存入文件,把文件导入windows下用window..._包分析工具

推荐文章

热门文章

相关标签