下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 Android 开发之广播机制 /* * Android 开发之广播机制 * 北京 Android 俱乐部群: 167839253 *Created on: 2012-7-31 *Author: blueeagle * Email: */ 概述 在 Android 中,有一些操作完成以后, 会发送广播, 比如说发出一条短信, 或打出一个电话, 如果某个程序接收了这个广播,就会做相应的处理。这个广播跟我们传统意义中的电台广播 有些相 之处。之所以叫做广播,就是因为它只负责“说”而不管你“听不听”,也就 是不管你接收方如何处理。另外,广播可以被不只一个应用程序所接收,当然也可能不被任 何应用程序
2、所接收。 什么是 Broadcast Receiver BroadcastReceiver 是 Android 应用程序中的第三个组件。 Broadcast Reciver 和事件处理机 制类 , 不同的是事件处理机制是应用程序 组件级别的,比如一个按钮的 OnClickListener 事件,只能够在一个应用程序中处理。 而广播事件处理机制是系统级别的, 不同的应用程序都可以处理广播事件。 文件。 如何使用 Broadcast Receiver 可以通过构建 Intent 对象, 然后调用 sendBroadcast() 方法将广播发出。 事件的接受是通过 一个继承自 BroadcastRe
3、ceiver 的类来实现的。 继承后重写 onReceiver() 方法, 在该方法中 响应事件。当然不能忘记在 AndroidManifest.xml 文件中注册 BroadcastReceiver 。 一般继承自 BroadcastReceiver 的类,是我们根据自己的需求所自定义的。这个自定义的类 的作用,就是用来处理 android 当中所发出的广播事件。也就是说, Android 操作系统中发 出的广播,由 BroadcastReceiver 这个类来接收。接收到以后,就会调用这个类中的 onReceive() 方法来进行处理。那么,在 Android 系统中,有很多的广播,如何才
4、能确定,一 个 receiver 负责接收什么类型的广播呢?对了。 这就是要去书写 AndroidManifest.xml 我们需要在 AndroidManifest.xml 里进行注册,将 receiver 注册到应用程序中。这个 receiver 应该接收什么类型的事件是由 Intent-filter 来决定的。 对于 onReceive 方法,一旦方法返回。 系统就会认为对象已经被完成。 从而不再是活动状态。 按照上述说明。简单的看一个例子,代码如下: public class BroadcastReceiverTest extends Activity private Button m
5、yButton; Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); myButton = (Button)findViewById(R.id.myButton); myButton.setOnClickListener(newButton.OnClickListener() Override public void onClick(View v) Intent myIntent = new Inte
6、nt(); myIntent.setAction(myIntent.ACTION_EDIT); 发送广播 BroadcastReceiverTest.this.sendBroadcast(myIntent);/ ); 需要编写 BroadcastReceiver 类,代码如下: public class ReceiverTest extends BroadcastReceiver public ReceiverTest() System.out.println(ReceiverTest); Override public void onReceive(Context arg0, Intent
7、arg1) System.out.println(onReceive); 在 AndroidManifest.xml 中注册的代码如下: receiver android:label=string/app_name android:name=.ReceiverTest intent-filter android:name=ent.action.EDIT action / /intent-filter /receiver 编译完成之后,我们在控制台会得到如图所示的结果: 如果连续按两次按钮,则会出现两次。如图所示: 在上面的例子中,Intent 的Action 类型为 AC
8、TION_EDIT而在AndroidManifest.xml中注册 的 receiver 类型也是 edit , action android:name=ent.action.EDIT/ ,这就表明这两个 Action 进行了匹配。即执行了 sendBroadcast 方法之后,类型为 edit 的 receiver 就可以进行接收了。类型匹配成功的话,才会生成receiver 的对象,从而调用 onReceiver 方法。上文中已经谈到,每次接收广播都会生成一个新的receiver 对象。在处 理完毕之后,这个对象就不会再被使用了。 注册 Broadcast Recei
9、ver 的方法 BroadcastReceiver 能够监听被广播出来的对象,一般是会用 Intent 来进行广播。那么, 达到能够监听的目的,则 BroadcastReceiver 必须进行注册。注册方法有两种: 在 AndroidManifest.xml 文件中进行注册 :这里 面 需 要注 意一 点 的 是, 如果 我在 AndroidManifest.xml 文件 中 进 行注 册 BroadcastReceiver 的话,无论这个 BroadcastReceiver 所在的应用程序是运行状态还是关 闭状态,这个 BroadcastReceiver 都是活动的,都可以接收到广播的事件。
10、例如,短信息的 接收,电池耗电量的显示等应用程序。我们在待机状态时需要监听这些状态,但是我们不可 能一直打开应用程序。 在应用程序的代码中进行注册 : 当我们需要更新 Activity 里面的控件的状态的时候, 则需要在应用程序的代码中进行注册, 这个时候我们如果在 AndroidManifest.xml 中注册的话就不太合适了。因为只有我们在 Activity 能看到的时候才进行更新,而 Activity 看不见的时候,这个 BroadcastReceiver 就应该关闭。否则会浪费各种资源。因此,这个时候就需要在应用程序的代码中进行注册。 在 Activity 启动以后注册 Broadca
11、stReceiver ,在 Activity 不可见后取消注册。 TheBroadcastReceiver to handle the 对象 ( Selectsthe Intent broadcasts to be 文件中所使用的 Intent-filter 注册的代码很简单就是 registerReceiver(receiver,filter); 相应的,取消注册的代码为 unregisterReciver(receiver); 参数 receiver 表示一个 BroadcastReceiver 对象 ( 标签的作用是 Intent-filter 对象。 broadcast.);filte
12、r 表示一个 Intent-filter received.) ,与我们在 AndroidManifest.xml 一样的。后面会讨论到如何创建一个 下面用手机接收信息这个例子来说明。对应代码如下: public class BroadcastReceiverTest extends Activity private Button myRegisterbtn; private Button myUnregisterbtn; private SMSReceiver myMessageReceiver; String SMS_ACTION EDIT_ACTION privatestaticfina
13、l vider.Telephony.SMS_RECEIVED; privatestaticfinalString ent.action.EDIT; Override public void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); myRegisterbtn = (Button)findViewById(R.id.registerbtn); myUnregisterbtn = (Butto
14、n)findViewById(R.id.unregisterbtn); myRegisterbtn.setOnClickListener(newmyRegisterListener(); myUnregisterbtn.setOnClickListener(newmyUnregisterListener(); class myRegisterListener implements OnClickListener Override public void onClick(View v) myMessageReceiver = new SMSReceiver(); /生成一个 BroadRecei
15、ver 对象 IntentFilter myFilter = new IntentFilter(); /生成一个 IntentFilter 对象 myFilter.addAction(SMS_ACTION); /为 IntentFilter 添加一个 Action BroadcastReceiverTest.this.registerReceiver(myMessageReceiver, myFilter); / 整个操作完成了 BroadcastReceiver 的注册。 class myUnregisterListener implements OnClickListener Overri
16、de public void onClick(View v) BroadcastReceiverTest.this.unregisterReceiver(myMessageReceiver); /将 BroadcastReceiver 对象在系统中解除注册 代码很简单,就是定义了两个按钮,其中一个是将 BroadcastReceiver 绑定到应用程序中, 另一个则是解除 BroadcastReceiver 在应用程序中的绑定。相应的,我们还需要将接收器的 类编写出来,为了方便测试,我们只在接收器类里编写一个打印输出,代码如下: public class SMSReceiver extends
17、 BroadcastReceiver Override public void onReceive(Context context, Intent intent) System.out.println(onReceivestart); 当 然 , 我 们 这 里 是 在 应 用 程 序 中 注 册 的 BroadcastReceiver , 所 以 就 不 用 在 AndroidManifest.xml 文 件 中 再 去 注 册 一 次 了 。( 读 者 可 以 尝 试 着 仍 然 去 AndroidManifest.xml 文件中注册,看看会发送什么现象。 )运行程序,并且点击注册按钮,
18、然后利用DDM来给模拟器发送一条短信。如图所示: 当我们点击完Send按钮后,查看控制台,则会发现“ on Receive start ”已经被打印出来了, 如下图所示: 这就意味着 , 接收器在 过滤到 发送信 息这样的事 件后, 接收到了 广播 。至此 , BroadcastReceiver 的两种注册方式就讲完了。 讲 完这 两种 方式 后,读者 可能 会有 一系 列疑问。 那就 是, 为什 么我这个 action 是 vider.Telephony.SMS_RECEIVED 的时候, 发送一个消息, 对应的接收器就 ( 参考 下载: http:/) 能够接收到广播
19、, 如果我的 action 不是这个, 那么发送的广 播还会被接收吗?又该怎么样确定到底一个 action 对应什么操作?从而才能够被广播接收 器接收到。 Android 系统中又多少内置的这种 action ?我们能不能自定义一个 action ?如果 可以的话如何定义呢? 首先,我们来考察一下 Android 内置的 Broadcast Actions 。 Android 内置的 Broadcast Actions 在 Android 平台中,内置了很多 Action ,用于帮助开发者监听手机上所发生的各种事件。下 面给出几个内置的 BroadcastAction 的例子: android
20、.intent.action.BATTERY_CHANGED 充电状态,或者电池的电量发生变化 ent.action.SCREEN_ON 屏幕已经被打开 ent.action.PACKAGE_REMOVED 设备上删除了一个应用程序包 ent.action.TIME_TICK 当前时间已经变化(正常的时间流逝) 如果要查询BroadcastAction 的完整列表,可以在官方 SDK的帮助文档里面找到 Intent类, 在常量定义的解释中,去找 Broadcast Action 开头的信息就可以了。例如我们找到 String 类
21、型的常量:ACTION_BATTERY_LOV后面的解释是以“ Broadcast Actio n ”开头的。 String ACTION_BATTERY_LOW Broadcast Action: Indicates low batterycondition on the device. 一般来说, Android 操作系统给我们提供的内置的 Broadcast Action 是够用的,当然我们也 可以进行自定义 Broadcast 的 Action 。 自定义 Broadcast Action 自定义 Broadcast Actions 其实就是自定义一个字符串常量。然后将这个常量广播出去
22、,接 收的地方再接收这个常量就可以了。下面利用代码来说明自定义BroadcastAction ,同时, 这里还将 BroadcastReceiver 和负责广播的工程分开成两个工程来说明,对于不同工程之间 的广播接收的处理方式。代码如下: public class MyBroadcast extends Activity public static final String NEW_BROADCA=STcom.todd.NEW_BROADCAST; /* 这个静态常量字符串可以自己随便定义,代表自定义的action*/ Override public void onCreate(Bundle
23、savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.main); Button mybutton =(Button)findViewById(R.id.mybutton); mybutton.setOnClickListener(newButton.OnClickListener() public void onClick(View v) Intent myIntent = new Intent(NEW_BROADCAST); myIntent.putExtra(MSG, 地瓜地瓜, 我
24、是土豆! ); myIntent.setAction(NEW_BROADCAST); sendBroadcast(myIntent); ); XML文件中只需要定义一个按钮 Button android:id=+id/mybutton android:layout_width=fill_parent android:layout_height=wrap_content android:text= 发送广播 / 然后再建立一个工程,作为接收的工程,这个工程负责接收广播工程广播出来的数据。代码 如下: public class MyReceiver extends BroadcastReceiver /* Calledwhen th
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 强信念课件教学课件
- 企业并购咨询合同
- 企业客户答谢宴用车协议
- 个人与企业之间信用贷款合同
- 代言权放弃协议书
- 二手房产买卖协议过户
- 企业考察包车合同范本
- 产品质量赔偿和解协议
- 个人房产抵押贷款合同范例
- 企业园区物业管理沙盘推演
- 院感病例(讲稿)
- 高考英语单词3500记忆短文40篇
- 北京市商业地产市场细分研究
- 2023-2024学年重庆市大足区八年级(上)期末数学试卷(含解析)
- 肺结节科普知识宣讲
- 网络直播营销
- 2024年节能减排培训资料
- 2024传染病预防ppt课件完整版
- 2024年华融实业投资管理有限公司招聘笔试参考题库含答案解析
- 2024年1月普通高等学校招生全国统一考试适应性测试(九省联考)历史试题(适用地区:贵州)含解析
- 《宽容待人 正确交往》班会课件
评论
0/150
提交评论