• 安卓开发笔记(九):广播动态注册实现监听网络变化


    一.

    Android 中的广播主要分两种类型:标准广播和有序广播。

    • 标准广播(Normal broadcasts)
        是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可 言。这种广播的效率会比较高,但同时也意味着它是无法被截断的。标准广播的工作流程如下:
     
    标准广播工作示意图
    • 有序广播(Ordered broadcasts)
        是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所以此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。有序广播的工作流程如下:
     
    有序广播工作示意图
     
    二.

    注册广播的方式有两种,在代码中注册(动态注册)和在 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身上失效了,因此我们还是使用了谷歌的手机以及模拟器来做测试才能够获得最终的成功。




  • 相关阅读:
    gitlab配置ssh连接
    java 函数编程之Consumer接口的使用
    一枚程序猿的MacBook M1详细体验报告
    【线上问题排查技巧】动态修改LOGGER日志级别
    【线上排查实战】AOP切面执行顺序你真的了解吗
    阿里巴巴Canal常见问题:重复解析/Filter失效/消费落后
    使用Binlog日志恢复误删的MySQL数据实战
    Git实战技巧:恢复被强制push -f失踪的代码
    一次完整的JVM堆外内存泄漏故障排查记录
    Java线上问题排查神器Arthas快速上手与原理浅谈
  • 原文地址:https://www.cnblogs.com/geeksongs/p/10476961.html
Copyright © 2020-2023  润新知