- 浏览: 6352370 次
- 性别:
- 来自: 一片神奇的土地
文章分类
- 全部博客 (745)
- JQuery (25)
- JS (33)
- 数据库 (59)
- Java基础 (56)
- JSON (8)
- XML (8)
- ireport (7)
- 设计模式 (10)
- 心情 (14)
- freemarker (1)
- 问题 (15)
- powerdesigner (2)
- CSS (15)
- DWR (4)
- tomcat (16)
- Hibernate (12)
- Oracle (7)
- Struts (7)
- Spring (34)
- JSP (23)
- 需学习 (64)
- 工具类库 (63)
- Maven (14)
- 笔试题 (34)
- 源码学习 (31)
- 多线程 (39)
- Android (32)
- 缓存 (20)
- SpringMVC (14)
- jQueryEasyUi (12)
- webservice-RPC (13)
- ant (1)
- ASP.NET (10)
- 正则表达式 (3)
- Linux (15)
- JBoss (1)
- EJB (3)
- UML (2)
- JMS (3)
- Flex (8)
- JSTL (2)
- 批处理 (5)
- JVM (16)
- 【工具】 (16)
- 数据结构 (29)
- HTTP/TCP/Socket (18)
- 微信 (1)
- tomcat源码学习 (15)
- Python (30)
- 主机 (2)
- 设计与架构 (19)
- thrift-RPC (2)
- nginx (6)
- 微信小程序 (0)
- 分布式+集群 (12)
- IO (1)
- 消息队列 (4)
- 存储过程 (8)
- redis (9)
- zookeeper (5)
- 海量数据 (5)
最新评论
-
360pluse:
技术更新,战术升级!Python爬虫案例实战从零开始一站通网盘 ...
Python爬虫实战:Scrapy豆瓣电影爬取 -
18335864773:
推荐用 pageoffice 组件生成 word 文件。
JAVA生成WORD工具类 -
jjhe369:
LISTD_ONE 写道起始地址为163.135.0.1 结束 ...
IP地址与CIDR -
baojunhu99:
private final int POOL_SIZE = 5 ...
使用CompletionService获取多线程返回值 -
LovingBaby:
胡说,javascript 运行时是单线程的,event lo ...
Ajax请求是否可以实现同步
Broadcast Receiver用于接收并处理广播通知(broadcast
announcements)。多数的广播是系统发起的,如地域变换、电量不足、来电来信等。程序也可以播放一个广播。程序可以有任意数量的
broadcast receivers来响应它觉得重要的通知。broadcast
receiver可以通过多种方式通知用户:启动activity、使用NotificationManager、开启背景灯、振动设备、播放声音等,最
典型的是在状态栏显示一个图标,这样用户就可以点它打开看通知内容。
通常我们的某个应用或系统本身在某些事件(电池电量不足、来电来短信)来临时会广播一个Intent出去,我们可以利用注册一个Broadcast Receiver来监听到这些Intent并获取Intent中的数据。
一个Broadcast receiver只有一个简单的回调函数:
onReceive(Context curContext, Intent
broadcastMsg),当一个广播消息被Receiver监听到时,Android会调用它的onReceive()方法,并将包含消息的
Intent对象传给它。
onReceive中代码的执行时间不要超过5s,否则android会弹出超时dialog。
此时是否另开一个线程来处理耗时的操作呢?
Receiver只在onReceive方法执行时是激活状态,只要onReceive一返回,Receiver就不再是激活状态了。Receiver进
程是被一个激活状态的broadcast
receiver所保护而不被系统终止的,一旦onReceive返回,Receiver进程broadcast
receiver所保护而变为一个空进程,空进程是可以在任意时刻被终止的。这就带来了一个问题:当响应一个广播信息的处理十分耗时的时候,那么就应该把
这个处理放在一个单独的线程里去执行,来保证主线程里的其他用户交互组件能够继续运行,而一旦这么做,当onReceive()唤起一个线程后就会马上返
回,这时就会把Receiver进程放到被终止的境地。解决这个问题的方案是在onReceive()里开始一个Service,让这个Service去
做这件事情,那么系统就会认为这个进程里还有活动正在进行。
我们看一个简单的demo,该demo实现了一个自定义broadcast。
public class BroadcastTest extends Activity { public static final String NEW_LIFEFROM_DETECTED = “com.android.broadcasttest.NEW_LIFEFROM”; public void onCreate(Bundle savedInstanceState) { Button btn0 = (Button)findViewById(R.id.btn0); btn0.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent it = new Intent(NEW_LIFEFROM_DETECTED); sendBroadcast(it); } }); } }接收端在onReceive()中实现了当接收到broadcast所做的动作。
Public class MyBroadcastReceiver extends BroadcastReceiver { // TODO Public void onReceive(Context context, Intene intent){ ...... } }在receiver的action中定义了该receiver能够接受的广播,Manifest.xml定义部分:
<receiver android:name=”.MyBroadcastReceiver”> <intent-filter> <action android:name=”com.android.broadcasttest.NEW_LIFEFROM” /> </intent-filter> </receiver>
<receiver android:name="Receiver1"> <intent-filter> <!-- 和Intent中的action对应 --> <action android:name="com.forrest.action.mybroadcast"/> </intent-filter>在代码中注册
IntentFilter filter = new IntentFilter("com.forrest.action.mybroadcast"); // 和广播中Intent的action对应 MyBroadcastReceiver br = new MyBroadcastReceiver(); registerReceiver(new MyBroadcastReceiver(), filter); //注销 unregisterReceiver(br);
public class Receiver1 extends BroadcastReceiver { private Context context; public static final int NOTIFICATION_ID = 10001; public void onReceive(Context context, Intent intent) { this.context = context; showNotification(); } private void showNotification() { Notification notification = new Notification(R.drawable.icon, "来电话啦...", System.currentTimeMillis()); PendingIntent contentIntent = PendingIntent.getActivity(context, 0, new Intent(context, MainActivity.class), 0); notification.setLatestEventInfo(context, "来电话啦...嘿嘿", "赶紧接电话,否则误大事了", contentIntent); NotificationManager notificationManager = (NotificationManager) context.getSystemService( android.content.Context.NOTIFICATION_SERVICE); notificationManager.notify(NOTIFICATION_ID, notification); } }
public class Receiver2 extends BroadcastReceiver { private Context context; @Override public void onReceive(Context context, Intent intent) { this.context = context; deleteNotification(); } private void deleteNotification() { NotificationManager notificationManager = (NotificationManager) context.getSystemService(android.content.Context.NOTIFICATION_SERVICE); notificationManager.cancel(Receiver1.NOTIFICATION_ID); } }
public class MainActivity extends Activity { private final String ACTION_SEND = "com.forrest.action.SENDMESSAGE", ACTION_CLEAR = "com.forrest.action.CLEARNOTIFICATION"; public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); ( (Button) findViewById(R.id.btn1) ).setOnClickListener(new OnClickListener() { public void onClick(View v) { clickMenuItem(ACTION_SEND); } }); ( (Button) findViewById(R.id.btn2) ).setOnClickListener(new OnClickListener() { public void onClick(View v) { clickMenuItem(ACTION_CLEAR); } }); } private void clickMenuItem(final String action) { Intent intent = new Intent(action); sendBroadcast(intent); } }
<application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".MainActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <receiver android:name="Receiver1"> <intent-filter> <action android:name="com.forrest.action.SENDMESSAGE"/> </intent-filter> </receiver> <receiver android:name="Receiver2"> <intent-filter> <action android:name="com.forrest.action.CLEARNOTIFICATION"/> </intent-filter> </receiver> </application>
对于应用程序监听SMS Intent广播,首先需要添加RECEIVE_SMS权限。通过在应用程序manifest中添加一个uses-permission,如下面的片段所示:
<uses-permission android:name=”android.permission.RECEIVE_SMS”/>
SMS广播Intent包含了新来SMS的细节。为了提取包装在SMS广播Intent的Bundle中的SmsMessage对象数组,使用pdus key来提取SMS pdus数组,其中,每个对象表示一个SMS消息。将每个pdu字节数组转化成SmsMessage对象,调用SmsMessage.createFromPdu,传入每个字节数组,如下面的片段所示:
Bundle bundle = intent.getExtras(); if (bundle != null) { Object[] pdus = (Object[]) bundle.get(“pdus”); SmsMessage[] messages = new SmsMessage[pdus.length]; for (int i = 0; i < pdus.length; i++) messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); }每个SmsMessage对象包含SMS 消息的细节,包括源地址(手机号),时间和消息体。
下面的例子演示了一个Broadcast Receiver实现了onReceive函数来检查新来的短信是否以@echo字符串开始,如果是,发送相同的文本给那个手机:
public class IncomingSMSReceiver extends BroadcastReceiver { private static final String queryString = “@echo “; private static final String SMS_RECEIVED = “android.provider.Telephony.SMS_RECEIVED”; public void onReceive(Context _context, Intent _intent){ if (_intent.getAction().equals(SMS_RECEIVED)){ SmsManager sms = SmsManager.getDefault(); Bundle bundle = _intent.getExtras(); if (bundle != null){ Object[] pdus = (Object[]) bundle.get(“pdus”); SmsMessage[] messages = new SmsMessage[pdus.length]; for (int i = 0; i < pdus.length; i++) messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); for (SmsMessage message : messages){ String msg = message.getMessageBody(); String to = message.getOriginatingAddress(); if (msg.toLowerCase().startsWith(queryString)){ String out = msg.substring(queryString.length()); sms.sendTextMessage(to, null, out, null, null); } } } } } }为了监听短信,使用Intent Filter来注册Broadcast Receiver,使其监听android.provider.Telephony.SMS_RECEIVED动作,如下面的片段所示:
final String SMS_RECEIVED = “android.provider.Telephony.SMS_RECEIVED”; IntentFilter filter = new IntentFilter(SMS_RECEIVED); BroadcastReceiver receiver = new IncomingSMSReceiver(); registerReceiver(receiver, filter);
在Android中,Broadcast是一种广泛运用在应用程序之间异步传输信息的机制。Android系统通过发出广播消息,来通知各应用组件一些系统事件,如地域变换、电量不足、来电信息等,这些消息通常称为系统消息。第三方应用也可以广播消息,这些消息称为自定义消息。
广播消息在本质上就是一个Intent对象。
BroadcastReceiver用于接收并处理广播消息。不管是系统消息还是自定义消息,都可以通过BroadcastReceiver来进行处理。形象的比喻,Intent是一种一对一的通信,广播消息是一种一对多的通信。
b、 广播消息的处理流程
对于广播消息的处理,大致要经过消息发送、BroadcastReceiver注册和消息处理三个环节。
c、消息发送
广播消息的实质就是一个Intent对象。使用sendBroadcast ()或sendStickyBroadcast()方法发出去的Intent,所有满足条件的BroadcastReceiver都会随机地执行其onReceive()方法;
sendOrderBroadcast ()发出去的Intent,会根据BroadcastReceiver注册时Intent Filter 设置的优先级的顺序来执行,相同优先级的BroadcastReceiver则是随机执行。
sendStickyBroadcast ()方法主要的不同的是,Intent在发送后一直存在,并且在以后调用registerReceiver注册相匹配的BroadcastReceiver时会把这个Intent直接返回。
d、注册BroadcastReceiver
注册BroadcastReceiver有两种方式:
一种方式是,静态地在AndroidManifest.xml中用<receiver>标签声明,并在标签内用<intent-filter>标签设置过滤器
另一种方式是,动态在代码中先定义并设置好一个Intent Filter 对象,然后再需要注册的地方调用Context.registerReceiver(BroadcastReceiver,intentFilter)方法,如果取消时就调用Context.unregisterReceiver(BroadcastReceiver)方法。如果用动态注册BroadcastReceiver的Context对象被销毁时,BroadcastReceiver也就自动取消注册了。
根据Activity组件的生命周期,通常在onResume中注册BroadcastReceiver,在onPause中取消BroadcastReceiver。
e、处理消息
当广播消息发送以后,所有已经注册的BroadcastReceiver会检查注册时的Intent Filter是否与发送的Intent相匹配,若匹配则就会调用BroadcastReceiver的onReceive()方法。另外,若在使用sendBroadcast()的方法是指定了接收权限,则只有在AndroidManifest.xml中用标记<uses-permission>声明了拥有此权限的BroadcastReceiver才会有可能接收到发送来的Broadcast。
一个BroadcastReceiver可以处理多个广播消息,具体做法为在onReceive()方法调用Intent参数的getAction判断传进来的动作,即可进行不同的处理。
f、处理系统广播消息
在广播消息中,有一类特殊的广播消息,它们特殊在只能由Android系统发出,这类广播消息称为系统广播。
ACTION_TIME_TICK 系统时间已经改变。该事件每分钟被广播一次,只能通过动态注册BroadcastReceiver来响应。
ACTION_TIME_CHANGED 系统时间被设置
ACTION_TIMEZONE_CHANGED 系统时区被改变
ACTION_BOOT_COMPLETED 系统启动完成
ACTION_PACKAGE_ADDED 新的应用程序被安装
ACTION_PACKAGE_CHANGED 应用程序被改变
ACTION_PACKAGE_REMOVED 应用程序被卸载
ACTION_PACKAGE_RESTARTED 应用程序被重新启动
ACTION_PACKAGE_DATA_CLEARED 应用程序数据被清空
ACTION_UID_REMOVED 用户ID被删除
ACTION_BATTERY_CHANGED 点量信息改变
ACTION_POWER_CONNECTED 外接电源被连通
ACTION_POWER_DISCONNECTED 外接电源被断开
ACTION_SHUTDOWN 系统关闭
静态注册BroadcastReceiver 很简单,需要在AndroidManifest文件中增加一个receiver节点,并且在节点中嵌套一个intent-filter来声明组件响应的Intent对象的属性,在autorun例子中,为系统广播android.intent.action.BOOT_COMPLETED的应用权限的声明。
g、深入消息处理
广播消息的发送方式由多种:
无序广播
有序广播
持续广播
h、BroadcastReceiver的生命周期
BroadcastReceiver的onReceive()方法执行完成后,BroadcastReceiver的实例就会被销毁。如果onReceive()方法在10s内没有执行完毕,Android会认为改程序无响应。所以在BroadcastReceiver里不能做一些比较耗时的操作,否则会弹出“Application NoResponse”对话框。特别说明的是,这里不能使用子线程来解决 ,因为BroadcastReceiver的生命周期很短,子线程可能还没有结束BroadcastReceiver就先结束了。BroadcastReceiver一旦结束,此时它所在的进程很容易在系统需要内存时被优先杀死,因为它属于空进程。
具体实例:
http://www.apkbus.com/forum.php?mod=viewthread&tid=4406
http://www.apkbus.com/forum.php?mod=viewthread&tid=19029&reltid=4406&pre_thread_id=0&pre_pos=1&ext=
http://www.cnblogs.com/wangtianxj/archive/2010/01/20/1652480.html
发表评论
-
选择照片和拍照
2018-06-13 15:31 1669Android拍照或从本地选择图片上传 Android ... -
PullToRefresh的简单使用
2018-05-31 16:06 1300Android下拉刷新控件--PullToRefresh的简 ... -
fragment内嵌fragment之间传值+切换fragment
2018-05-30 11:59 13458跳转: 从一个Fragment跳转到另一个Fragmen ... -
控件使用问题
2018-05-22 09:59 1552TextView最大长度限制,超出部分省略号显示 xml ... -
ViewPager+RadioGroup+TabLayout
2018-05-22 09:38 1124ViewPager: ViewPager 详解(五)-- ... -
网络请求工具类HttpUtils
2018-05-19 21:07 2426代码如下: import android.app.Acti ... -
android排版布局学习
2018-05-18 16:24 3890Android开发学习之路--UI之基本布局 andro ... -
[工具]-Android切图
2018-05-18 14:21 1523切图小科普!聊聊原生APP切图那些事儿 安卓APP设计规 ... -
【Android基础问题】
2018-05-18 13:49 7411、appcompat_v7: appcompat_v7 ... -
WebView使用
2018-05-17 17:42 1200Android:最全面的 Webvie ... -
《第一行代码》服务+AsyncTask+定时任务
2018-04-23 09:45 179014、服务 服务(Service)是 Androi ... -
《第一行代码》通知+接收拦截发送短信
2018-04-23 09:44 170613、通知 在活动里 ... -
《第一行代码》内容提供器
2018-04-20 16:08 129112、内容提供器 内容提供器(Content Pro ... -
《第一行代码》数据存储
2018-04-20 16:07 69211、数据存储 将数据存储到文件中 ope ... -
《第一行代码》广播
2018-04-20 15:34 100010、广播接收器(Broadcast Receive ... -
《第一行代码》控件、布局、碎片
2018-04-20 14:40 9208、控件 TextView: a ... -
【Android studio配置和错误】
2018-04-20 14:21 4053Gradle是一个基于Apache Ant和Apache ... -
《第一行代码》基础总结
2016-07-12 22:07 1918activity的生命周期—— ... -
《第一行代码》扩展总结
2016-06-29 15:28 1342Android更新UI的两种方法——handler与run ... -
Android快速开发工具类
2016-01-21 14:56 1999来源:http://blog.csdn.net/lmj62 ...
相关推荐
5. **解除注册**: 当BroadcastReceiver不再需要接收广播时,记得在适当的时候调用`Context.unregisterReceiver()`进行解除注册,避免内存泄漏。 ```java unregisterReceiver(myBroadcastReceiver); ``` 6. **...
在Android系统中,广播BroadcastReceiver是一种非常重要的组件,它允许应用程序接收并响应系统或自定义事件,例如设备连接状态变化、网络可用性更新等。在这个教学demo实例中,我们将深入探讨动态注册、静态注册以及...
在Android系统中,广播BroadcastReceiver是一种非常重要的组件,它允许应用程序接收并响应系统或自定义广播事件。广播是Android系统中的一种全局通知机制,当某个事件发生时,系统会发送一个广播,所有注册了该事件...
在Android系统中,广播接收者(BroadcastReceiver)是四大组件之一,它负责监听并响应系统或应用程序发布的广播意图(Intent)。BroadcastReceiver可以帮助我们实现后台运行的任务,即使应用没有在前台运行,也能...
- **无序广播**:所有匹配的BroadcastReceiver都会同时接收到广播,无法控制接收顺序,也无法阻止其他Receiver接收广播。 - **有序广播**:广播按照优先级依次传递,前一个Receiver处理完后才传递给下一个,可以...
这样,当Activity暂停时,BroadcastReceiver会停止接收广播,从而节省系统资源;当Activity恢复时,重新注册,继续监听电池状态变化。 ```java @Override protected void onPause() { super.onPause(); ...
广播BroadcastReceiver是Android系统中的一个重要组件,它允许应用程序接收并响应系统或应用级别的广播事件。广播事件可以在系统层面上触发,比如设备启动、网络状态变化,或者由其他应用程序主动发送,用于传递数据...
Android BroadcastReceiver接收收到短信的广播 在 Android 中,BroadcastReceiver 是四大组件之一,负责接收和处理系统级别的广播信息。这些广播信息可以提供各种系统状态信息,如电量低、存储空间不足、开机自...
在Android开发中,BroadcastReceiver是一个至关重要的组件,它允许应用程序接收和响应系统或应用程序广播的Intent消息。BroadcastReceiver是Android四大组件之一,主要用于在应用的不同部分之间以及不同应用之间传递...
这是一个关于Android中四大组件之一 —— BroadcastReceiver,即广播的一个demo,里面涉及到BroadcastReceiver的两种注册方式,也简单的实现了广播,通过点击按钮发送广播,收到广播后打印日志。
总之,跨应用(跨进程)发送广播和接收广播是Android开发中的核心技能之一,它涉及到Intent、BroadcastReceiver、进程间通信等多个概念。通过理解和实践,开发者可以构建出更灵活、协作性强的应用程序。
在Android系统中,广播BroadcastReceiver是一种非常重要的组件,它允许应用程序在不运行的情况下接收和响应系统或应用事件。本文将详细解析"安卓广播BroadcastReceiver"的相关知识点,包括静态注册、动态注册以及...
"简单广播收发demo"是一个专为初学者设计的示例,它展示了如何创建、发送和接收广播的基本过程。下面我们将详细探讨广播的相关知识点。 1. **广播的基本概念**: 广播Intent是Android系统中的一种特殊Intent,用于...
BroadcastReceiver是一种组件,它可以监听系统或应用广播事件,并在接收到特定广播时执行相应的操作。以下是对这个主题的详细解释。 首先,我们需要知道如何检测Android设备的网络状态。Android提供了...
在Android应用开发中,BroadcastReceiver(广播接收器)是四大组件之一,它是系统用来传递消息和事件的重要机制。BroadcastReceiver可以监听系统或应用程序发送的广播Intent,并在接收到广播时执行相应的操作。以下...
它可能包含了BroadcastReceiver的实例化、IntentFilter的配置、以及如何发送和接收广播的代码片段。通过分析这个示例,开发者可以更好地理解和掌握BroadcastReceiver的实际应用。 总结来说,BroadcastReceiver是...
BroadcastReceiver主要用于接收系统或者应用发布的广播意图(Intent),即使应用程序在后台运行或者完全关闭,BroadcastReceiver也能接收到这些广播并作出响应。 在Android系统中,广播分为两种类型:有序广播...
- 对于动态注册的BroadcastReceiver,记得在不再需要接收广播时调用unregisterReceiver()方法进行取消注册,防止内存泄漏。 9. **BroadcastReceiver的调试**: - 使用adb shell am broadcast命令可以手动发送广播...
3. **广播的接收**:BroadcastReceiver中的`onReceive()`方法是接收广播事件的地方。当广播被发送并且BroadcastReceiver匹配了intent-filter中的action,`onReceive()`会被调用。例如: ```java public class ...
在Android系统中,广播接收器(BroadcastReceiver)是一种非常重要的组件,它允许应用程序接收并响应系统或应用广播的意图(Intent)。"Android广播onReceiver回调更新ui"这个主题主要涉及如何在广播接收器中处理...