Android四大组件--BroacastReceiver
本质上就是一个全局监听器,用于监听系统全局广播消息,因此它可以方便地实现系统内不同组件的通信。
1.BroacastReceiver简介
BroacastReceiver
用于接收程序所发出的Broadcast Intent
,创建方式分为两步:
-
构建需要启动的
BroacastReceiver
的Intent
-
调用
Context
的sendBroadcast()
或者sendOrderedBroadcast()
方法来启动指定的Broadreceiver
当程序发出一个Broadcast Intent之后所有匹配该Intent
的BroadReceiver
都有可能被启动.
2.创建广播接收器
继承BroadReceiver
类并实现其onReceive()
方法
public class DemoBroadReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
//一个广播接收器
Log.e("test", "onReceive: 接收器工作了" );
Log.i("test", "onReceive: "+context.getPackageName());
Log.i("test", "onReceive: "+intent.getAction());
}
}
2.指定广播接收器
两种方式(这里我使用的是系统自带的广播发送器,当我修改飞行模式状态的时候会触发我的接收器):
-
使用代码指定
public class MainActivity extends AppCompatActivity { BroadcastReceiver myBroadcastReceiver=new DemoBroadReceiver(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //指定一个广播接收器 动态方式 IntentFilter intentFilter=new IntentFilter(); intentFilter.addAction("android.intent.action.AIRPLANE_MODE"); registerReceiver(myBroadcastReceiver,intentFilter); } @Override protected void onDestroy() { super.onDestroy(); //手动卸载广播 unregisterReceiver(myBroadcastReceiver); } }
-
在xml中进行配置(与activity标签平级)
<receiver android:name="com.lhp.broadcast.DemoBroadReceiver"> <intent-filter> <action android:name="android.intent.action.AIRPLANE_MODE"></action> </intent-filter> </receiver>
两者的区别:
- 动态的方式由于是写在app的onCreae()方法内所以只有在程序运行的时候才会生效
- 写在xml中不论自己的程序是否在运行,都会生效
3.普通广播和无序广播
1.普通广播(Normal Broadcast) :异步传播,同一时刻所有接收者都可以接到。传递的效率较高,缺点是不能对收到的广播信息进行处理
2..无序广播 (Ordered Broadcast):Ordered Broadcast的接收者必须按照预先声明的顺序依次接收。如果同时有三个接收者A,B,C。默认是优先级别是其在xml中注册的顺序从上之下依次变低,也可以通过android:priority="numer"
来指定,数值在-1000~1000之间,数值越大,优先级越高。同时也可以通过IntentFilter
对象的setPriority()
来设置。 无序广播的接收者可以对收到的信息进行修改,还可以终止广播(abortBroadcast()
),优先级比它低的就看不到广播信息。
案例3.1--发送一个有序广播
mainActivity
public class OrderedBroadcast extends AppCompatActivity {
Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_ordered_broadcast);
//初始化按钮
btn=findViewById(R.id.btn_send);
//点击按钮发送广播
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent();
//自定义的Action
intent.setAction("com.lhp.orderedbroadcast.OrderedBroadcast.MY_ACTION");
intent.putExtra("msg","最初的广播");
//发送有序广播
sendOrderedBroadcast(intent,null);
//发送无序广播
//sendBroadcast(intent);
}
});
}
}
Receiver01
public class Receiver01 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.e("haha", "进入了Receiver01" );
String msg=intent.getStringExtra("msg");
Log.e("haha", "onReceive: "+msg );
Bundle bundle=new Bundle();
bundle.putString("first","Receiver01存入的消息");
setResultExtras(bundle);
//中断广播
//abortBroadcast();
Log.e("haha", "离开了Receiver01" );
}
}
Receiver02
public class Receiver02 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.e("haha", "onReceive: 进入了 Receiver02");
String msg=intent.getStringExtra("msg");
Log.e("haha", "onReceive: msg"+msg );
Bundle resultExtras = getResultExtras(true);
String first=resultExtras.getString("first");
Log.e("haha", "onReceive: first "+first );
}
}
AndroidManifest.xml(重点是两个receiver)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.lhp.orderedbroadcast">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".OrderedBroadcast">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<receiver android:name="com.lhp.receivers.Receiver01" >
<intent-filter android:priority="20">
<action android:name="com.lhp.orderedbroadcast.OrderedBroadcast.MY_ACTION"></action>
</intent-filter>
</receiver>
<receiver android:name="com.lhp.receivers.Receiver02" >
<intent-filter android:priority="10">
<action android:name="com.lhp.orderedbroadcast.OrderedBroadcast.MY_ACTION"></action>
</intent-filter>
</receiver>
</application>
</manifest>
点击发送后的运行结果:
![](https://img.haomeiwen.com/i8905696/37d88814f78c17a8.png)
如果取消掉Receiver01中的 中断广播注释,结果为:
![](https://img.haomeiwen.com/i8905696/b99fbf4ba1abff4f.png)
3.其他
- 不建议在广播接收器内做耗时操作,原因是广播发送者所在的线程,进程与接收者所在的线程进程均为同一个,若超过10秒未处理完毕,系统会判定为ANR(Application no Response)与此同时在等待期间,当前activity的输入框也无法点击。
网友评论