官网给的定义很准确:Android 应用与 Android 系统和其他 Android 应用之间可以相互收发广播消息,这与发布-订阅设计模式相似。这句话,可能你一开始不太理解,还没get到它的准确,你记得看完文章,或者你真正了解了广播,再回头看这句话,那个感觉就有了。
作为开发者经常用到广播的场景一:自定义广播接受者,在应用的一个地方发送广播,在另外一个地方接受广播做事情。很方便(但很消耗资源,最好别这样,EventBus了解一下,我们这里只是用来说明广播)。
按注册方式分为:静态注册广播
先自定义 广播接受者 继承BroadcastReceiver 类,然后重写onReceive方法(做接收到广播的逻辑操作)
/**
* description:
*
* @author zhouzhihao
* @time 2020/12/7 0007
*/
public class TestBroadcastRecerver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"我是静态广播接受者",Toast.LENGTH_SHORT).show();
}
}
在AndroidManifest.xml 中声明
在需要的地方,发送广播,如果需要action过滤,就在intent里面addAction。
priority是控制广播优先级的,值越大,优先级越高,越早接到广播。
//测试静态广播
sendBroadcast(new Intent(this, TestBroadcastRecerver.class));
动态注册广播
先自定义 广播接受者 继承BroadcastReceiver 类,然后重写onReceive方法(做接收到广播的逻辑操作)
/**
* description:
*
* @author zhouzhihao
* @time 2020/12/7 0007
*/
public class DynamicBroadcast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"我是动态注册广播接受者",Toast.LENGTH_SHORT).show();
}
}
然后注册的时候,
//动态广播 第一种
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("com.dynamic");
intentFilter.addAction(Intent.ACTION_SCREEN_ON);
registerReceiver(dynamicBroadcast,intentFilter);
//动态广播第二种(推荐)
LocalBroadcastManager localBroadcastManager=LocalBroadcastManager.getInstance(context);
localBroadcastManager.registerReceiver(dynamicBroadcast,intentFilter);
Intent intent=new Intent();
intent.setAction("com.dynamic");
localBroadcastManager.sendBroadcast(intent);
动态注册和静态注册的区别,动态注册的生命周期跟随它所在的那个activity做的动态注册的生命周期。
有两种官网是这样说的,所以推荐用第二个。而Android 9 api 28 会没有这个LocalBroadcastManager, 如果你是这种情况,网上的做法是加入android -v4的包,加入后,android studio 会提示你用androidx 所以你就用
implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'
附上官网链接:广播概览 | Android 开发者 | Android Developers
场景二:接收Android系统发送的一些系统广播,比如下载apk包做更新时,下载完成文件后系统会发送下载完成的广播,这样应用就能在收到广播后做一些操作逻辑,下面是Android的各种系统广播:
系统操作 | 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 |
其中我试了Intent.ACTION_SCREEN_ON,注意不能使用静态注册的方式,必须采用动态注册的方式才有效。
先自定义 广播接受者 继承BroadcastReceiver 类,然后重写onReceive方法(做接收到广播的逻辑操作)
/**
* description:
*
* @author zhouzhihao
* @time 2020/12/7 0007
*/
public class DynamicBroadcast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,"我是动态注册广播接受者",Toast.LENGTH_SHORT).show();
}
}
然后注册的时候,加上Intent.ACTION_SCREEN_ON
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction(Intent.ACTION_SCREEN_ON);
registerReceiver(dynamicBroadcast,intentFilter);