1、什么是广播
BroadcastReceiver的中文翻译是广播接收者,是Android四大组件之一。
这个广播跟我们传统意义中的电台广播有些相似之处。之所以叫做广播,就是因为它只负责“说”而不管你“听不听”,也就是不管你接收方如何处理。
另外,广播可以被不只一个应用程序所接收,当然也可能不被任何应用程序所接收。
2、广播的三大要素
1、广播(Broadcast) - 用于发送广播;
2、广播接收器(BroadcastReceiver) - 用于接收广播;
3、意图内容(Intent)-用于保存广播相关信息的媒介。
3、广播分类
1、标准广播
一种异步执行的广播,发送使用sendBroadcast()方法发出,发送后,内容几乎同时达到多个广播接收者,广播接收者没有先后顺序,也不相互影响,这种广播效率比较高,但无法被截断
2、有序广播
一种同步执行的广播,发送使用sendOrderedBroadcast()方法发出,发送后,同一时刻,只能有一个广播接收者能收到这条广播,当该接收者处理完这条广播后,广播才会继续传递。所以这类广播有先后顺序,接收者也可以使用abortBroadcast()终止广播继续发送
4、如何使用
(1)标准广播
发送广播的代码:
Intent intent = new Intent();
intent.putExtra("content","广播开始啦");
intent.setAction("MYRECEIVER_ACTION");
sendBroadcast(intent);
接收广播:
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if("MYRECEIVER_ACTION".equals(action)){
String content = intent.getStringExtra("content");
Toast.makeText(context,content,Toast.LENGTH_LONG).show();
}
}
}
注册广播 :
广播注册分为两种,动态注册和静态注册
静态注册:
静态注册方式是在AndroidManifest.xml的application里面定义receiver并设置要接收的action。
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="MYRECEIVER_ACTION"/>
</intent-filter>
</receiver>
动态注册:
动态注册方式是在activity里面调用当前上下文对象的registerReceiver() 方法来注册,和静态的内容差不多。一个形参是receiver对象,另一个是IntentFilter对象。而IntentFilter构造方法的参数是要接收的action。
动态注册方式特点:在代码中进行注册后,当应用程序关闭后,就不再进行监听。
MyReceiver receiver= new MyReceiver();
//创建过滤器,并指定action,使之用于接收同action的广播
IntentFilter filter = new IntentFilter("MYRECEIVER_ACTION");
//注册广播接收器
registerReceiver(receiver, filter);
关闭接收器
unregisterReceiver(receiver);
问题
Background execution not allowed: receiving Intent { act=MY_RECEVIER flg=0x10 (has extras) } to com.ugrow.mytest/.broadcast.MyReceiver
android8.0及以上系统关于广播的规定:发现果然是对隐式广播做了限定
8.0==》API 26==》O
解决办法
//参数1-Context 参数2-广播接收者所在的路径名
ComponentName componentName=new ComponentName(SendActivity.this,"com.ugrow.mytest.broadcast.MyReceiver");
intent.setComponent(componentName);
注意
1、一般在onStart中注册BroadcastReceiver,在onStop中取消BroadcastReceiver,只有动态注册的广播接收者才需要解除注册。
2、一个BroadcastReceiver 对象只有在被调用onReceive(Context, Intent)时才有效,当从该函数返回后,该对象就无效的了,结束生命周期。
3、动态注册的时候 去掉intent.setComponent(componentName);
4、广播的优先级 <intent-filter android:priority="1000"> 值越大优先级越大
(2)有序广播
发送有序广播
//发送有序广播
//创建Intent对象
Intent intent =new Intent();
String action ="MY_ACTIOIN";
intent.setAction(action);
intent.putExtra("content","有序广播开始了");
//发送有序广播
/**
* 第一个参数:Intent
* 第二个参数:receiverPermission null
*/
sendOrderedBroadcast(intent,null);
接收广播
广播接收者1
public class MyOrderReceiverextends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if ("MY_ACTIOIN".equals(action)) {
String content = intent.getStringExtra("content");
Log.d("TAG","MyOrderReceiver=" + content);
//添加数据
Bundle bundle =new Bundle();
bundle.putString("name","this is MyOrderReceiver");
//传递
setResultExtras(bundle);
}
}
}
广播接收者2
public class MyOrderReceiver1extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if ("MY_ACTIOIN".equals(action)) {
String content = intent.getStringExtra("content");
Log.d("TAG","MyOrderReceiver1=" + content);
//获取上一个广播传递的数据
Bundle bundle = getResultExtras(true);
String name = bundle.getString("name");
Log.d("TAG","MyOrderReceiver1=name=" + name);
}
}
}
广播注册
<receiver android:name=".broad.MyOrderReceiver">
<intent-filter android:priority="200">
<action android:name="MY_ACTIOIN" />
</intent-filter>
</receiver>
<receiver android:name=".broad.MyOrderReceiver1">
<intent-filter android:priority="100">
<action android:name="MY_ACTIOIN" />
</intent-filter>
</receiver>
结束广播
abortBroadcast();