除了开机自启的建议都用动态广播,开机自启的用静态广播。Android8以后对静态广播做一些限制。
标准广播:
动态注册:(这里以动态注册监听网络变化为例)
新建一个BroadcastTest项目,修改MainActivity的代码:
解释一下:
我们在MainAvtivity中定义了一个内部类NetworkChangeReceiver,这个类继承自BroadcastReceiver,重写父类的onReceiver()方法。当网络状态发生变化时,onReceiver()方法就会被执行。
在oonCreate方法中:
1.创建一个IntentFilter实例,添加一个android.net.conn.CONNECTIVITY的action(当网络状态发生变化时,系统发出广播的值为android.net.conn.CONNECTIVITY,也就是说我们的广播接收器想监听什么样的广播,这里就添加相应的action)。
2.创建NetworkReceiver的实例,将NetworkReceiver的实例和IntentFilter的实例传入,并调用registerReceiver()方法进行注册,这样NetworkChangeReceiver就能接收到所有值为android.net.conn.CONNECTIVITY的广播了,也就实现了监听网络变化的功能。
有序广播:(区别)
发广播:
设置接收广播的优先级:
截断广播:(广播传递到这里不再继续传递下去,终止传递。)
本地广播:
标准广播,其他应用程序只要知道我们的action,就可以接收到我们的广播和数据。容易引起安全性问题,避免接收辣鸡广播和避免关键信息被截获。
Android引入了一套本地广播机制,
本地广播只能动态注册不能静态注册,用了一个本地广播管理器来进行广播的。
注:
广播中启动活动一定要加这一句:
intent1.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
广播中弹出AlertDialog:
由于我们在ForceOfflineReceiver 里弹出了一个系统级别的对话框,因此必须要声明android.permission.SYSTEM_ALERT_WINDOW 权限。