标签:判断网络状态 android网络状态receiver 测网速
我们现在APP是断然很难离开网络存活下去,会有很多很频繁的网络操作,请求数据,传递数据等等,所以,我们需要对网络状态有多一点的了解。
首先,假如我们的APP在运行的时候,假如这时候用户掉线了,没有网络了,我们就应该给用户提示,然后用户连上网络了,我们这时候应该也给用户提示,这样他就可以继续玩我们的APP,我们应该怎么做了,没错,就是通过Receiver来实现,因为断网和联网系统都会发送广播,然后,我们可以收到,通过广播去判断当前的网络是否可用,具体代码如下:其中,接受广播需要的action是"android.net.conn.CONNECTIVITY_CHANGE"和"ta.android.net.conn.CONNECTIVITY_CHANGE",我们需要注册该广播接受者的时候添加过滤器,这样他就可以收到了。
import com.iyueju.guanggong.util.NetWorkUtil; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.util.Log; import android.widget.Toast; /** * 用于接受网络状态的变化的receiver * * @author Administrator * */ public class NetWorkReceiver extends BroadcastReceiver { private static Boolean networkAvailable = false;// 默认网络状态 private static com.iyueju.guanggong.util.NetWorkUtil.netType type; private final static String ANDROID_NET_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE"; public final static String TA_ANDROID_NET_CHANGE_ACTION = "ta.android.net.conn.CONNECTIVITY_CHANGE"; private static NetWorkReceiver receiver; private NetWorkReceiver() { super(); } public static NetWorkReceiver getNetWorkReceiver() { // TODO Auto-generated constructor stub if (receiver == null) { synchronized (NetWorkReceiver.class) { if (receiver == null) { receiver = new NetWorkReceiver(); } } } return receiver; } @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stu receiver = NetWorkReceiver.this; if (intent.getAction().equalsIgnoreCase(ANDROID_NET_CHANGE_ACTION) || intent.getAction().equalsIgnoreCase(TA_ANDROID_NET_CHANGE_ACTION)) { Log.i("Main", "有收到网络连接的相关讯息"); if (!NetWorkUtil.isNetworkAvailable(context) && networkAvailable == true) { Log.i("Main", "断开了网络"); networkAvailable = false; Toast.makeText(context, "网络不可用", 1).show(); } else if (NetWorkUtil.isNetworkAvailable(context) && networkAvailable == false) { Log.i("Main", "网络连接成功"); networkAvailable = true; type = NetWorkUtil.getAPNType(context); Toast.makeText(context, "网络连接成功", 1).show(); } } } /** * 注册网络监听 * * @param context */ public static void registerNetworkStateReceiver(Context context) { Intent intent = new Intent(); intent.setAction(TA_ANDROID_NET_CHANGE_ACTION); context.sendBroadcast(intent); } /** * 显示当前网络状态 * * @param context */ public static void checkNetWorkState(Context context) { Intent intent = new Intent(); intent.setAction(TA_ANDROID_NET_CHANGE_ACTION); context.sendBroadcast(intent); } /** * 注销网络监听 * * @param context */ public static void unRegisterNetworkStateReceiver(Context context) { if (receiver != null) { try { context.getApplicationContext().unregisterReceiver(receiver); } catch (Exception e) { e.printStackTrace(); } } } public static Boolean isNetWorkAvailable() { return networkAvailable; } public static com.iyueju.guanggong.util.NetWorkUtil.netType getNetWorkType() { return type; } }
注册监听:
/** * 注册监听 */ private void registerMessageReceiver() { // TODO Auto-generated method stub NetWorkReceiver receiver = NetWorkReceiver.getNetWorkReceiver(); IntentFilter filter = new IntentFilter(); filter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); filter.addAction("android.gzcpc.conn.CONNECTIVITY_CHANGE"); registerReceiver(receiver, filter); }
然后,需要在不适用APP的时候注销
则是:
unregisterReceiver(NetWorkReceiver.getNetWorkReceiver());
然后,假如是我们的APP中,我们通过一些view的点击或者其他的事件触发一些网络操作,为了避免一些错误,我们需要先去判断当前网络是否可用,当前连接的网络不是是wifi(为用户考虑)以及当前是否有网络连接,还有当前的网速是多大,是否适合我们的操作等等。
下面是具体的代码实现:
import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import com.iyueju.guanggong.constant.APPConstant; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.os.Handler; import android.os.Message; import android.util.Log; /** * 网络工具类 * * @author Administrator * */ public class NetWorkUtil { // Private fields private static final String TAG = NetWorkUtil.class.getSimpleName(); private static final int EXPECTED_SIZE_IN_BYTES = 1048576;// 1MB 1024*1024 private static final double BYTE_TO_KILOBIT = 0.0078125; private static final double KILOBIT_TO_MEGABIT = 0.0009765625; private static Handler mHandler; public static int timer; // 网络状态,连接wifi,cmnet是直连互联网的,cmwap是需要代理,noneNet是无连接的 // 一速度来说:wifi > cmnet >cmwap > noneNet public static enum netType { wifi, CMNET, CMWAP, noneNet } /** * 网络是否可用 * * @param context * @return */ public static boolean isNetworkAvailable(Context context) { // 获取网络manager ConnectivityManager mgr = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo[] info = mgr.getAllNetworkInfo(); // 遍历所有可以连接的网络 if (info != null) { for (int i = 0; i < info.length; i++) { if (info[i].getState() == NetworkInfo.State.CONNECTED) { return true; } } } return false; } /** * 判断是否有网络连接 * * @param context * @return */ public static boolean isNetworkConnected(Context context) { if (context != null) { ConnectivityManager mConnectivityManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo(); if (mNetworkInfo != null) { return mNetworkInfo.isAvailable(); } } return false; } /** * 判断WIFI网络是否可用 * * @param context * @return */ public static boolean isWifiConnected(Context context) { if (context != null) { ConnectivityManager mConnectivityManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mWiFiNetworkInfo = mConnectivityManager .getNetworkInfo(ConnectivityManager.TYPE_WIFI); if (mWiFiNetworkInfo != null) { return mWiFiNetworkInfo.isAvailable(); } } return false; } /** * 判断MOBILE网络是否可用 * * @param context * @return */ public static boolean isMobileConnected(Context context) { if (context != null) { ConnectivityManager mConnectivityManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mMobileNetworkInfo = mConnectivityManager .getNetworkInfo(ConnectivityManager.TYPE_MOBILE); if (mMobileNetworkInfo != null) { return mMobileNetworkInfo.isAvailable(); } } return false; } /** * 获取当前网络连接的类型信息 * * @param context * @return */ public static int getConnectedType(Context context) { if (context != null) { ConnectivityManager mConnectivityManager = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo(); if (mNetworkInfo != null && mNetworkInfo.isAvailable()) { return mNetworkInfo.getType(); } } return -1; } /** * * @author 白猫 * * 获取当前的网络状态 -1:没有网络 1:WIFI网络2:wap 网络3:net网络 * * @param context * * @return */ public static netType getAPNType(Context context) { ConnectivityManager connMgr = (ConnectivityManager) context .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); if (networkInfo == null) { return netType.noneNet; } int nType = networkInfo.getType(); if (nType == ConnectivityManager.TYPE_MOBILE) { if (networkInfo.getExtraInfo().toLowerCase().equals("cmnet")) { return netType.CMNET; } else { return netType.CMWAP; } } else if (nType == ConnectivityManager.TYPE_WIFI) { return netType.wifi; } return netType.noneNet; } /** * 测试网速 * * @param handler */ public static void textSpeed(Handler handler) { mHandler = handler; new Thread(mWorker).start(); } /** * Our Slave worker that does actually all the work */ private static final Runnable mWorker = new Runnable() { @Override public void run() { InputStream stream = null; try { int bytesIn = 0; String downloadFileUrl = "http://120.24.237.77/test"; long startCon = System.currentTimeMillis(); URL url = new URL(downloadFileUrl); URLConnection con = url.openConnection(); con.setUseCaches(false); long connectionLatency = System.currentTimeMillis() - startCon; stream = con.getInputStream(); Message msgUpdateConnection = Message.obtain(mHandler, APPConstant.MSG_UPDATE_CONNECTION_TIME); msgUpdateConnection.arg1 = (int) connectionLatency; mHandler.sendMessage(msgUpdateConnection); long start = System.currentTimeMillis(); int currentByte = 0; long updateStart = System.currentTimeMillis(); long updateDelta = 0; int bytesInThreshold = 0; while ((currentByte = stream.read()) != -1) { bytesIn++; bytesInThreshold++; if (updateDelta >= APPConstant.UPDATE_THRESHOLD) { int progress = (int) ((bytesIn / (double) EXPECTED_SIZE_IN_BYTES) * 100); Message msg = Message.obtain(mHandler, APPConstant.MSG_UPDATE_STATUS, calculate(updateDelta, bytesInThreshold)); msg.arg1 = progress; msg.arg2 = bytesIn; mHandler.sendMessage(msg); // Reset updateStart = System.currentTimeMillis(); bytesInThreshold = 0; } updateDelta = System.currentTimeMillis() - updateStart; } long downloadTime = (System.currentTimeMillis() - start); // Prevent AritchmeticException if (downloadTime == 0) { downloadTime = 1; } Message msg = Message.obtain(mHandler, APPConstant.MSG_COMPLETE_STATUS, calculate(downloadTime, bytesIn)); msg.arg1 = bytesIn; mHandler.sendMessage(msg); } catch (MalformedURLException e) { Log.e(TAG, e.getMessage()); } catch (IOException e) { Log.e(TAG, e.getMessage()); } finally { try { if (stream != null) { stream.close(); } } catch (IOException e) { // Suppressed } } } }; /** * * 1 byte = 0.0078125 kilobits 1 kilobits = 0.0009765625 megabit * * @param downloadTime * in miliseconds * @param bytesIn * number of bytes downloaded * @return SpeedInfo containing current speed */ private static SpeedInfo calculate(final long downloadTime, final long bytesIn) { SpeedInfo info = new SpeedInfo(); // from mil to sec long bytespersecond = (bytesIn / downloadTime) * 1000; double kilobits = bytespersecond * BYTE_TO_KILOBIT; double megabits = kilobits * KILOBIT_TO_MEGABIT; info.downspeed = bytespersecond; info.kilobits = kilobits; info.megabits = megabits; return info; } /** * Transfer Object * * @author devil * */ public static class SpeedInfo { public double kilobits = 0; public double megabits = 0; public double downspeed = 0; } }
其中,涉及到了四个其他常量是:
public static final int MSG_UPDATE_STATUS = 0; public static final int MSG_UPDATE_CONNECTION_TIME = 1; public static final int MSG_COMPLETE_STATUS = 2; public static final int UPDATE_THRESHOLD = 300;
注意:使用的时候需要加入一些权限,
,比如查看wifi状态等,具体请看:http://blog.csdn.net/liweijie_chengxuyuan/article/details/41822883
版权声明:本文为博主原创文章,未经博主允许不得转载。
android中NetWorkReceive以及获取当前的网络连接状态详解
标签:判断网络状态 android网络状态receiver 测网速
原文地址:http://blog.csdn.net/liweijie_chengxuyuan/article/details/47060825