brocadcastReceiver
用来接收广播, 可以根据系统发生的一些时间做出一些处理
系统的一些事件,比如来电,来短信,等等,会发广播;可监听这些广播,并进行一些处理;
Android3.2以后,为了安全起见,对于刚安装的应用,需要通过点击进入应用(界面,用户确认之后),接收者才能起作用;
以后即使没有启动其界面,也能接收到广播;
1、定义广播接收者
1)定义类继承BroadcastReceiver,重写onReceive方法
2)清单文件中声明<receiver>,需要在其中配置<intent-filter>指定接收广播的类型;
3)当接收到匹配广播之后就会执行onReceive方法;
4)有序广播中,如果要控制多个接收者之间的顺序,可在<intent-filter>配置priority属性,系统默认为0,值越大,优先级越高;
5)BroadcastReceiver除了在清单文件中声明,也可以在代码中声明,使用registerReceiver方法注册Receiver;
<!-- 配置广播接收者,监听播出电话 -->
<receiver android:name="com.itheima.ipdialer.CallReceiver" >
<intent-filter>
<action android:name="android.intent.action.NEW_OUTGOING_CALL" />
</intent-filter>
</receiver>
2、广播的分类
1)普通广播:
普通广播不可中断,不能互相传递数据;
2)有序广播:
广播可中断,通过调用abortBroadcast()方法;
接收者之间可以传递数据;
3、广播接收者的注册方式
4大组件中,只有广播接收者是一个非常特殊的组件,其他3大组件都需要在清单文件中注册;
广播接收者,有2中注册方式:清单文件与代码方式,区别:
1)清单文件注册广播接收者,只要应用程序被部署到手机上,就立刻生效,不管进程是否处于运行状态;
2)代码方式,如果代码运行了,广播接收者才生效,如果代码运行结束,广播接收者,就失效;
这属于动态注册广播,临时用一下,用的时候,register,不用时unregister;
代码方式示例:
// 广播接收者
private class InnerReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String phone = getResultData();
String address = AddressDao.queryAddress(getApplicationContext(), phone);
showAddress(address);
}
}
// 注册示例代码
public void onCreate() {
// == 服务启动时,注册广播接收者 ==
innerReceiver = new InnerReceiver();
// 指定意图过滤器
IntentFilter filter = new IntentFilter(Intent.ACTION_NEW_OUTGOING_CALL);
this.registerReceiver(innerReceiver, filter);
}
// 销毁
public void onDestroy() {
// == 服务停止时,移除广播接收者 ==
this.unregisterReceiver(innerReceiver);
innerReceiver = null;
super.onDestroy();
}
4、发送广播
1)发送普通广播
①、使用sendBroadcast()方法可发送普通广播;
②、通过Intent确定广播类型,可携带数据,所有接收者都可以接收到数据,数据不能被修改,不会中断;
接收者无序(试验测试,是按照安装顺序来接收的);
③、广播时,可设置接收者权限,仅当接收者含有权限才能接收;
④、接收者的<receiver>也可设置发送方权限,只接受含有相应权限应用的广播;
发送者:
Intent intent = new Intent("com.itheima.broadcast.TEST"); // 指定动作;接收者,需要配置 intent filter才能接受到此广播
intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); // 包含未启动的过的应用(也可以收到广播),默认为不包含
intent.putExtra("data", "这是来着广播发送者发来的贺电"); // 广播发送者intent中的数据,接收者,修改不了
sendBroadcast(intent, null); // 发送无序广播,异步获取数据,不可中断,接收者之间不可传数据
接收者:
public class AReceiver extends BroadcastReceiver {
public void onReceive(Context context, Intent intent) {
System.out.println("AReceiver: " + intent.getStringExtra("data"));
}
}
<receiver android:name="com.itheima.a.AReceiver">
<intent-filter android:priority="2" >
<action android:name="com.itheima.broadcast.TEST" /> <!—接收指定动作的广播 -->
</intent-filter>
</receiver>
注意:
如果要在广播接收者中打开Activity,需要设置一下Intent.FLAG_ACTIVITY_NEW_TASK,因为广播接收者是没有Activity任务栈的
所以需要加上这个标记,方能在广播接收者中打开Activity,如:
public void onReceive(Context context, Intent intent) {
Log.i(TAG, "打电话了。。。");
String phone = this.getResultData();
if ("2008".equals(phone)) {
// == 打开手机防盗功能界面 ==
Intent safeIntent = new Intent(context, LostFindActivity.class);
safeIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 使Activity也能在Receiver中启动
context.startActivity(safeIntent);
abortBroadcast(); // 中断广播
setResultData(null); // 把电话号码设为null,就没有了通话记录
}
}
2)发送有序广播
- sendOrderedBroadcast() 发送有序广播;
- 通过Intent确定广播类型, 携带数据,Intent的数据同样修改无效;
- 跟普通广播一样,也可以设置相应的权限;
- 接收者可在<intent-filter>定义android:priority定义优先级,数字越大,优先级越高;
- 有序广播会被接收者逐个接收,中途可以中断,或添加、修改数据;
- 可以指定一个自己的广播接收者, 这个接收者将最后一个收到广播、不会被中断、不需要任何权限、不需要配置;
- 可以指定一个Handler用来在自己的接收者中进行线程通信;
发送者:
Intent intent = new Intent("com.itheima.broadcast.TEST"); // 指定动作;接收者,需要配置 intent filter才能接受到此广播
intent.setFlags(Intent.FLAG_INCLUDE_STOPPED_PACKAGES); // 包含未启动的过的应用(也可以收到广播),默认为不包含
intent.putExtra("data", "这是来着广播发送者发来的贺电"); // 广播发送者的intent中的数据,接收者,修改不了
// == 有序广播时,传递的数据可修改 ==
Bundle bundle = new Bundle();
bundle.putString("name", "关羽");
bundle.putInt("age", 22);
/* 定义权限,要求接收者,要有 com.itheima.permission.broadcast.RECEIVE 才能接收;
* 配置了最后接收者,Creceiver,无论你们怎么弄,我都可以收到广播,而且我不要配置,不要权限
* handle为null,表示使用系统默认的
* 传递了数据 1, “MainActivity”, bundle 这些都是可以在接收者修改的
*/
this.sendOrderedBroadcast(intent, "com.itheima.permission.broadcast.RECEIVE", new CReceiver(), null, 1, "MainActivity", bundle);
<!-- 定义一个权限 -->
<permission android:name="com.itheima.permission.broadcast.RECEIVE" >
</permission>
<!- 使用该权限-->
<uses-permission android:name="com.itheima.permission.broadcast.RECEIVE" />
接收者AReceive:
public void onReceive(Context context, Intent intent) {
System.out.println("AReceiver: " + intent.getStringExtra("data"));
Bundle bundle = this.getResultExtras(true); // 设置为true,表示即使没有传递Bundle数据,不会出现空指针
String message = String.format("%s : %s : %s, %s", getResultCode(), getResultData(), bundle.getString("name"), bundle.getInt("age"));
System.out.println(message); // 如果优先级高于其他接收者,将打印发送者的数据
// == 修改有序发送者,发来的数据 ==
bundle.putString("name", "赵子龙");
bundle.putInt("age", 222);
this.setResult(2, "AReceiver", bundle);
// == 修改Intent中的数据,无效 ==
intent.putExtra("data", "AReceiver 修改了数据");
this.setResultData("这是来自AReceiver的信息");
// this.abortBroadcast(); // 中断,比它优先级低的接收者,将不能接收到广播了
}
<!-- 要求广播发送者必须有对应的权限,我才收 -->
<receiver android:name="com.itheima.a.AReceiver"
android:permission="com.itheima.permission.broadcast.RECEIVE" >
<intent-filter android:priority="2" >
<action android:name="com.itheima.broadcast.TEST" />
</intent-filter>
</receiver>
接收者BReceive:代码及配置与上类似,只是优先级比A的低
5、广播的生命周期
- 广播接收者的生命周期非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁;
- 广播接收者中不要做一些耗时的工作,否则会弹出Application No Response错误对话框;
- 最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉;
- 耗时的较长的工作最好放在服务中完成;
brocadcastReceiver的更多相关文章
- BroadcastReceiver广播接受者简单使用
1.注册BrocadcastReceiver <receiver android:name=".FirstReceiver" > <!-- 指定能够接收的广播类型 ...
随机推荐
- mysql show full processlist
processlist命令的输出结果显示了有哪些线程在运行,可以帮助识别出有问题的查询语句,两种方式使用这个命令. 1. 进入mysql/bin目录下输入mysqladmin -u -p -h127. ...
- perl学习笔记(一)
关于Perl: Perl是一种高级.通用.直译式.动态的程序语言.最初设计者拉里·沃尔(Larry Wall)为了让在UNIX上进行报表处理的工作变得更方便,决定开发一个通用的脚本语言,而在1987年 ...
- js中Math.round、parseInt、Math.floor和Math.ceil小数取整小结【转】
[摘要:之前常常正在代码中看到Math.round.parseInt.Math.floor战Math.ceil那四个函数,固然晓得效果皆能够返回一个整数,然则对他们四者的差别照样没有太清晰,本日便做一 ...
- mongodb常见管理命令
----------1.复制数据库 wind:PRIMARY> show dbs; jinri 0.078GB local 1.078GB test 0.078GB wind 0.078GB w ...
- mysql 2013错误解决
今天,莫名其妙的来了个mysql 2013错误,导致无法登陆mysql gui工具,而且dos也进不去,提示ping 127.0.0.1,百度+google后: 这是在使用 mysql 的过程中,困扰 ...
- Hive Tuning(四) 从查询计划看hive.auto.convert.join的好处
今天我们来讲一下如何看懂Hive的查询计划. hive的执行计划包括三部分 – Abstract syntax tree – 可以直接忽略 – Stage dependencies – 依赖 – S ...
- 补充下.net知识
问题1: public int getvalue(int a) { try { a = a + ; ; } catch (Exception) { throw; } finally { a = a + ...
- PHP变量解析顺序variables_order
转载自:http://blog.csdn.net/knight0450/article/details/4291556 故事从一个有点诡异的BUG开始,后台一个使用频率不是很高的广告提交功能有时候会莫 ...
- 随机数Math.random()公式
1. 0-x之间的随机数: Math.round(Math.random()*x); 2. x至y之间的随机数 Math.round(Math.random()*(y-x)+x); 3. 1-x之间的 ...
- CI循环数组问题
当我们在Controll中把数据传递到view中如: $data['cates_data']=$this->Category_Model->byid_data($id); #调用模型层查询 ...