转载请注明出处!
作为移动开发很头疼的就是网络状态的改变了,有的时候没有网络直接导致app崩溃,需要我们进行进一步的优化处理,但有的时候我们需要给用户一个提示例如Toast提示网络不好或者网络未连接,提示用户联网。我们可以利用android自带的广播接收器来做,首先我们写好广播
package com.demo.network.broadCastReceiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.widget.Toast;
import com.sanshi.assets.util.MThoast;
import com.sanshi.assets.util.networkTools.NetworkStateUtil;
/**
* Created by 唐小糖 on 2016/12/29.
* 自定义广播接收器,监听网络状态是否发生改变
*/
public class NetworkStateReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
if (NetworkStateUtil.isNetWorkConnected(context)) {
if(NetworkStateUtil.isWifiConnected(context)){
MThoast.showShort(context,"已连接到wifi网络");
}
if(NetworkStateUtil.isMobileConnected(context)){
MThoast.showShort(context,"已连接到移动网络");
}
}else{
MThoast.showShort(context,"已进入无网络次元,请检查网络设置!");
}
}
}
另外提供一个工具类检测网络状态
package com.demo.network.util.networkTools;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.wifi.WifiManager;
import android.os.Build;
import android.provider.Settings;
import java.lang.reflect.Method;
/**
* Created by 方舟 on 2017/9/7.
* 网络工具类
*/
public class NetworkStateUtil {
/**
* 判断网络是否连接
* @param context
* @return
*/
public static boolean isNetWorkConnected(Context context){
ConnectivityManager connectivityManager=(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
return (networkInfo != null && networkInfo.isConnected());
}
/**
* 判断wifi是否连接
* @param context
* @return
*/
public static boolean isWifiConnected(Context context){
ConnectivityManager connectivityManager=(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
return networkInfo.isConnected();
}
/**
* 判断移动网络是否连接
* @param context
* @return
*/
public static boolean isMobileConnected(Context context){
ConnectivityManager connectivityManager=(ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
return networkInfo.isConnected();
}
/**
* 调用系统设置进行设置网络
* @param context
*/
public static void goToSetNetWork(Context context){
Intent intent=null;
/**
* 判断安卓版本
*/
if(Build.VERSION.SDK_INT>10) {
/*3.0以上版本*/
intent=new Intent(Settings.ACTION_WIFI_SETTINGS);
}else {
/*3.0以下版本*/
intent=new Intent();
intent.setClassName("com.android.settings","com.android.settings.WifiSettings");
}
context.startActivity(intent);
}
/**
* 设置wifi状态
* 注意需要添加权限:<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
* <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
* @param context
* @param enabled
*/
public static void setWifiEnabled(Context context,boolean enabled){
WifiManager wifiManager=(WifiManager)context.getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(enabled);
}
/**
* 设置移动网络状态
* 注意需要添加权限:<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission>
* @param context 上下文
* @param enabled 是否开启移动网络连接
*/
public static void setMobileDataEnabled(Context context, boolean enabled) {
/**
* 必须采用反射机制获取系统隐藏的功能
*/
// /**
// *StackOverStack解决方案:
// */
// try {
// ConnectivityManager conman = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
// Class conmanClass = Class.forName(conman.getClass().getName());
// Field iConnectivityManagerField = conmanClass.getDeclaredField("mService");
// iConnectivityManagerField.setAccessible(true);
// Object iConnectivityManager = iConnectivityManagerField.get(conman);
// Class iConnectivityManagerClass = Class.forName(iConnectivityManager.getClass().getName());
// Method setMobileDataEnabledMethod = iConnectivityManagerClass.getDeclaredMethod("setMobileDataEnabled", Boolean.TYPE);
// setMobileDataEnabledMethod.setAccessible(true);
//
// setMobileDataEnabledMethod.invoke(iConnectivityManager, enabled);
//
// } catch (Exception e) {
// // TODO Auto-generated catch block
// e.printStackTrace();
// }
/*
* 进行简化
*/
ConnectivityManager connectivityManager = null;
Class connectivityManagerClz = null;
try {
connectivityManager = (ConnectivityManager) context.getSystemService(context.CONNECTIVITY_SERVICE);
connectivityManagerClz = connectivityManager.getClass();
Method method = connectivityManagerClz.getMethod("setMobileDataEnabled", new Class[] { boolean.class });
method.invoke(connectivityManager, enabled);
} catch (Exception e) {
e.printStackTrace();
}
}
}
我们还需要在配置文件中注册receiver
<!--广播接受器,用来监听网络状态-->
<receiver android:name="com.demo.network.broadCastReceiver.NetworkStateReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</receiver>
最后不要忘了添加网络权限
<!-- 允许程序打开网络sockets -->
<uses-permission android:name="android.permission.INTERNET"/>