一、怎么设置广播接收者?
二、收到广播后怎么办?
三、怎么设置和发送广播信息?
在Android系统中,广播是一种运用在组件之间传递消息的机制,例如电池过低时会发送一条提示广播。那么我们如何去接收这条信息呢?如果要接收并过滤广播中的消息,我们就需要用到BroadcastReceiver(广播接收者),在安卓学习笔记一种我们提过Activity、Service、ContentProvider、BroadcastReceiver是四大组件,通过广播接收者可以监听系统中的广播消息,实现不同组件之间的通信。
1、广播是不同组件间进行通信的一种机制,广播可分为无序广播和有序广播
2、一个“活的”接收者接收特定的广播消息并作出回应,主要由intent-filter,action来实现,是不是觉得似曾相识呢?我们在隐式intent的时候也用到过
3、receiver在AndroidManifest.xml中以标签显示
4、receiver可以被activity或者service注册
5、receiver有onReceive()回调方法
可能你在看到这儿的时候有很多的问号,那么请带着疑问接着看下去,你会找到答案的
如我们文章开头提到的系统发出一条电池电量过低的广播消息,那我们要怎么样才能接收到这条信息呢?就好比《爱情公寓》里曾小贤主持的电台,我们怎么样才能接收到这个节目呢?就是要把我们的收音机调到对应的频道上。
同理,我们也需要把广播接收者注册一下,相当于“我们订阅了这个频道”,这样我们就可以接收到“这个频道的消息”了。以接收系统广播“电量过低”为例:
1.动态注册
特点:
package com.example.receivebroadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class Receiver3 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
}
}
创建广播接收者完成后,我们需要在MainActivity中注册广播接收者Receiver3
(MainActivity.java):
ackage com.example.receivebroadcast;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private Receiver3 receiver3;
private IntentFilter filter3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
receiver3 = new Receiver3();//实例化广播接收者Receiver3
filter3 = new IntentFilter("android.intent.action.BATTERY_LOW");//实例化过滤器并设置要过滤的广播
registerReceiver(receiver3,filter3);//注册广播
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver3);//当MainActivity销毁时注销广播
}
}
这里我们要注意的几点:
①receiver3 = new Receiver3();//实例化广播接收者Receiver3
② filter3 = new IntentFilter(“android.intent.action.BATTERY_LOW”)//实例化过滤器并设置要过滤的广播
这是将几句语句合并后的样子,拆分开来我们可以按下面这样三句来写,两者是等价的
String action = "android.intent.action.BATTERY_LOW";//设置action
filter3 = new IntentFilter();
filter3.addAction(action);//隐式意图intent是setAction(),注意区分
③registerReceiver(receiver3,filter3);//注册广播
第一个参数表示广播接收者,第二个参数表示实例化的过滤器。
④unregisterReceiver(receiver3);//当MainActivity销毁时注销广播
这里我们重写了onDestroy()方法,在该方法中通过unregisterReceiver()方法注销广播接收者。
我们在onCreate()方法中注册了广播接收者,我们就要相应地在onDestroy()方法中注销广播接收者,这两者“配套”的。当然你在onStart()方法中注册时,那相应地在onStop()方法中注销。
2.静态注册
特点:
我们已经创建好了广播接收者并且已经注册了,我们可以接收到广播消息了,但是我们收到广播后要怎么办呢?这个“怎么办”就是在Receiver3类中的onReceive()方法中实现了。
我们可以看到未经处理的onReceive()方法默认抛出了一个未支持操作异常UnsupportedOperationException,正在后续程序中实现onReceive()方法时,删除该异常或者注释掉这句语句即可。
我们接收到了系统广播消息“电池电量过低”,我们想在日志里打印出这个消息,我们可以重写onReceive()方法
(Receiver3.java):
package com.example.receivebroadcast;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
public class Receiver3 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("Receiver","Receiver3 received broadcast:电池电量低");
}
}
注意的点:
①重写onReceive()方法,接收到广播消息后的操作在这里完成
我们可以接收系统的广播信息,那么我们可不可以自己设置和发送广播信息呢?即自定义广播。答案当然是肯定的。
广播分为无序广播和有序广播
无序广播
①无序广播完全是异步执行的,发送广播时,所有监听这个广播的广播接收都会接收到这个广播,但是接收和执行的顺序不确定。
②无序广播的效率比较高,但是无法被拦截
有序广播
①有序广播时按照广播接收者声明的优先级别被依次接收,发送广播时,只有一个广播能接收到这个消息,当在此广播接收者中逻辑执行完后,广播才会继续传递。当优先级相同时,先注册的广播接收者的优先级高
②有序广播效率低,但此类型是由先后顺序的,并且可以被拦截
创建一个广播消息,发送内容为“这是一条自定义消息”
( MainActivity.java):
package com.example.receivebroadcast;
import androidx.appcompat.app.AppCompatActivity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private Button btn1;
private Receiver1 receiver1;//广播接收者receiver1
private Receiver2 receiver2;//广播接收者receiver2
private IntentFilter filter1;//广播过滤器filter1
private IntentFilter filter2;//广播过滤器filter2
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn1= findViewById(R.id.btn1);
btn1.setOnClickListener(this);
receiver1 = new Receiver1();
filter1 = new IntentFilter("MyBroadcast");//广播过滤器的action为MyBroadcast,与发送的广播信息的action要一致
registerReceiver(receiver1,filter1);//注册广播接收者,第一个参数为广播接收者,第二个参数为实例化的过滤器
receiver2 = new Receiver2();
filter2 = new IntentFilter("MyBroadcast");
registerReceiver(receiver2,filter2);
}
@Override
public void onClick(View v) {
switch(v.getId()){//点击按钮来发送广播信息
case R.id.btn1:
Intent intent = new Intent();
intent.setAction("MyBroadcast");//设置广播信息的action为MyBroadcast
intent.putExtra("content","这是一条自定义广播消息");//设置广播信息的内容为“这是一条自定义广播消息”
sendOrderedBroadcast(intent,null);//发送有序广播,第一个参数是intent,第二个参数表示收到广播的权限信息,null表示可以被所有广播接受者接受
}
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver1);
unregisterReceiver(receiver2);
}
}
然后我们在广播接收者Receiver1和Receiver2接受到广播信息后要在日志中打印出接受到的广播信息“这是一条自定义消息”
(Receiver1.java):
public class Receiver1 extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
//throw new UnsupportedOperationException("Not yet implemented");
Log.i("Receiver","Receiver1 received broadcast:"+intent.getStringExtra("content"));//在日志中打印出接收到的广播消息
}
}
Receiver2同理可得