随心记(2)——飞行模式开了wifi还能打开?一个广播给他拿下!

230 阅读2分钟

为何要收藏这篇干货?——番茄憨憨的自我独白

我是番茄憨憨,我要坦白。

相信大部分的靓仔都有过这样的酷经历,自己曾经解决过的问题,可能就只是调用一个接口,第一次查找时,找了它大半年,想着简单,完了没记下来,然而在第二次需要使用时,狼狈如当初,又找了大半年,没错,别看了,说的就是你!

我是谁,我在哪.jpg

尝遍了生活的苦后,端着知错就改的良好态度,我含泪写下了今天这篇飞模和wifi的联系史,将从问题描述、问题分析、解决方案时序上分享出来,兄弟姐妹们,给本憨一个点赞,外带一个亲吻,我们发车!!!

1、问题描述

飞行模式开启后,主动打开wifi,关闭飞行模式,再开启飞行模式,wifi此时不会自动关闭!

2、问题分析

拿到这个问题的瞬间,我是相当蒙圈的,但拿设备一看,还真是这样,我将此问题描述拆解成如下测试步骤大家应该更好理解。
1、wifi打开条件下,打开飞行模式,此时wifi关闭(正常行为).
2、基于飞行模式开启,wifi关闭条件下,打开wifi(若是wifi项直接灰置的设备不存在此问题)
3、关闭飞行模式,重新执行1步骤,此时Wifi依然保持开启,和1的步骤的正常行为结果相反.

出现这样的结果,平台没设置过,那就只有是google的问题了,我们要去找google patch吗?NO,一个小小的问题不能被难倒,问题明确,就是飞行模式开启后wifi行为没有变化,那么我们只需要监听飞行模式后控制wifi行为就好了。

3、解决方案

针对于飞行模式的监听,建议放到framework中的service,你可以自己写一个,也可以随便找一个系统级别的服务添加进去(切记,不要加在应用层,那会有很大的局限性),添加IntentFilter ="ACTION_AIRPLANE_MODE_CHANGED"的过滤参数,就能够监听飞行模式的变化了, 如下代码,当获取到飞行模式打开,wifi若是打开的情况下,则将wifi进行关闭。

boolean isAirplaneModeOn = intent.getBooleanExtra("state", false);

                    if(isAirplaneModeOn){
                        if(mWifiManager.isWifiEnabled()){
                            mWifiManager.setWifiEnabled(false);
                            Settings.Global.putInt(mContext.getContentResolver(), "pre_wifi_state", 1);
                        } else {
                            Settings.Global.putInt(mContext.getContentResolver(), "pre_wifi_state", 0);
                        }
                    } else {
                        int wifi_state = Settings.Global.getInt(mContext.getContentResolver(),"pre_wifi_state",0);
                        if (wifi_state == 1){
                            mWifiManager.setWifiEnabled(true);
                        } else {
                            Log.d(TAG,"pre_wifi_state is turn off");
                        }
                    }

4、总结

问题不是很难,但方法要在需要的时候能够迅速拿下,这样才能提升我们的开发效率,上面一个问题,包含Settings.Global的用法、飞行模式的监听、wifi的开关控制,各位同僚,快收藏起来,需要的时候直接吃小苹果吧!