原文链接:http://www.orlion.ga/663/

1、通知的基本用法

创建通知的步骤,首先需要一个NotificationManager来对通知进行管理,可以调用Context的getSystemService()方法获取到。getSystemService()方法接收到一个字符串参数用于确定获取系统的哪个服务,这里我们传入Context.NOTIFICATION_SERVICE即可,因此获取NotificationManager的实例就可以写成:

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

接下来需要创建一个Notification对象,这个对象用于存储通知所需的各种信息,我们可以使用它的有参构造函数来创建。Notification的有参构造函数接收三个参数,第一个参数用于指定通知的图标,第二个参数用来指定通知的ticker内容,当通知刚被创建的时候,它会在系统的状态栏一闪而过,属于一种瞬时的提示信息。第三个参数用于指定通知被创建的时间,以毫秒为单位,当下拉状态栏时,这里指定的时间会显示在相应的通知上,因此,创建一个Notification对象可一写成:

Notification notification = new Notification(R.drawable.icon, "This is ticker text" , System.currentTimeMillis());

创建好Notification对象后,我们还需要对通知的布局进行设定,这里只需要调用Notification的setLastestEventInfo()方法就可以给通知设置一个标准的布局。这个方法接收四个参数,第一个参数是Context,第二个参数用于指定通知的标题内容,下拉系统状态栏就可以看到这部分内容。第三个参数用于指定通知的正文内容,同样下拉系统状态栏就可以看到这部分内容,第四个参数暂时用不到,设为null,因此对通知的布局进行设定就可以写成:

notification.setLastestEventInfo(context , "This is content title" , "This is content text" , null);

接着只要调用NotificationManager的notify()方法就可以让通知显示了,该方法接收两个参数,第一个参数是id,要保证为每个通知所指定的id都是不同的。第二个参数则是Notification对象,因此显示通知:

manager.notify(1 , notification);

这时候就可以显示通知了,但是这时候这条通知是不可点击的,如果要实现点击效果需要用到PendingIntent。PendingIntent从名字上看起来就和 Intent有些类似, 它们之间也确实存在着不少共同点。比如它们都可以去指明某一个“意图” ,都可以用于启动活动、启动服务以及发送广播等。不同的是,Intent更加倾向于去立即执行某个动作,而 PendingIntent更加倾向于在某个合适的时机去执行某个动作。所以,也可以把 PendingIntent简单地理解为延迟执行的 Intent。

PendingIntent的用法同样很简单,它主要提供了几个静态方法用于获取 PendingIntent的实例,可以根据需求来选择是使用 getActivity()方法、getBroadcast()方法、还是 getService()方法。这几个方法所接收的参数都是相同的,第一个参数依旧是 Context,不用多做解释。第二个参数一般用不到,通常都是传入 0即可。第三个参数是一个 Intent对象,我们可以通过这个对象构建出 PendingIntent的“意图” 。第四个参数用于确定 PendingIntent的行为,有FLAG_ONE_SHOT、 FLAG_NO_CREATE、 FLAG_CANCEL_CURRENT和 FLAG_UPDATE_CURRENT这四种值可选

再 回 过 头 来看 一 下 Notification 的setLatestEventInfo()方法。刚才我们将 setLatestEventInfo()方法的第四个参数忽略掉了,直接传入了 null,现在仔细观察一下,发现第四个参数正是一个 PendingIntent对象。因此,这里就可以通过 PendingIntent构建出一个延迟执行的“意图” ,当用户点击这条通知时就会执行相应的逻辑。代码:

NotificationManager manager = (NotificationManager)
getSystemService(NOTIFICATION_SERVICE);
Notification notification = new Notification(R.drawable.
ic_launcher, "This is ticker text", System.currentTimeMillis());
Intent intent = new Intent(this, NotificationActivity.class);
PendingIntent pi = PendingIntent.getActivity(this, 0, intent,
PendingIntent.FLAG_CANCEL_CURRENT);
notification.setLatestEventInfo(this, "This is content title",
"This is content text", pi);
manager.notify(1, notification);

这里先是使用 Intent表达出我们想要启动 NotificationActivity的“意图” ,然后将构建好的 Intent对象传入到 PendingIntent的 getActivity()方法里,以得到 PendingIntent的实例,接着把它作为第四个参数传入到 Notification的 setLatestEventInfo()方法中。

