Android中wifi与数据流量的切换监听详解

Android中wifi与数据流量的切换监听详解,第1张

概述最近在做一个wifi和移动数据的监控功能,来来回回折腾了一阵子,这个模块的主要功能是监听整个APP的wifi与数据流量的切换,让用户使用专用流量,而不是用wifi,给一个d窗,点击确认,自动切换数据流量,关闭wifi。我

最近在做一个wifi和移动数据的监控功能,来来回回折腾了一阵子,这个模块的主要功能是监听整个APP的wifi与数据流量的切换,让用户使用专用流量,而不是用wifi,给一个d窗,点击确认,自动切换数据流量,关闭wifi。我的思路是写一个静态广播,监听在广播里面进行监听,启用系统d窗,点击确认,自动切换网络,这里面有一个坑就是d窗会在广播中多次被调用,其实只调用了一次,但是实际上多次调用系统的d窗会一个叠加一个,搞了好久,终于搞好了,原来是系统广播导致的叠加,详情看代码:

网络封装类ConnectivityManager:

ConnectivityManager 是一个网络连接的管理类,里面封装了网络请求的详细信息,包括WiFi与移动数据流量的开关状态,正在开启与关闭的状态,连接状态等等,很适合做网络监听。还有一个类WifiManager ,这个类专门用来做WiFi的监听,他的监听效果比ConnectivityManager更加详细丰富,可以检测但是对流量没法生效。这里使用ConnectivityManager 就足够了。

一、注册广播

1、写一个类继承自broadcastReceiver。

@OverrIDe public voID onReceive(Context context,Intent intent) { ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);  NetworkInfo gprs = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE); NetworkInfo wifi = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI); if (intent.getAction().equals("AndroID.net.conn.CONNECTIVITY_CHANGE"))  { //移动数据连接上时 if (gprs.isConnected()){ } //wifi连接上时 if (wifi.isConnected()) { // 切换网络,关闭wifi,开启流量 if (isShow) {//做一个标记,避免多次d窗的叠加BUG,初始值为true,重要 switchNetwork(context); }  } //断网时 if (!netManager.getGRPS().isConnected() || !netManager.getGRPS().isConnected()) { }   } 

二、d窗

d窗一般用四种常用的方式:

1、使用popupwindow

2、使用dialog

3、WindowManager

4、系统d窗

一般的d窗需要依附于activity,在activity中d窗,但是在服务中,不能简单的使用这种方式,一般是采用系统的d窗,他的优先级很高,覆盖于应用界面的最高层,并且要设置setType(WindowManager.LayoutParams.TYPE_SYstem_ALERT),要不然会崩溃的。

private voID switchNetwork(final Context context) { AlertDialog.Builder builder = new AlertDialog.Builder(context,R.style.AlertDialog); builder.setTitle("提示"); builder.setMessage("请关闭wifi,打开移动网络"); builder.setCancelable(false); builder.setPositivebutton("确定",new DialogInterface.OnClickListener() { @OverrIDe public voID onClick(DialogInterface dialog,int which) { // 控制网络的开关 controlNetWork(context); isShow = true; } }); AlertDialog dialog = builder.create(); // 需要把对话框的类型设为TYPE_SYstem_ALERT,否则对话框无法在广播接收器里d出 dialog.getwindow().setType(WindowManager.LayoutParams.TYPE_SYstem_ALERT); dialog.show(); isShow = false; } 

三、网络切换

wifi的网络切换比较容易,直接设置setWifIEnabled就可以完成切换,而数据流量的切换比较麻烦,他的方法是私有的,无法调用,我们可以通过反射,找到他的方法进行调用:具体看代码

private voID controlNetWork(Context context) {     WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);       // 允许流量,阻止wifi       wifiManager.setWifIEnabled(false);//false表示断开WiFi       NetManager netManager = new NetManager(context);       if (!netManager.getGRPS().isConnected()) {         ConnectivityManager gprsCM = (ConnectivityManager) context             .getSystemService(Context.CONNECTIVITY_SERVICE);         Class conmanClass;         try {           conmanClass = Class.forname(gprsCM.getClass().getname());           final FIEld iConnectivityManagerFIEld = conmanClass.getDeclaredFIEld("mService"); iConnectivityManagerFIEld.setAccessible(true);           final Object iConnectivityManager = iConnectivityManagerFIEld.get(gprsCM);           final Class iConnectivityManagerClass = Class.forname(iConnectivityManager.getClass().getname());           final Method setMobileDataEnabledMethod = iConnectivityManagerClass               .getDeclaredMethod("setMobileDataEnabled",Boolean.TYPE); setMobileDataEnabledMethod.setAccessible(true);//true表示连接网络           setMobileDataEnabledMethod.invoke(iConnectivityManager,true);         } catch (Exception e) {           e.printstacktrace();         }       }     }   } 

2、在清单文件中注册广播

<receiver       androID:name=".NetChangeReceiver"       androID:label="NetChangeReceiver" >       <intent-filter>         <action androID:name="androID.net.conn.CONNECTIVITY_CHANGE" />       </intent-filter> </receiver> 

添加权限:

<uses-permission AndroID:name="androID.permission.INTERNET" /><uses-permission androID:name="androID.permission.ACCESS_NETWORK_STATE"/>

以上代码很详细的描述了网络切换的实时检测,更加详细丰富的就不在这里写出来了。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持编程小技巧!

总结

以上是内存溢出为你收集整理的Android中wifi与数据流量的切换监听详解全部内容,希望文章能够帮你解决Android中wifi与数据流量的切换监听详解所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1147271.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-31
下一篇 2022-05-31

发表评论

登录后才能评论

评论列表(0条)

保存