【转】Pro Android学习笔记(九八):BroadcastReceiver(2):接收器触发通知
文章转载只能用于非商业性质,且不能带有虚拟货币、积分、注册等附加条件。转载须注明出处:http://blog.sina.com.cn/flowingflying或作者@恺风Wei-傻瓜与非傻瓜
广播接受可用于本地,也可以用于不同的进程(应用)间。广播还常用于后台服务,当接收器收到某个广播消息时,通常会在通知栏中提示用户,用户点击通知,可以进入某个Activity中进行处理。
小例子
接收器应用为本小例子,发送广播应用利用上一学习的小例子。

代码
关于通知,可以参考Android学习笔记(五五):通知Notification(下)。
public class NotificationReceiver extends BroadcastReceiver{
private static int NOTIFY_ID = 1000;
private static final String tag = "NotificationReceiver";
@Override
public void onReceive(Context context, Intent intent) {
Utils.logThreadSignature(tag);
Log.d(tag,"intent = " + intent);
String message = intent.getStringExtra("message");
Log.d(tag,message);
sendNotification(context,message);
}
private void sendNotification(Context context, String message){
//【1】获取Notification 管理器的参考
NotificationManager notifyMgr= (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
//【2】设置通知。PendingIntent表示延后触发,是在用户下来状态栏并点击通知时触发,触发时PendingIntent发送intent,本例为打开浏览器到指定页面。
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.google.com"));
PendingIntent pi = PendingIntent.getActivity(context, 0, intent, 0);
Notification notification = new Notification.Builder(context)
.setSmallIcon(R.drawable.ic_launcher)
.setTicker("Hello")
.setContentTitle("Title")
.setContentText("Content text")
.setContentIntent(pi)
.build();
notification.flags |= Notification.FLAG_AUTO_CANCEL; //点击后删除,如果是FLAG_NO_CLEAR则不删除,FLAG_ONGOING_EVENT用于某事正在进行,例如电话,具体查看参考。
//【3】发送通知到通知管理器。第一个参数是这个通知的唯一标识,通过这个id可以在以后cancel通知,更新通知(发送一个具有相同id的新通知)。这个id在应用中应该是唯一的。
notifyMgr.notify(NOTIFY_ID, notification);
}
}
XML
在AndroidManifest.xml中同样要进行receiver的声明,标明所关注的广播。我们的小例子无需有activity,只需receiver即可。在安装是会显示:

由于在manifest中以告知系统所关心的广播,无需有一个App正在运行,同样也可以正确地实现触发。
创建自己的Content View风格:RemoteView
上面我们使用了系统缺省的Content View。有时我们希望自行定义content view的风格,如图所示,由一个Textview和一个Button组成。

我们首先定义自己的layout,在res/layout/中加入相关的xml文件,本例为content_view.xml,如下:

相关的notification生成代码如下:
private void sendNotification2(Context context, String message){
NotificationManager notifyMgr= (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("http://www.google.com"));
PendingIntent pi = PendingIntent.getActivity(context, 0, intent, 0);
//创建RemoteViews对象。参数1为包名,参数2为对应的layout文件ID。 然后设置remoteViews中的text,icon等等。home page中的widget views也是remote views,我们将在以后学习。
RemoteViews remoteViews = new RemoteViews(context.getPackageName(),R.layout.content_view);
//对当中的TextView进行设置
remoteViews.setTextViewText(R.id.title, "My Custom Title");
remoteViews.setTextColor(R.id.title, Color.RED);
//对当中的非TextView,例如Button进行设置,参数2对应方法名称,本例button.setText(),因此取“setText”,参数3对应传递到button.setText(value)中的value。
remoteViews.setCharSequence(R.id.button, "setText", "My custom content text");
Notification notification = new Notification.Builder(context)
.setSmallIcon(R.drawable.ic_launcher)
.setTicker("Hello")
.setContent(remoteViews) //在notification中设置content view
.setContentIntent(pi)
.build();
notification.flags |= Notification.FLAG_AUTO_CANCEL;
notifyMgr.notify(NOTIFY_ID + 1, notification);
}
打开Activity
前面,我们使用了通知管理器,实际上我们可以在收到广播时直接通过startActivity开启activity,但要带有下面的flag:Intent.FLAG_ACTIVITY_NEW_TASK,Inetent.FLAG_FROM_BACKGROUND,或者Intent.FLAG_ACTIVITY_SINGLETOP。
相关链接: 我的Android开发相关文章
转自:http://blog.csdn.net/flowingflying/article/details/6212512
【转】Pro Android学习笔记(九八):BroadcastReceiver(2):接收器触发通知的更多相关文章
- 【转】 Pro Android学习笔记(八二):了解Package(1):包和进程
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在之前,我们已经学习了如何签发apk,见P ...
- 【转】 Pro Android学习笔记(八九):了解Handler(3):延迟执行小例子
目录(?)[-] 小例子 Handler的处理 Activity的代码片段 后台线程和UI的互动 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://b ...
- 【转】 Pro Android学习笔记(八十):服务(5):访问远程服务
目录(?)[-] Client的AIDL文件 Client的代码 建立连接 请求服务 断开连接 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://bl ...
- 【转】 Pro Android学习笔记(八八):了解Handler(2):什么是Handler
文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 之前我们有一篇很好的博文<Andro ...
- 【转】 Pro Android学习笔记(八六):了解Package(5):使用lib
目录(?)[-] 在项目中使用lib 源代码 了解一些机制 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowin ...
- 【转】 Pro Android学习笔记(八四):了解Package(3):包间数据共享
目录(?)[-] 共享User ID的设置 共享资源例子 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowing ...
- 【转】 Pro Android学习笔记(八五):了解Package(4):lib项目
目录(?)[-] 什么是lib项目 小例子 Lib的实现 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowing ...
- 【转】 Pro Android学习笔记(八三):了解Package(2):包签名过程
目录(?)[-] 类比例子 数字签名 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingflying/ 在W ...
- 【转】 Pro Android学习笔记(八七):了解Handler(1):组件和线程
目录(?)[-] 主线程消息队列和线程池 查看线程信息 文章转载只能用于非商业性质,且不能带有虚拟货币.积分.注册等附加条件.转载须注明出处:http://blog.csdn.net/flowingf ...
- 【转】Pro Android学习笔记(八):了解Content Provider(下中)
在之前提供了小例子BookProvider,我们回过头看看如何将通过该Content Provider进行数据的读取. (1)增加 private void addBook(String name , ...
随机推荐
- Ubuntu下MongoDB的安装
一.MongoDB介绍 MongoDB 是一个是一个基于分布式文件存储的数据库,介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的.他支持的数据结构非常松散,是类似jso ...
- 为什么Kubernetes不使用libnetwork
Kubernetes 在 1.0 版本之前就已经有了最初的网络插件.与此同时 Docker 也引入了 libnetwork 和 Container Network Model (CNM).现在 Doc ...
- BZOJ 3931 [CQOI2015]网络吞吐量:最大流【拆点】
传送门 题意 给你一个 $ n $ 个点,$ m $ 条边的无向网络,每条边有长度.每个点的流量限制为 $ c[i] $ . 要求流量只能经过从 $ 1 $ 的 $ n $ 的最短路.问你最大流是多少 ...
- [javascript]JS如何获取当前时间戳
[javascript]JS如何获取当前时间戳 一.总结 一句话总结:var timestamp = Date.parse(new Date()); 结果是带三位毫秒的,再除个1000取整即可 1.j ...
- Oracle cmd乱码
查看下环境变量的设置,查看是否有变量NLS_LANG,没有则新建该变量.新建变量,设置变量名:NLS_LANG,变量值根据以上字符集确定,一般都是中文简体SIMPLIFIED CHINESE_CHIN ...
- Ajax基础(三)--eval的使用
eval的使用: 1.定义和用法 计算某个字符串,并执行其中的js代码 eval(string) string必须,含有表达式或执行语句 string有返回值的话 2.实例 2.1 字符串上该用eva ...
- Struts03---参数传递
package cn.bdqn.bean; /** * *用户的实体类 */ public class User { private String name; private String passw ...
- jquery自定义插件实现分页效果
这节介绍如何自定义jquery插件,实现分页效果,话不多说,先看看实现的效果: 分页插件 实现的代码如下: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTM ...
- 你必须知道的495个C语言问题,学习体会一
C语言作为一门古老的语言,其灵活性和容易出错都让人 又爱又恨,书籍<你必须知道的495个C语言问题>,使用问答的形式,告诉读者 C语言使用的各个方面的知识,包括一些冷知识等.以下,我要摘录 ...
- ORM版,学生管理系统02
学生管理系统 urls.py url(r'^student_list/$',views.student_list,name="student_list"), url(r'^dele ...