这时点击通知之后通知并不会消失,需要在代码中对通知进行取消,可以在NotificationActivity中调用NotificationManager的cancel()方法来取消:

NotificationManager manager = (NotificationManager)
getSystemService(NOTIFICATION_SERVICE);
manager.cancel(1);

可以看到,这里我们在 cancel()方法中传入了 1,这个1是什么意思呢?还记得在创建通知的时候给每条通知指定的 id吗?当时我们给这条通知设置的 id就是 1。因此,如果你想要取消哪一条通知,就在 cancel()方法中传入该通知的 id就行了。

2、通知的高级技巧

观察Notification这个类, 你会发现里面还有很多我们没有使用过的属性。 先来看看sound这个属性吧,它可以在通知发出的时候播放一段音频,这样就能够更好地告知用户有通知到来。sound这个属性是一个 Uri对象,所以在指定音频文件的时候还需要先获取到音频文件对应的 URI。比如说,我们手机的/system/media/audio/ringtones目录下有一个 Basic_tone.ogg音频文件,那么在代码中这样就可以这样指定:

Uri soundUri = Uri.fromFile(new File("/system/media/audio/ringtones/
Basic_tone.ogg"));
notification.sound = soundUri;

除了允许播放音频外,我们还可以在通知到来的时候让手机进行振动,使用的是 vibrate这个属性。它是一个长整型的数组,用于设置手机静止和振动的时长,以毫秒为单位。下标为 0的值表示手机静止的时长,下标为 1的值表示手机振动的时长,下标为 2的值又表示手机静止的时长,以此类推。所以,如果想要让手机在通知到来的时候立刻振动 1秒,然后静止 1秒,再振动 1秒,代码就可以写成:

long[] vibrates = {0, 1000, 1000, 1000};
notification.vibrate = vibrates;

想要控制手机振动还需要声明权限:

<uses-permission android:name="android.permission.VIBRATE" />

下面我们来看一下如何在通知到来时控制手机 LED灯的显示。现在的手机基本上都会前置一个 LED灯,当有未接电话或未读短信,而此时手机又处于锁屏状态时, LED灯就会不停地闪烁, 提醒用户去查看。 我们可以使用ledARGB、 ledOnMS、ledOffMS以及 flags这几个属性来实现这种效果。ledARGB用于控制 LED灯的颜色,一般有红绿蓝三种颜色可选。ledOnMS用于指定 LED灯亮起的时长,以毫秒为单位。ledOffMS用于指定 LED灯暗去的时长,也是以毫秒为单位。flags可用于指定通知的一些行为,其中

就包括显示 LED灯这一选项。所以,当通知到来时,如果想要实现 LED灯以绿色的灯光一闪一闪的效果,就可以写成:

notification.ledARGB = Color.GREEN;
notification.ledOnMS = 1000;
notification.ledOffMS = 1000;
notification.flags = Notification.FLAG_SHOW_LIGHTS;

当然,如果你不想进行那么多繁杂的设置,也可以直接使用通知的默认效果,它会根据当前手机的环境来决定播放什么铃声,以及如何振动,写法如下:

notification.defaults = Notification.DEFAULT_ALL;

Android入门(十五)通知的更多相关文章

  1. Android入门(十二)SQLite事务、升级数据库

    原文链接:http://www.orlion.ga/610/ 一.事务 SQLite支持事务,看一下Android如何使用事务:比如 Book表中的数据都已经很老了,现在准备全部废弃掉替换成新数据,可 ...

  2. Android入门(五):程序架构——MVC设计模式在Android中的应用

    刚刚接触编程的的人,可能会这样认为:只要代码写完了能够跑起来就算完工了.如果只是写一个小程序,“能够跑起来”这样的标准也就可以了,但是如果你是在公司进行程序的开发,那么仅仅让程序成功的跑起来是不行的, ...

  3. Android入门(十九)WebView

    原文链接:http://www.orlion.ga/676/ WebView可以在自己的应用程序中嵌入一个浏览器来展示网页. 创建一个项目WebViewDemo,修改activity_main.xml ...

  4. Android入门(十八)服务

    原文链接:http://www.orlion.ga/674/ 一.定义一个服务 创建一个项目ServiceDemo,然后在这个项目中新增一个名为 MyService的类,并让它继承自 Service, ...

  5. Android入门(十六)调用摄像头相册

    原文链接:http://www.orlion.ga/665/ 一.调用摄像头 创建一个项目ChoosePicDemo,修改activity_main.xml: <LinearLayout xml ...

  6. Android入门(十四)内容提供器-实现跨程序共享实例

    原文链接:http://www.orlion.ga/661/ 打开SQLite博文中创建的 DatabaseDemo项目,首先将 MyDatabaseHelper中使用 Toast弹出创建数据库成功的 ...

  7. Android入门(十)SQLite创建升级数据库

    原文链接:http://www.orlion.ga/603/ 一.创建数据库 Android为了让我们能够更加方便地管理数据库,专门提供了一个 SQLiteOpenHelper帮助类, 借助这个类就可 ...

  8. Android进阶(十五)socket通信——聊天室

    想做一个聊天室,花费了将近一天的时间,各种错误.讲解知识点之前,絮叨几句:动手能力还是很重要的,有时看似简单的一个问题,当你真正着手去解决的时候就有可能会遇到各种各样的问题,原因之一就是因为你的知识储 ...

  9. [WebGL入门]十五,为多边形涂抹颜色(顶点颜色的指定)

    注:文章译自http://wgld.org/.原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:].另外.鄙人webgl研究还不够深入.一些专业词语.假设翻译有误.欢迎大家指 ...

随机推荐

  1. kafka及zookeeper安装

    kafka_2.9.2-0.8.1.tgzzookeeper-3.4.8.tar.gz 安装 zookeeper1 export PATH=$PATH:/usr/local/zookeeper/bin ...

  2. java 中 finally里面写了return 会发生什么?

    boolean test() throws Exception { boolean ret = true; try { int b = 12; int c; for (int i = 1; i > ...

  3. [翻译]Spring框架参考文档(V4.3.3)-第二章Spring框架介绍 2.1 2.2 翻译--2.3待继续

    英文链接:http://docs.spring.io/spring-framework/docs/current/spring-framework-reference/html/overview.ht ...

  4. HK一行所见闻

    香港一行 20多年来,未未去过HK,前段时间由于工作关系去了趟HK.感触良多. 一清早,福田过关,做火车,做地铁,一通到了目的地. 总结对那边的印象: 1,所有人都是粤语,包括工作交流.而且他们不怎么 ...

  5. 分享我的“艺术品”:公共建筑能耗监测平台的GPRS通讯服务器的开发方法分享

    在这个文章里面我将用一个实际的案例来分享如何来构建一个能够接受3000+个连接的GPRS通讯服务器软件,这个软件被我认为是一个艺术品,实现周期为1.5个月,文章很长,有兴趣的同志慢慢看.在这里,我将分 ...

  6. 计划参照mysql-proxy编写mssql-proxy

    目前使用haproxy做了mssql多个读库的负载均衡,在生产环境中运行得不错. 不过,这个方案有缺点:客户端需要选择是使用读库,还是写库.这样还是不够方便,如果能够实现自动路由就更好了,即让hapr ...

  7. 依赖注入的威力,.NET Core的魅力:解决MVC视图中的中文被html编码的问题

    有园友在博问中提了这样一个问题 —— .NET Core 中文等非英文文字html编码输出问题,到我们的 ASP.NET Core 项目中一看,也是同样的问题. 比如下面的Razor视图代码: @{ ...

  8. 使用阿里云负载均衡遭遇的http重定向https的问题

    昨天解决了在阿里云负载均衡上部署https证书的问题(详见一个空行引起的阿里云负载均衡上部署https证书的问题),并完成了部署,负载均衡的监听配置是这样的: 用户与负载均衡之间走https协议,负载 ...

  9. 【吉光片羽】奇怪的Bug-细节的问题

    这几天用Winform开发了一个小界面,遇到几个奇怪的问题,记录一下. 1.背景图片漏光. 当时很是奇怪,以为是图片的问题,让美工重新发,改成jpg也都存在.很是奇怪,原图这个地方肉眼看是不透明的,而 ...

  10. 基于正则的INI读写工具类,支持加密解密

    看到这个标题,有人会问,现在都用xml做配置文件了,谁还用INI文件啊!下面来简单对比一下xml和ini: 1.XML功能强大表达能力强,同时扩展性好. 2.它的主要优势是异构平台的整合.通讯. 3. ...