BroadCastReceiver广播接受者,安卓四大组件之一
广播三要素:
(1)广播发送者 : 发送广播
(2)广播接收者(调频): 用于接收广播
(3)要处理的事情 :处理广播的相关信息, Intent有图对象
广播的使用场景:
(1)同一APP下多个组件之间传递数据(Activity/Fragment/Service之间传递数据)
(2)2个APP之间传递数据
技能get点:
(1)自定义广播接受者
(2)使用广播接受者进行电话拦截和短信拦截和系统电量的变化
(1)自定义类继承BroadcastReceiver,重写onReceive方法
(2)注册广播(安卓的四大组件都需要注册)
静态注册:在清单文件中
动态注册:在代码中注册(注册和接触注册)
静态注册和动态注册的区别:假如说Activity是接受者:
动态注册:
(1)广播会跟Activity的生命周期的结束而结束;
(2)自由的控制注册和取消,有很大的灵活性
(3)动态注册在结束应用时就会消失
静态注册:
(1)广播不会跟随Activity的生命周期的结束而结束,一直存在,即使应用程序关闭,也会被唤醒接受广播
(2)全局的广播
(3)静态注册除非下载应用,否则会一直存在
注册、解除注册
onCreate():注册广播调用Context的registerReceiver()方法
onDestory():解除注册调用Context的unregisterReceiver()方法
public class MyBroadcast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals("com.xh.broad")){
String mes = intent.getStringExtra("mes");
Toast.makeText(context, "开始广播:"+mes, Toast.LENGTH_SHORT).show();
}
}
}
清单文件注册
<!-- 注册广播 -->
<receiver android:name=".MyBroadcast">
<intent-filter>
<!-- 频道 -->
<action android:name="com.xh.broad" />
</intent-filter>
</receiver>
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//动态注册广播
myBroadcast2 = new MyBroadcast2(this);
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.xh.broad.dong");
registerReceiver(myBroadcast2,intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
//销毁广播
unregisterReceiver(myBroadcast2);
}
特点
无序广播无法掐断广播
有序广播可以掐断广播
优先级从大到小
有序广播的方法
//掐断广播
abortBroadcast();
清单注册
<!-- 有序广播:范围-1000至1000 -->
<receiver android:name=".order.MyBroadcast_wu">
<intent-filter android:priority="-1000"><!-- 优先级 -->
<action android:name="com.xh.order"></action>
</intent-filter>
</receiver>
<receiver android:name=".order.MyBroadcast_you">
<intent-filter android:priority="1000">
<action android:name="com.xh.order"></action>
</intent-filter>
</receiver>
https://blog.csdn.net/cc_want/article/details/82344899
public class MainActivity extends AppCompatActivity {
MyBroad myBroad;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myBroad = new MyBroad();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(Intent.ACTION_BATTERY_CHANGED);//电量改变
intentFilter.addAction(Intent.ACTION_BATTERY_LOW);//低电量
intentFilter.addAction(Intent.ACTION_BATTERY_OKAY);//电量充足
intentFilter.addAction(Intent.ACTION_SCREEN_ON);//开屏
intentFilter.addAction(Intent.ACTION_SCREEN_OFF);//锁屏
intentFilter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);//飞行模式改变
intentFilter.addAction(Intent.ACTION_CAMERA_BUTTON);//按下拍照键时
intentFilter.addAction(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE);//正在移动APP时,发出的广播
intentFilter.addAction(Intent.ACTION_HEADSET_PLUG);//在耳机口上插入耳机时发出的广播
registerReceiver(myBroad,intentFilter);
}
}
public class MyBroad extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(Intent.ACTION_BATTERY_CHANGED)){//电量发生改变
int level = intent.getIntExtra("level", 0);
Toast.makeText(context, "当前电量:"+level, Toast.LENGTH_SHORT).show();
}else if(intent.getAction().equals(Intent.ACTION_BATTERY_LOW)){//低电量
Toast.makeText(context, "当前电量过低,请及时充电!", Toast.LENGTH_SHORT).show();
}else if(intent.getAction().equals(Intent.ACTION_BATTERY_OKAY)){//电量充足
Toast.makeText(context, "电量充足!", Toast.LENGTH_SHORT).show();
}else if(intent.getAction().equals(Intent.ACTION_SCREEN_OFF)){//锁屏
Toast.makeText(context, "锁屏!", Toast.LENGTH_SHORT).show();
}else if(intent.getAction().equals(Intent.ACTION_SCREEN_ON)){//开屏
Toast.makeText(context, "开屏!", Toast.LENGTH_SHORT).show();
}else if(intent.getAction().equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)){//飞行模式改变
Bundle extras = intent.getExtras();
String state = extras.get("state").toString();
if(state.equals("true")){
Toast.makeText(context, "开启飞行:"+state, Toast.LENGTH_SHORT).show();
}else if(state.equals("false")){
Toast.makeText(context, "关闭飞行:"+state, Toast.LENGTH_SHORT).show();
}
}else if(intent.getAction().equals(Intent.ACTION_CAMERA_BUTTON)){//按下拍照键
Toast.makeText(context, "拍照了:", Toast.LENGTH_SHORT).show();
}else if(intent.getAction().equals(Intent.ACTION_EXTERNAL_APPLICATIONS_UNAVAILABLE)){//正在移动APP时,发出的广播
Toast.makeText(context, "正在移动APP时,发出的广播:", Toast.LENGTH_SHORT).show();
}else if(intent.getAction().equals(Intent.ACTION_HEADSET_PLUG)){//在耳机口上插入耳机时发出的广播
boolean state = intent.hasExtra("state");
if(state){
int extra = intent.getIntExtra("state", 0);
if(extra==0){
Toast.makeText(context, "拔出耳机", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(context, "插入耳机", Toast.LENGTH_SHORT).show();
}
}
}
}
}