在网上搜索开启wifi后自动关闭移动数据,但搜到的都是如何打开关闭wifi/3g,如何监听wifi/3g的状态,没有完整的。于是自己整了一天,终于搞定了。

首先在服务中注册动态广播,在OnReceive方法中,获得网络连接服务,然后创建NetworkInfo对象获得网络连接类型,用Boolean类型的isWifiConnected做判断。当wifi在一定时间内没有连上,就关闭wifi并打开3g网,当wifi连上了就关闭3g网。

mReceiver = new BroadcastReceiver() {

@Override

public void onReceive(Context context, Intent intent) {

boolean isWifiConnected = false;

boolean isMobileConnected = false;

ConnectivityManager connMgr = (ConnectivityManager) context

.getSystemService(Context.CONNECTIVITY_SERVICE);

NetworkInfo networkInfo = connMgr

.getNetworkInfo(ConnectivityManager.TYPE_WIFI);

isWifiConnected = networkInfo.isConnected();

//判断wifi是否开启

if (isWifiConnected) {

Toast.makeText(context, "wifi is on", 0).show();

Log.i("NetLisService", "wifi is "+isWifiConnected);

//wifi连接上就关闭3g网

NetLisService.this.setMobileDataStatus(NetLisService.this,false);

}else{

Toast.makeText(context, "wifi is off", 0).show();

Log.i("NetLisService", "wifi is "+isWifiConnected);

new Thread(){

public void run() {

try {

//当wifi断开十秒没连接上就关闭wifi

Thread.sleep(10000);

WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);

//关闭wifi

wifiManager.setWifiEnabled(false);

//开启3g

NetLisService.this.setMobileDataStatus(NetLisService.this,true);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

};

}.start();

}

//网络连接改为3g模式

networkInfo = connMgr

.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

isMobileConnected = networkInfo.isConnected();

//判断3g是否开启

if (isMobileConnected) {

Toast.makeText(context, "3g is on", 0).show();

Log.i("NetLisService", "3g is "+isMobileConnected);

}else{

Toast.makeText(context, "3g is off", 0).show();

Log.i("NetLisService", "3g is "+isMobileConnected);

}

}

};

IntentFilter filter = new IntentFilter();

//添加过滤action

filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);

registerReceiver(mReceiver, filter);

这是网上扒下来的开关移动数据的方法

public void setMobileDataStatus(Context context , boolean enabled) {

ConnectivityManager conMgr = (ConnectivityManager) this

.getSystemService(Context.CONNECTIVITY_SERVICE);

// ConnectivityManager类

Class> conMgrClass = null;

// ConnectivityManager类中的字段

Field iConMgrField = null;

// IConnectivityManager类的引用

Object iConMgr = null;

// IConnectivityManager类

Class> iConMgrClass = null;

// setMobileDataEnabled方法

Method setMobileDataEnabledMethod = null;

try {

// 取得ConnectivityManager类

conMgrClass = Class.forName(conMgr.getClass().getName());

// 取得ConnectivityManager类中的对象Mservice

iConMgrField = conMgrClass.getDeclaredField("mService");

// 设置mService可访问

iConMgrField.setAccessible(true);

// 取得mService的实例化类IConnectivityManager

iConMgr = iConMgrField.get(conMgr);

// 取得IConnectivityManager类

iConMgrClass = Class.forName(iConMgr.getClass().getName());

// 取得IConnectivityManager类中的setMobileDataEnabled(boolean)方法

setMobileDataEnabledMethod = iConMgrClass.getDeclaredMethod(

"setMobileDataEnabled", Boolean.TYPE);

// 设置setMobileDataEnabled方法是否可访问

setMobileDataEnabledMethod.setAccessible(true);

// 调用setMobileDataEnabled方法

setMobileDataEnabledMethod.invoke(iConMgr, enabled);

} catch (ClassNotFoundException e) {

e.printStackTrace();

} catch (NoSuchFieldException e) {

e.printStackTrace();

} catch (SecurityException e) {

e.printStackTrace();

} catch (NoSuchMethodException e) {

e.printStackTrace();

} catch (IllegalArgumentException e) {

e.printStackTrace();

} catch (IllegalAccessException e) {

e.printStackTrace();

} catch (InvocationTargetException e) {

e.printStackTrace();

}

}

