赵工的个人空间


专业技术部分转网页计算转业余爱好部分


 手持终端

首页 > 专业技术 > 手持终端 > Android系统的广播消息接收
Android系统的广播消息接收

Android广播分为广播发送者和广播接收者,通常情况下,BroadcastReceiver指的是广播接收者,用于异步接收广播Intent。广播Intent通过调用Context.sendBoardcast()等方法实现发送,调用Context.BroadcastReceiver()方法实现接收。通常,一个广播Intent可以被订阅了此Intent的多个广播接收者所接收。很多广播都产生于系统,如电池电量变化、用户改变语言设置等。
广播接收者没有用户界面,但可以为接收信息启动一个Activity,或者使用NotificationManager来通知用户。BroadcastReceiver接收广播方式一般有两种:
·Normal Broadcasts:调用Context.sendBoardcast方式,完全异步,都运行在未定义顺序下
·Ordered Broadcast:调用Context.sendOrderedBoardcast方法,发送到一个Receiver
所谓有序,就是每个Receiver执行后可以传播到下一个Receiver,也可以完全中止传播,即不传播给其他Receiver。而Receiver运行的顺序可以通过matched intent-filter里面的android: priority来控制,当优先级相同时,Receiver以任意顺序运行。
广播是Android组件间的一种通信方式,可以在同一App内部的同一组件内的单个或多个线性之间通信,可以在同一App内部的不同组件之间通信,还可以用于不同App之间通信,可以用于Android系统与App之间通信。一般情况下,同一App内同一组件之间的通信一般使用扩展变量作用域或Handler等方式实现,Broadcast更适用于不同进程间的消息通信。

1.发送广播:

1)自定义BroadcastReceiver:
自定义广播接收器需要继承基类BroadcastReceiver,并实现抽象方法onReceiver(context, receiver)。广播接收器接收到相应的广播后,会调用onReceiver()方法。默认情况下,广播接收器也是运行在UI线程中,因此onReceiver()方法中不能执行太耗时的操作。一般情况下,onReceiver()方法都会涉及与其他组件之间的交互,如发送Notification、启动Service等。
一个BroadcastReceiver对象只有在被调用onReceiver()方法时才有效,当从该函数返回后该对象就无效了,从而结束生命周期。因此,在所调用的onReceiver()方法中不能有过于耗时的操作,不能使用线程来执行。对于耗时的操作,应该在startService中完成。
2)注册类型:
BroadcastReceiver总体上分为静态注册和动态注册两种类型。
⑴静态注册:
直接在AndroidManifest.xml文件中进行注册:
<receiver android:enabled=["true"|"false"]
android:exported=["true"|"false"]
android:icon="drawable resource"
android:label="string resource"
android:name="string"
android:permission="string"
android:progress="string"
......
</receiver>
其中属性:exported用于标识BroadcastReceiver能否接收其他App发出的广播,其默认值由receiver中有无intent-filter决定,如果有默认为true,否则false。permission如果设置,具有相应权限的广播发送方发送的广播才能被此BroadcastReceiver所接收。process设置BroadcastReceiver运行所处的进程,默认为App的进程,也可以指定独立的进行。示例:
<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
其中,intent-filter用于指定此广播接收器将用于接收特定类型的广播类型,示例中是用于接收网络状态改变或开启启动时系统自身所发出的广播。
⑵动态注册:
动态注册时,不需要AndroidManifest.xml中注册<receiver/>组件,直接在代码中通过调用Context的registerReceiver函数,就可以在程序中动态注册BroadcastReceiver。使用方法为:
mBroadcastReceiver=new MyBroadcastReceiver();
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction(BROADCAST_ACTION);
registerReceiver(mBroadcastReceiver,intentFilter);
注册后,不使用时要用unregisterReceiver()方法注销。一般在Activity的onStart方法中注册,在onStop方法中注销;或在onCreate方法中注册,就在OnDestroy方法中注销;在onResume方法中注册,就在onPause方法中注销。

2.有序广播:

有序广播指的是发送出去的广播被BroadcastReceiver按照先后顺序接收,定义过程与普通广播一样,但发送方法使用sendOrderedBoardcast。
多个当前已经注册且有效的BroadcastReceiver接收有序广播时,是按照先后顺序接收,先接收的BroadcastReceiver可以对此有序广播进行截断,使后面的BroadcastReceiver不再接收到此广播,也可以对广播进行修改。
BroadcastReceiver接收的先后顺序按照优先级priority属性值从大到小排序,对于具有相同的优先级的广播,动态广播会排在前面。
3.接收系统广播消息:
Android系统内置了多个系统广播,只要涉及手机的基本操作,基本上都会发出相应的系统广播,如开启启动、网络状态改变、拍照、屏幕关闭与开启、点亮不足等。每个系统广播都具有特定的intent-filter,其中主要是action。

Copyright@dwenzhao.cn All Rights Reserved   备案号:粤ICP备15026949号
联系邮箱:dwenzhao@163.com  QQ:1608288659