安卓开发笔记(九):广播动态注册实现监听网络变化
2023-09-11 14:21:08 时间
一.
Android 中的广播主要分两种类型:标准广播和有序广播。
- 标准广播(Normal broadcasts)
是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可 言。这种广播的效率会比较高,但同时也意味着它是无法被截断的。标准广播的工作流程如下:
![](https://upload-images.jianshu.io/upload_images/2509931-4d74e7a20cf39fb9.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/390/format/webp)
标准广播工作示意图
-
有序广播(Ordered broadcasts)
是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所以此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。有序广播的工作流程如下:
![](https://upload-images.jianshu.io/upload_images/2509931-4fbd17c536317710.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/558/format/webp)
有序广播工作示意图
二.
注册广播的方式有两种,在代码中注册(动态注册)和在 AndroidManifest.xml 中注册(静态注册)。
创建一个广播接收器:新建一个类,继承 BroadcastReceiver, 并重写父类的 onReceive() 方法。当有广播到来时,onReceive()方法就会得到执行, 具体的逻辑在这个方法中处理。
接下来先通过动态注册的方式编写一个能够监听网络变化的程序,学习一下广播接收器的基本用法。代码如下:
/** * 广播,动态监听网络变化 */ public class BroadcastActivity extends AppCompatActivity { private IntentFilter intentFilter; private NetworkChangeReceiver networkChangeReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_broadcast); // 创建 IntentFilter 实例 intentFilter = new IntentFilter(); // 添加广播值 intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); // 创建 NetworkChangeReceiver 实例 networkChangeReceiver = new NetworkChangeReceiver(); // 注册广播 registerReceiver(networkChangeReceiver,intentFilter); } @Override protected void onDestroy() { super.onDestroy(); // 取消注册 unregisterReceiver(networkChangeReceiver); } class NetworkChangeReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { // 获取管理网络连接的系统服务类的实例 ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); // 判断网络是否可用 if (networkInfo != null && networkInfo.isAvailable()){ ToastUtils.showShort("网络可用"); }else { ToastUtils.showShort("网络不可用"); } } } }
注意事项:
- 动态注册的广播接收器一定都要取消注册才行,这里我们是在 onDestroy()方法中通过调用 unregisterReceiver()方法来实现的。
- 在 AndroidManifest.xml 文件中加入访问系统的网络状态权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
运行程序,然后按下 Home 键→按下 Menu 键→System settings→Data usage 进入到数据使用详情界面,关闭 Mobile Data 会弹出网络不可用的提示:
重新打开 Mobile Data 又会弹出网络可用的提示:
备注:目前利用这种动态注册的方式按道理来说应该在任何一款安卓手机上是有效的,但是却在笔者本人的小米6身上失效了,因此我们还是使用了谷歌的手机以及模拟器来做测试才能够获得最终的成功。
相关文章
- 【安卓开源】安卓拼图实现,数据驱动,可记录图片位置參数,希望大家有兴趣一起完好、!
- 伪装word应用的安卓木马分析报告
- 安卓 listview
- 安卓入门教程(十二)-控件
- React Native安卓项目打包发布APK步骤
- 安卓插件化课程-第二篇:加载插件apk中的activity
- 安卓APT技术讲解(下)-实现安卓组件化的路由功能
- 安卓将Bitmap图片转换为byte[]数组
- 都是权限惹的祸:安卓恶意APP如何将其他APP中的私有数据搞到手
- 为鸿蒙说两句公道话,鸿蒙是安卓的套壳吗?
- 安卓集成新版推送SDK与旧版本账号SDK发生依赖冲突,如何解决?
- 安卓开发学习笔记(七):仿写腾讯QQ登录注册界面
- 安卓开发学习笔记(三):Android Stuidio无法引用Intent来创建对象,出现cannot resolve xxx
- 解决安卓手机连接wifi总弹出“已登录到Wlan网络”