文章目录
在Android中,广播是一种在组件之间传递消息的机制,例如电量过低会发送一条提示广播,,如果要接受并且过滤广播中的消息,则需要使用BroadcastReceiver(广播接收者),广播接收者是**Android四大组件(Activity、Service、BroadcastReceiver和ContentProvider)**之一,通过广播接收者可以监听系统中的广播消息,实现不同组件之间通信
7.1 广播机制概述
Android中的广播机制用于进程和线程之间的通信,具体流程实现如下
- 广播接受者通过Binder机制在处理中心AMS中进行注册
- 广播发送者通过Binder机制向AMS发送广播
- AMS查找到符合条件的广播接收者,将广播发送到相应的消息循环队列中
- 程序执行消息循环会收到此广播,并会调广播接受者的onReceive()方法进行相关的处理
广播机制用在单一组件内,多个组件之间,多个进程的不同组件之间,不同APP组件之间,或是Android和APP之间的通信,后三者较为常见
- 广播发送者只负责发送广播,至于广播有无接收者接受,或者何时接受都不需要关心,广播发送者和广播接受者的执行是异步的
7.2 广播接收者
7.2.1 什么是广播接收者
当Android产生一个广播事件的时候,可以有很多个对应的广播接收者接受并进行处理,这些广播接收者需要在清单文件中或者代码中注册并指定要接收的广播事件,然后再继承BroadcastReceiver的类,再重写该类的onReceive()方法,并再该方法中对广播事件进行处理
7.2.2 创建广播接收者
第一种注册方法(直接创建一个类来继承对应的类)
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
...
}
}
第二种注册方法
如上图,输入对应类名,即可快捷创建类
注意事项
- 第二种方法创建的时候,可以删除默认抛出的异常
- 如下图
注册广播接收者(方法一)
此方法为动态注册,即在代码中进行注册
public class MainActivity extends AppCompatActivity{
private MyReceiver myReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ContentResolver resolver = getContentResolver();
myReceiver = new MyReceiver();//实例化广播接收者
String action = "android.povider.Telephony.SMS_RECEIVED";
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(action);//实例化过滤器
registerReceiver(myReceiver,intentFilter);//注册广播,第一个参数为广播的接收者,第二个参数为过滤器
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myReceiver);//当activity销毁的时候注销广播接收者
}
}
注册广播接收者(方法二)
此方法为静态注册,也就是在清单文件中注册,该方法在Android 8.0后不适用,接受不到广播
<receiver
android:name=".MyReceiver"
android:enable="true"
android:exported="true">
</receiver>
7.3 实战演练
目标:实现简单的广播发送和接受功能
具体实现:
mainactivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private MyReceiver myReceiver;
private Button mbtn_send;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
init();
ContentResolver resolver = getContentResolver();
myReceiver = new MyReceiver();//实例化广播接收者
String action = "test";
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(action);//实例化过滤器
registerReceiver(myReceiver,intentFilter);//注册广播
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myReceiver);//当activity销毁的时候注销广播接收者
}
void init() {
mbtn_send = findViewById(R.id.btn_send);
mbtn_send.setOnClickListener(this);
}
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.setAction("test");
sendBroadcast(intent);//发送广播
mbtn_send.setText("广播成功");
}
}
Myreceiver.java
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals("test")) {
Toast.makeText(context, "接收到广播", Toast.LENGTH_SHORT).show();
}
}
}
7.3.3 广播的类型
Android分为两种广播类型,无序广播和有序广播
无序广播
完全异步执行,所有监听到这个广播的广播接收者都会接收到此广播消息,但是接受和执行的顺序是不确定的,这种广播方式的效率高,但是无法被拦截
有序广播
按接收者声明的优先级依次接收,发送广播的时候,只会有一个广播接收者能够接收到此消息,在当前广播接收者中逻辑执行完后,广播才会继续传递,这种广播的效率低,可以拦截
优先级的设置方法
使用IntentFilter对象(过滤器)的setPriority()方法设置优先级
intentfilter.setPriority(1000);//数值越大优先级越高
若两个广播接收者的优先级一样,则先注册的广播接收者优先级更高