BroadcastReceiver(广播)的使用
(一)什么是广播?
概念:
- Android**四大组件**,全称BroadcastReceiver;
- 分为发送方和接收方,不论有无接收方,发送方都会发送消息;
- 可以实现页面和进程(APP)之间的通信。
广播的分类:
广播分类 | 解释 |
---|---|
无序广播 | 一旦发出无序广播,所有监听此广播的监听者都能接收。 |
有序广播 | 按照接收者的优先级逐一接收,优先级最高的接收者先接收,如果不终止则继续往下传递。 |
粘滞广播 | 当广播发出后,系统一直等到有接收者接收为止。 |
有序广播的属性及方法:
属性名/方法名 | 用途 |
---|---|
priority属性 | 在注册时,设置广播的优先级别,取值范围:-1000至1000 |
sendOrderedBroadcast方法 | 发送一个有序广播,优先级最高的广播最先接收到。 |
setResultExtras方法 | 在onReceive内部用,代表继续往下一级传递有序广播。 |
abortBroadcast方法 | 在onReceive内部用,如果不想继续传递,用此方法结束广播。 |
广播注册的两种类型:静态注册&动态注册
静态注册:在AndroidManifest中注册的广播属于常驻型广播,广播一直处于监听状态,一旦有发送者发了对应的广播,接收者就会被激活。
动态注册:在Java代码中注册的广播属于非常驻型广播,当前应用程序一结束,广播也就停止监听了。
(二)静态注册无序广播:
Step1:新建项目工程A,写入一个Button并添加监听,并通过SendBroadcast发送广播;
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent();
intent.setAction("zhifubao");//选择频道号
sendBroadcast(intent);//发送广播
}
});
Step2:新建项目工程B,在里面新建类继承BroadcastReceiver;
public class MySend extends BroadcastReceiver {
Step3:新建类中实现onReceive抽象方法:
@Override
public void onReceive(Context context, Intent intent) {
Log.e("支付宝在此","11111111111");
Toast.makeText(context, "支付宝在此", Toast.LENGTH_SHORT).show();
}
Step4:在AndroidManifest中注册BroadcastReceiver;
<receiver android:name=".MySend">//自定义类的路径
<intent-filter>
<action android:name="zhifubao" />频道号
</intent-filter>
</receiver>
(三)动态注册无序广播:
动态注册无序广播的步骤的前三个步骤同静态注册无序广播的一样,这里我们就直接跳过,不同的是第四步。
Step4:这里我们不在AndroidManifest中注册BroadcastReceiver,而是在Java代码中注册的广播。
private MySend mySend;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mySend=new MySend();
IntentFilter filter=new IntentFilter();
filter.addAction("zhifubao");
filter.setPriority(1000);
//动态注册广播接收器
registerReceiver(mySend,filter);
}
(四)静态注册有序广播
Step1:新建项目A,Context环境中需要通过sendOrderedBroadcast发送广播;
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent();
intent.setAction("zhifubao");
sendOrderedBroadcast(intent,null);
}
});
Step2:分别新建项目B和项目C,新建类继承BroadcastReceiver;
@Override
public void onReceive(Context context, Intent intent) {
Log.e("支付宝在此","11111111111");
Toast.makeText(context, "支付宝在此", Toast.LENGTH_SHORT).show();
@Override
public void onReceive(Context context, Intent intent) {
Log.e("美团在此","22222222222222");
Toast.makeText(context, "美团在此", Toast.LENGTH_SHORT).show();
}
Step3:在各自的AndroidManifest中注册BroadcastReceiver,这里需要注意的是需要写入priority属性设置优先级;
项目B:
<receiver android:name=".MySend">
<intent-filter android:priority="1000">
<action android:name="zhifubao" />
</intent-filter>
</receiver>
项目C:
<receiver android:name=".Service">
<intent-filter android:priority="-1000">
<action android:name="zhifubao"/>
</intent-filter>
</receiver>