前言
属于Android四大组件之一
分为:广播发送者,广播接收者
应用场景
1.不用组件之间通信
2.多线程通信
3.与Android系统在特定情况下通信
发送者
Intent intent = new Intent();
intent.setAction("sign:123456789");
intent.putExtra("temp", "测试广播");
sendBroadcast(intent);
接收者BroadcastReceiver
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
System.out.println(intent.getStringExtra("temp"));
}
}
临时注册
@Override
protected void onResume() {
super.onResume();
myBroadcastReceiver = new MyBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("sign:123456789");
registerReceiver(myBroadcastReceiver, intentFilter);
}
解除注册
@Override
protected void onPause() {
super.onPause();
//销毁在onResume()方法中的广播
unregisterReceiver(myBroadcastReceiver);
}
长期注册
<receiver android:name=".MyBroadcastReceiver">
<intent-filter>
<action android:name="sign:123456789" />
</intent-filter>
</receiver>
注意
Android 8.0更新中提到对于大部分静态注册广播不再有效,推荐使用临时注册方式
dog | bird | cat |
---|---|---|
q | b | c |
- 系统广播(System Broadcast)
Android中内置了多个系统广播:只要涉及到手机的基本操作(如开机、网络状态变化、拍照等等),都会发出相应的广播
每个广播都有特定的Intent - Filter(包括具体的action),Android系统广播action如下:
系统操作 | action |
---|---|
监听网络变化 | android.net.conn.CONNECTIVITY_CHANGE |
关闭或打开飞行模式 | Intent.ACTION_AIRPLANE_MODE_CHANGED |
充电时或电量发生变化 | Intent.ACTION_BATTERY_CHANGED |
电池电量低 | Intent.ACTION_BATTERY_LOW |
电池电量充足 | (即从电量低变化到饱满时会发出广播 Intent.ACTION_BATTERY_OKAY |
系统启动完成后(仅广播一次) | Intent.ACTION_BOOT_COMPLETED |
按下照相时的拍照按键(硬件按键)时 | Intent.ACTION_CAMERA_BUTTON |
屏幕锁屏 | Intent.ACTION_CLOSE_SYSTEM_DIALOGS |
设备当前设置被改变时(界面语言、设备方向等) | Intent.ACTION_CONFIGURATION_CHANGED |
插入耳机时 | Intent.ACTION_HEADSET_PLUG |
未正确移除SD卡但已取出来时(正确移除方法:设置--SD卡和设备内存--卸载SD卡) | Intent.ACTION_MEDIA_BAD_REMOVAL |
插入外部储存装置(如SD卡) | Intent.ACTION_MEDIA_CHECKING |
成功安装APK | Intent.ACTION_PACKAGE_ADDED |
成功删除APK | Intent.ACTION_PACKAGE_REMOVED |
重启设备 | Intent.ACTION_REBOOT |
屏幕被关闭 | Intent.ACTION_SCREEN_OFF |
屏幕被打开 | Intent.ACTION_SCREEN_ON |
关闭系统时 | Intent.ACTION_SHUTDOWN |
重启设备 | Intent.ACTION_REBOOT |
注:当使用系统广播时,只需要在注册广播接收者时定义相关的action即可,并不需要手动发送广播,当系统有相关操作时会自动进行系统广播
应用内广播
原因
1.其他app的action 相同 app一直收到其他app的广播
2.为了安全性
3.提升效率
注册
@Override
protected void onResume() {
super.onResume();
myBroadcastReceiver = new MyBroadcastReceiver();
IntentFilter intentFilter = new IntentFilter();
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
intentFilter.addAction("sign:123456789");
localBroadcastManager.registerReceiver(myBroadcastReceiver, intentFilter);
}
取消注册
@Override
protected void onPause() {
super.onPause();
//销毁在onResume()方法中的广播
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
localBroadcastManager.unregisterReceiver(myBroadcastReceiver);
}
发送广播
Intent intent = new Intent();
intent.setAction("sign:123456789");
intent.putExtra("temp", "测试广播");
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(Main.this);
localBroadcastManager.sendBroadcast(intent);