android四大组件之Broadcast,androidbroadcast
- 广播的概念
- 现实中:我们常常使用电台通过发送广播发布消息,买个收音机,就能收听
- Android:系统在产生某个事件时发送广播,应用程序使用广播接收者接收这个广播,就知道系统产生了什么事件。Android系统在运行的过程中,会产生很多事件,比如开机、电量改变、收发短信、拨打电话、屏幕解锁
-
广播接收者的注册
Android四大组件都要在清单文件中注册
广播接收者比较特殊,既可以在清单文件中注册,也可以直接使用代码注册
有的广播接收者,必须代码注册如 电量改变,屏幕锁屏和解锁
-
使用清单文件配置
<receiver android:name="接收广播的实现类所在的包"> <intnt-filter> <android:name="要接收的广播"> <android:data=""> ...... </intent-filter> </receiver>
-
通过代码的实现
//创建广播接收者对象 receiver = new ScreenOnOffReceiver(); //通过IntentFilter对象指定广播接收者接收什么类型的广播 IntentFilter filter = new IntentFilter(); filter.addAction(Intent.ACTION_SCREEN_OFF); filter.addAction(Intent.ACTION_SCREEN_ON); //注册广播接收者 registerReceiver(receiver, filter);
-
解除注册广播接收者 解除注册之后,广播接收者将失去作用
unregisterReceiver(receiver);
- 为什么
-
-
广播的接收
在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。 而BroadcastReceiver是对发送出来的Broadcast进行过滤接受并响应的一类组件。 广播接收者(BroadcastReceiver)用于接收广播Intent的, 广播Intent的发送是通过调用sendBroadcast /sendOrderedBroadcast来实现的。通常一个广播Intent可以被订阅了此Intent的多个广播接收者所接收。
-
实现一个BroadcastReceiver 接收BroadCast发送的广播
需求:监听用户拨打电话,在用户拨打电话号码前自动加上17951等
拦截的广播:
<action android:name="android.intent.action.NEW_OUTGOING_CALL"></action>
需要的权限:
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
1.新创建一个Android工程《IPCaller》
2.在src目录下新创建一个类IPCallerReceiver继承BroadcastReceiver,重写OnReceive方法。
public class IPCallReveiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { //获取拨打的电话号码 String resultData = getResultData(); //在电话号码前加上17951,然后返回数据 setResultData("17951"+resultData); } }
3.在AndroidManifest.xml中注册广播接收者
<receiver android:name="com.itheima.ipcaller.IPCallReveiver"> <intent-filter android:priority="1000"> <action android:name="android.intent.action.NEW_OUTGOING_CALL"></action> </intent-filter> </receiver>
在下面的配置文件中 <intent-filter android:priority="1000">属性代表着给当前接收者设置优先级,优先级越高越优先接收到广播(只有有序广播注册才有效)
运行上面的代码,然后拨打电话5556,发现拨出去的号码已经变为179515556。 运行效果图如下:
-
发送自定义广播
-
发送无序广播
- 无序广播不可以被拦截,如果被拦截的话会报错:
- 无序广播可以视为所有广播接收者同时接收到广播
-
无序广播使用sendBroadcast方法来发送
public void sendBroadcast(View view){ //定义一个意图 Intent intent = new Intent(); //设置Action 可以接受到该广播的意图过滤器 intent.setAction("com.itheima.broadcast"); //绑定数据 intent.putExtra("data", "我是无序广播数据"); //发送无序广播 sendBroadcast(intent); }
-
发送有序广播
- 有序广播可以被拦截,且优先级搞得接收者可以拦截优先级低的
- 广播接受者的优先级的取值范围是:1000(最高)~ -1000(最低)
- 相同的优先级下,接收的顺序要看清单文件中的声明顺序,先声明先接收广播
- 有序广播使用sendOrderedBroadcast()方法发送,可以使用abortBroadcast()方法拦截 *广播接收者的优先级可以在清单文件中声明接收者时,在<intent-filter>标签下通过设置“android:property”属性来设置
我们新创建一个项目,来演示无序广播的发送和接收过程
2.在默认的MainActivity的布局中添加一个按钮,绑定事件,该事件的核心功能是发送一个有序广播,MainActivity类代码清单如下:
public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void sendOrder(View view) { // 意图 Intent intent = new Intent(); //定义动作 intent.setAction("com.itheima.data"); //发送有序广播 //第一个参数 Intent类型:意图 //第二个参数 String类型 receiverPermission,接收器需要的权限 //第三个参数BroadcastReceiver类型,自己定义的接收器作为最终接收器 //第四个参数Handler类型,用于执行接收器的回调,如果为null则在主线程中执行 //第五个参数int类型,结果代码的初始码 //第六个参数初始化参数 //第七个参数Bundle类型,额外的数据 sendOrderedBroadcast(intent, null, null, null, RESULT_OK, "1万元钱", null); }
3.分别编写MyReceiver和MyReceiver2类,继承BroadcastReceiver类
MyReceiver类代码清单:
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); String resultData = getResultData(); Toast.makeText(context, "MyReceiver接收到"+action+"发布的广播:"+resultData, 1).show(); System.out.println("MyReceiver接收到"+action+"发布的广播:"+resultData); } }
MyReceiver2类代码清单:
public class MyReceiver2 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); String resultData = getResultData(); Toast.makeText(context, "MyReceiver2接收到"+action+"发布的广播:"+resultData, 1).show(); System.out.println("MyReceiver2接收到"+action+"发布的广播:"+resultData); } }
4.在AndroidManifest.xml中注册MyReceiver和MyReceiver2:
<receiver android:name="com.itheima.broadcastAndreceiver.MyReceiver"> <intent-filter android:priority="1000"> <action android:name="com.itheima.data"></action> </intent-filter> </receiver> <receiver android:name="com.itheima.broadcastAndreceiver.MyReceiver2"> <intent-filter android:priority="-1000"> <action android:name="com.itheima.data"></action> </intent-filter> </receiver>
在上面清单文件中我们给MyReceiver设置了最高优先级1000,给MyReceiver2设置了最低优先级-1000。
5.下面我们分多钟情况,分别演示有序广播的接收规律
直接部署上面的工程到模拟器,点击发送广播按钮,控制台结果为:
6.修改MyReceiver类的代码:在onReceive方法中添加abortBroadcast()方法,
public class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); String resultData = getResultData(); Toast.makeText(context, "MyReceiver接收到"+action+"发布的广播:"+resultData, 1).show(); System.out.println("MyReceiver接收到"+action+"发布的广播:"+resultData); abortBroadcast(); } }
然重新部署该工程,运行,点击发送广播按钮。这时控制台打印信息为
这说明优先级高的的广播接收者可以修改或拦截广播 优先级低的广播接收
-