最近在做一个wifi和移动数据的监控功能,来来回回折腾了一阵子,这个模块的主要功能是监听整个APP的wifi与数据流量的切换,让用户使用专用流量,而不是用wifi,给一个弹窗,点击确认,自动切换数据流量,关闭wifi。我的思路是写一个静态广播,监听在广播里面进行监听,启用系统弹窗,点击确认,自动切换网络,这里面有一个坑就是弹窗会在广播中多次被调用,其实只调用了一次,但是实际上多次调用系统的弹窗会一个叠加一个,搞了好久,终于搞好了,原来是系统广播导致的叠加,详情看代码:
网络封装类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) {//做一个标记,避免多次弹窗的叠加bug,初始值为true,重要 switchNetwork(context); } } //断网时 if (!netManager.getGRPS().isConnected() || !netManager.getGRPS().isConnected()) { } }
二、弹窗
弹窗一般用四种常用的方式:
1、使用popupwindow
2、使用dialog
3、WindowManager
4、系统弹窗
一般的弹窗需要依附于activity,在activity中弹窗,但是在服务中,不能简单的使用这种方式,一般是采用系统的弹窗,他的优先级很高,覆盖于应用界面的最高层,并且要设置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,否则对话框无法在广播接收器里弹出 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"/>
以上代码很详细的描述了网络切换的实时检测,更加详细丰富的就不在这里写出来了。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持小牛知识库!
本文向大家介绍Javascript添加监听与删除监听用法详解,包括了Javascript添加监听与删除监听用法详解的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Javascript添加监听与删除监听的用法。分享给大家供大家参考。具体分析如下: js中事件监听就是利用addEventListener来绑定一个事件,这个用法在jquery中非常常用并且简单,但在原生js中比较复杂,这里整理了
本文向大家介绍Android 监听WiFi的开关状态实现代码,包括了Android 监听WiFi的开关状态实现代码的使用技巧和注意事项,需要的朋友参考一下 Android 监听WiFi的开关状态实现代码 WifiSwitch_Presenter 源码: WifiSwitch_Interface 源码 使用方式 MainActivity : 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
本文向大家介绍Android 滑动监听的实例详解,包括了Android 滑动监听的实例详解的使用技巧和注意事项,需要的朋友参考一下 Android 滑动监听的实例详解 摘要: ScollBy,ScollTo是对内容的移动,view.ScollyBy是对view的内容的移动 view,ScollTo是对内容的移动(移动到指定位置),view.ScollyBy是对view的内容的移动(移动距离) 在
问题内容: 我正在开发一个应用程序,它可以检查android上的wifi和移动流量统计信息。这就是我得到的统计信息: 不幸的是,这似乎不仅仅是wifi,因为即使我在智能手机上禁用wifi,它也会为我带来大量数据。我认为,并且正在计算所有网络接口上发送和接收的字节数。 我在网上搜索了很多关于如何仅在wifi上获取流量统计信息的方法,但我找不到方法。 我很乐意接受任何帮助。 问题答案: 几年前,我遇到
本文向大家介绍Android 监听应用前/后台切换实例代码,包括了Android 监听应用前/后台切换实例代码的使用技巧和注意事项,需要的朋友参考一下 前言 这周接到一个需求,需要在应用从后台切换到前台时,展示我们的广告。展示页面其实可以复用以前的开屏广告页,唯一的问题就是如何监听应用从后台切到了前台。 正文 在众多方法中,我采用了以下这种方式。废话不多说,咱们直接看代码: 在清单文件中声明 在M
本文向大家介绍Android 监听网络状态方法详解,包括了Android 监听网络状态方法详解的使用技巧和注意事项,需要的朋友参考一下 Android 监听网络状态方法详解 一.加入网络权限 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限。 二.判断手机网络的几个方案 1)判断是否有网络连接 2)判断WIFI网络是否可用 4)获取当前网络连接的类型信息 在开发and