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


    一.

    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身上失效了,因此我们还是使用了谷歌的手机以及模拟器来做测试才能够获得最终的成功。




  • 相关阅读:
    ASP.NET HttpRuntime.Cache缓存类使用总结
    ASP.NET MVC自定义AuthorizeAttribute篇知识点讲解—登录限制
    Echarts图表控件使用总结2(Line,Bar)—问题篇
    数据库查询实例(包含所有where条件例子)
    php file_get_contents读取大容量文件方法
    如何给mysql用户分配权限
    dedecms {dede:php}标签用法介绍
    js获取字符串最后一个字符代码
    CSS3选择器之学习笔记
    SQL中实现SPLIT函数几种方法
  • 原文地址:https://www.cnblogs.com/geeksongs/p/10476961.html
Copyright © 2020-2023  润新知