android 移动网络切换,android实现wifi与移动数据的切换相关推荐

  1. android之网络状态判断(wifi和移动网络数据)

    有时候需要监听网络的状态变化来及时提醒用户网络状况,因此我们得多各种网络变化进行监听,废话不多说,将网络各种情况都在代码中列出来了,有需求的可以根据实际情况进行提示. 1.首先需要进行广播的监听,网络 ...

  2. Android 判断当前联网的类型 wifi、移动数据流量

    先获取系统管理网络连接的Manager: ConnectivityManager connectivityManager = (ConnectivityManager) getSystemServic ...

  3. android 链接网络成功,Android之网络连接判断是否成功

    最近工作工程中遇到一个问题.问题很简单,这里做个笔记,Android进行网络联网的一些操作时,经常会对网络是否已经连接成功进行判断.我们通常会对wifi和移动网络进行判断,我们需要判断网络设备是否开启 ...

  4. Android之网络编程利用PHP操作MySql插入数据(四)

    因为最近在更新我的项目,就想着把自己在项目中用到的一些的简单的与网络交互的方法总结一下,所以最近Android网络编程方面的博文会比较多一些,我尽量以最简单的方法给大家分享,让大家明白易懂.如果有什么 ...

  5. 【转】android程序连接网络出现android.os.NetworkOnMainThreadExceptionat

    错误: android.os.NetworkOnMainThreadException at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwo ...

  6. android无网络状态栏,Android中检查网络连接状态的变化,无网络时跳转到设置界面...

    在AndroidManifest.xml中加一个声明 1. 2. 3. 4. 5. NetCheckReceive.java文件如下 1.import android.content.Broadcas ...

  7. Android --- 5G网络,android系统开发教程

    Android - 5G网络 连接5G网络 检测5G网络 进行流量计费的判断 进行带宽估测 Android - 5G网络 ======================================= ...

  8. android 打开网络pdf,Android 打开网络上pdf文件

    1.基本思路: 打开网络pdf 思路整体还是来源与图片的加载. android中加载网络图片的框架有很多个.如image-laoder, fresco.glide等,首先都是从内存中找图片,如果内存中 ...

  9. android linux网络连接,Android和Linux服务器之间的TCP连接

    我正在编写一个代码,需要每秒从Android移动设备向台式计算机(linux服务器)发送数据.由于数据经常发送,通过Http命中无法实现(因为会消耗时间),所以Tcp通信似乎是更好的选择,因为andr ...

  10. android 使用网络字体,android使用指定的字体

    1.Android提供三种字体:"Sans","serif"和"monospace".采用android:typeface,例如androi ...

最新文章

  1. Android常见错误
  2. 马斯克说要开放自动驾驶和电池技术,上周被特斯拉起诉的公司已哭晕
  3. 秒杀多线程第十篇 生产者消费者问题 (续)
  4. Linux下 WRF Domain Wizard 使用教程(PART1:下载+安装)
  5. how to become a very good candidate at the investment bank?
  6. 你的眼睛已经睁开了!(转)
  7. 【MySQL】基于MySQL的SQL核心语法实战演练(二)
  8. 在微博投放广告有哪些优势呢?微博广告推广位置介绍!
  9. ORACLE局域网连接
  10. 松翰单片机数码管c语言,松翰单片机数码管程序
  11. 虚拟机安装专用win7系统教程简单易懂
  12. 华硕固件 mysql_刷华硕固件后的桥接中继教程
  13. 条形码怎么看?一文带你认识!
  14. 困牛放牧(Sleepy Cow Herding)
  15. 【Python 数据科学】分组group by基础
  16. 利用信号量机制实现前驱关系
  17. tomcat运行后报错“Address localhost:1099 is already in use”
  18. 微信支付当前url未注册问题
  19. Transactional Client
  20. 嵌入式Linux 串口编程系列1——基本知识、termios结构体

热门文章

  1. 富而喜悦一年一渡专属于你的特别的礼物!快来收!
  2. Python编程-- BS4解析
  3. 微服务:部署策略了解
  4. 【架构师之路 二】需要掌握的技能点---工程架构能力
  5. Power App基础
  6. 九联UNT402H-Hi3798MV310-当贝纯净桌面卡刷固件包
  7. android4.0怎么用微信,新开放接口 Android版微信4.0全新体验
  8. 图片查看器viewer
  9. 关于嵌入式是前端还是后端
  10. Cmake-Cookbook学习笔记