BroadcastReceiver 广播接收者
2017-06-07 16:25
369 查看
系统的一些事件,比如来电,来短信,等等,会发广播;可监听这些广播,并进行一些处理;
Android3.2以后,为了安全起见,对于刚安装的应用,需要通过点击进入应用(界面,用户确认之后),接收者才能起作用;
以后即使没有启动其界面,也能接收到广播;
1、定义广播接收者
1)定义类继承BroadcastReceiver,重写onReceive方法
2)清单文件中声明,需要在其中配置指定接收广播的类型;
3)当接收到匹配广播之后就会执行onReceive方法;
4)有序广播中,如果要控制多个接收者之间的顺序,可在配置priority属性,系统默认为0,值越大,优先级越高;
5)BroadcastReceiver除了在清单文件中声明,也可以在代码中声明,使用registerReceiver方法注册Receiver;
2、广播的分类
1)普通广播:
普通广播不可中断,不能互相传递数据;
2)有序广播:
广播可中断,通过调用abortBroadcast()方法;
接收者之间可以传递数据;
3、广播接收者的注册方式
4大组件中,只有广播接收者是一个非常特殊的组件,其他3大组件都需要在清单文件中注册;
广播接收者,有2中注册方式:清单文件与代码方式,区别:
1)清单文件注册广播接收者,只要应用程序被部署到手机上,就立刻生效,不管进程是否处于运行状态;
2)代码方式,如果代码运行了,广播接收者才生效,如果代码运行结束,广播接收者,就失效;
这属于动态注册广播,临时用一下,用的时候,register,不用时unregister;
4、发送广播
1)发送普通广播
①、使用sendBroadcast()方法可发送普通广播;
②、通过Intent确定广播类型,可携带数据,所有接收者都可以接收到数据,数据不能被修改,不会中断;
接收者无序(试验测试,是按照安装顺序来接收的);
③、广播时,可设置接收者权限,仅当接收者含有权限才能接收;
④、接收者的也可设置发送方权限,只接受含有相应权限应用的发送者:
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”));
}
}
接收者BReceive:代码及配置与上类似,只是优先级比A的低
5、广播的生命周期
a. 广播接收者的生命周期非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁;
b. 广播接收者中不要做一些耗时的工作,否则会弹出Application No Response错误对话框;
c. 最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉;
d. 耗时的较长的工作最好放在服务中完成;
Android3.2以后,为了安全起见,对于刚安装的应用,需要通过点击进入应用(界面,用户确认之后),接收者才能起作用;
以后即使没有启动其界面,也能接收到广播;
1、定义广播接收者
1)定义类继承BroadcastReceiver,重写onReceive方法
2)清单文件中声明,需要在其中配置指定接收广播的类型;
3)当接收到匹配广播之后就会执行onReceive方法;
4)有序广播中,如果要控制多个接收者之间的顺序,可在配置priority属性,系统默认为0,值越大,优先级越高;
5)BroadcastReceiver除了在清单文件中声明,也可以在代码中声明,使用registerReceiver方法注册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确定广播类型,可携带数据,所有接收者都可以接收到数据,数据不能被修改,不会中断;
接收者无序(试验测试,是按照安装顺序来接收的);
③、广播时,可设置接收者权限,仅当接收者含有权限才能接收;
④、接收者的也可设置发送方权限,只接受含有相应权限应用的发送者:
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”));
}
}
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、广播的生命周期
a. 广播接收者的生命周期非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁;
b. 广播接收者中不要做一些耗时的工作,否则会弹出Application No Response错误对话框;
c. 最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉;
d. 耗时的较长的工作最好放在服务中完成;
相关文章推荐
- Android学习笔记之广播意图及广播接收者MyBroadcastReceiver、Broadcast
- Android(java)学习笔记177:BroadcastReceiver之 应用程序安装和卸载 的广播接收者
- BroadcastReceiver:广播接收者
- Android四大组件BroadcastReceiver 广播接收者
- Android笔记(五):广播接收者(Broadcast Receiver)
- 广播接收者(BroadcastReceiver)详解
- 广播接收者BroadcastReceiver
- Android自学笔记-17-广播接收者(BroadcastReceiver)
- android开发 - BroadcastReceiver 广播接收者
- Android开发22——广播接收者BroadcastReceiver的原理和注册方式
- 广播接收者--BroadcastReceiver
- BroadCastReceiver(广播接收者)动态注册简单例子
- Android开发22——广播接收者BroadcastReceiver的原理和注册方式 推荐
- Android 开发笔记三 BroadcastReceiver 广播接收者
- BroadcastReceiver(广播接收者)
- BroadcastReceiver广播接收者的两种注册方式
- BroadcastReceiver(广播接收者)
- Android中的广播接收者BroadcastReceiver
- BroadCastReceiver(广播接收者的静态注册)简单使用例子
- Android基础——广播接收者BroadcastReceiver