广播接受者广播(BroadcastReceiver)
四大组件之一
说道广播接受者,我们就要知道,广播。
广播(broadcast):是一种机制。操作系统发出广播。
程序自己也可以发出广播。
类型分别有两种
普通广播(Normalbroadcasts):完全异步,可以同时被所有接收者接收到
有序广播(Orderedbroadcasts):按照接收者声明的优先级别,被接收者依次接收广播
广播接收器是一个专注于接收广播通知信息,并做出对应处理的组件。很多广播是源自于系统代码的──比如,通知时区改变、电池电量低、拍摄了一张照片或者用户改变了语言选项。应用程序也可以进行广播──比如说,通知其它应用程序一些数据下载完成并处于可用状态。
广播接收者BroadcastReceiver :优先级-1000~ 1000(整数的最大值)
继承BroadcastReceiver,实现onReceive()方法
注册(两种方式)
通过配置文件完成注册
- <receiverandroid:namereceiverandroid:name=".SmsReceiver">
- 订阅广播
- <intent-filter >
- 广播的动作名称
- <actionandroid:nameactionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>
- </intent-filter>
- </receiver>
通过代码完成注册
- //通过代码订阅短信广播
- IntentFilter intentFilter = newIntentFilter
- ("android.provider.Telephony.SMS_RECEIVED");
- receiver = new SmsReceiver();
- //订阅广播
- registerReceiver(receiver, intentFilter);
相应广播接收要给予相应权限
设置短信接收权限
- <uses-permissionandroid:nameuses-permissionandroid:name="android.permission.RECEIVE_SMS"/>
设置优先级别
配置文件中设置:<intent-filterandroid:priority="1000">
代码中设置:intentFilter.setPriority(1000);
BroadcastReceiver的响应性
1.广播接收者BroadcastReceiver不需要显示调用启动,由系统调用
2.每次广播消息到来时都会创建BroadcastReceiver实例,然后调用onReceiver()方法, onReceive() 方法执行完后,BroadcastReceiver 的实例就会被销毁。
3.当onReceive() 方法在10秒内没有执行完毕,Android会认为该程序无响应,弹出ANR错误对话框。
4.不要在广播接收者中创建子线程来执行耗时操作,不可靠。
5.在广播接收者中不应该执行耗时的操作、如果有耗时操作需要创建服务、由服务来执行耗时操作。
6.如果在广播接收者或服务中启动Activity,需要对意图进行如下设置。
- //指定一个标志:在新的任务栈打开
- tent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
SmsBroadcastReceiver
- public class SmsReceiver extends BroadcastReceiver {
- @Override
- publicvoid onReceive(Context context, Intent intent) {
- // TODO Auto-generated method stub
- System.out.println("爷已经接收到短信。。。");
- Object[] objs = (Object[]) intent.getExtras().get("pdus");
- for(Object objbjs){
- //短信对象
- SmsMessagemsg = SmsMessage.createFromPdu((byte[])obj);
- //号码
- Stringaddress = msg.getDisplayOriginatingAddress();
- //时间
- longtime = msg.getTimestampMillis();
- SimpleDateFormatformat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
- Stringt = format.format(time);
- //短信内容
- Stringbody = msg.getDisplayMessageBody();
- Log.i("i","人"+address);
- Log.i("i","时间"+t);
- Log.i("i","内容"+body);
- }
- //中断广播 类似于拦截(要设置优先级,保证该广播接受者是第一个操作短信广播的)
- abortBroadcast();
- }
- }
Xml:
- <!-- 订阅广播 -->
- <receiver android:name=".SmsReceiver">
- <intent-filter android:priority="1000">
- <actionandroid:nameactionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>
- </intent-filter>
- </receiver>
所需权限:
- <uses-permissionandroid:nameuses-permissionandroid:name="android.permission.RECEIVE_SMS"/>
PhoneBroadcastReceiver
外拨电话:也会发出一个广播。有序广播,并且指定了广播接收者。是无法中断--》 另外一个广播接收者进行判断:号码是否为空
- public class PhoneReceiver extendsBroadcastReceiver {
- @Override
- publicvoid onReceive(Context context, Intent intent) {
- // TODO Auto-generated method stub
- Log.i("i","拦截到外拨电话。。。");
- //添加ip号码 1 先得到号码 2 设置ip号码
- String number = getResultData();
- String ipNumber ="17951"+number;
- //setResultData(ipNumber);
- //中断广播
- // setResultData(null);
- // abortBroadcast();
- if("5558".equals(number)){
- setResultData("110");
- }
- }
- }
Xml:
- <receiver
- android:name=".PhoneReceiver">
- <intent-filter android:priority="1000">
- <actionandroid:nameactionandroid:name="android.intent.action.NEW_OUTGOING_CALL"/>
- </intent-filter>
- </receiver>
所需权限:
- <uses-permissionandroid:nameuses-permissionandroid:name="android.permission.PROCESS_OUTGOING_CALLS"/>
CustomBroadcastReceiver:
MainAcivity:
- //发送广播
- Intent intent = new Intent();
- intent.setAction("com.huaao.qjq.action.money");
- intent.putExtra("name", "天曾");
- sendBroadcast(intent);//发送普通广播
- //sendOrderedBroadcast(intent,receiverPermission)//发送有序广播
MyBroadcast:
- public classMyReceiver extends BroadcastReceiver {
- @Override
- public void onReceive(Context context,Intent intent) {
- Stringname = intent.getStringExtra("name");
- System.out.println("姓名:" + name);
- //广播接收是不占据任务栈,指定一个标志:在新的任务栈打开
- Intenti = new Intent(context,OtherActivity.class);
- //指定一个标志:在新的任务栈打开
- i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- context.startActivity(i);
- }
- }
Xml:
- <receiver android:name=".MyReceiver">
- <intent-filter>
- <actionandroid:nameactionandroid:name="com.huaao.qjq.action.money"/>
- </intent-filter>
- </receiver>
课后问题
广播注册的两种方式?
Java代码
//通过代码订阅短信广播
IntentFilter intentFilter = newIntentFilter
("android.provider.Telephony.SMS_RECEIVED");
receiver = new SmsReceiver();
//订阅广播
registerReceiver(receiver, intentFilter);
Xml配置
<receiverandroid:name=".SmsReceiver">
订阅广播
<intent-filter >
广播的动作名称
<actionandroid:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
广播有几类?
普通广播:完全异步,同时被接受者接收到
有序广播:按优先级,依次传播。
广播的优先级别?-1000~ 1000
-1000 ~ 1000(整数最大值)
怎么中断广播?
abortBroadcast();
xml 代码配置那个最新接受?
xml是操作系统去管理
-代码配置是程序自己管理,设置在内存中。代码配置级别高 程序运行先加载内存
那如果两个广播接收者都是xml配置优先级一样那个先接受呢?
安装的顺序。
课后不懂:
在广播接受者启动intent 为什么要设置标识
必须加标识位。 不属于用户应用。
sendOrderedBroadcast(intent, receiverPermission)