Android网络状态监听
Android经常需要去判断网络的状态,比如下载。请求到一半了,网络中断了,要做什么处理,网络有通了,能不能继续自动监听继续下载。所以网络监听对很多网络请求还是很重要的。这里不知道网络什么时候来,什么时候断。故要设计一个广播来监听网络状态,当网络状态发生改变的时候去通知该做什么处理。
0,写一个判断网络的工具类(可以直接写在广播中)
1,写一个广播类去监听网络变化
2,在广播类中设置接口,在Activity中回调做相应的处理
3,可以在baseactivity中设置回调,比较网络请求很多类都需要。
步骤:
0:工具类:大体都是这样的
package com.hu.netclick;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
/**
* 跟网络相关的工具类
*
*
*
*/
public class NetUtils
{
private NetUtils()
{
/* cannot be instantiated */
throw new UnsupportedOperationException("cannot be instantiated");
}
/**
* 判断网络是否连接
*
* @param context
* @return
*/
public static boolean isConnected(Context context)
{
ConnectivityManager connectivity = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (null != connectivity)
{
NetworkInfo info = connectivity.getActiveNetworkInfo();
if (null != info && info.isConnected())
{
if (info.getState() == NetworkInfo.State.CONNECTED)
{
return true;
}
}
}
return false;
}
/**
* 判断是否是wifi连接
*/
public static boolean isWifi(Context context)
{
ConnectivityManager cm = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
if (cm == null)
return false;
return cm.getActiveNetworkInfo().getType() == ConnectivityManager.TYPE_WIFI;
}
/**
* 没有连接网络
*/
public static final int NETWORK_NONE = -1;
/**
* 移动网络
*/
public static final int NETWORK_MOBILE = 0;
/**
* 无线网络
*/
public static final int NETWORK_WIFI = 1;
public static int getNetWorkState(Context context) {
// 得到连接管理器对象
ConnectivityManager connectivityManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo activeNetworkInfo = connectivityManager
.getActiveNetworkInfo();
if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) {
if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_WIFI)) {
return NETWORK_WIFI;
} else if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_MOBILE)) {
return NETWORK_MOBILE;
}
} else {
return NETWORK_NONE;
}
return NETWORK_NONE;
}
/**
* 打开网络设置界面
*/
public static void openSetting(Activity activity)
{
Intent intent = new Intent("/");
ComponentName cm = new ComponentName("com.android.settings",
"com.android.settings.WirelessSettings");
intent.setComponent(cm);
intent.setAction("android.intent.action.VIEW");
activity.startActivityForResult(intent, 0);
}
}
1:广播监听。这里就直接在主MainActivity中设置回调了
package com.hu.netclick;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
/**
* Created by hu on 2016/11/28.
*/
public class NetBroadcastReceiver extends BroadcastReceiver {
public NetEvevt evevt = MainActivity.evevt;
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
//获取当前网络状态码
int netWorkState = NetUtils.getNetWorkState(context);
// 接口回调传过去状态的类型
evevt.onNetChange(netWorkState);
}
}
// 自定义接口
public interface NetEvevt {
public void onNetChange(int netMobile);
}
}
记得在配置清单中配置
<receiver android:name=".NetBroadcastReceiver">
<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_WIFI_STATE"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
2,主MainActivity中的实现接口:
package com.hu.netclick;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity implements NetBroadcastReceiver.NetEvevt {
public static NetBroadcastReceiver.NetEvevt evevt;
/**
* 网络类型
*/
private int netMobile;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
evevt = this;
}
/**
* 初始化时判断有没有网络
*/
public boolean inspectNet() {
this.netMobile = NetUtils.getNetWorkState(MainActivity.this);
return isNetConnect();
}
/**
* 判断有无网络 。
*
* @return true 有网, false 没有网络.
*/
public boolean isNetConnect() {
if (netMobile == NetUtils.NETWORK_WIFI) {
return true;
} else if (netMobile == NetUtils.NETWORK_MOBILE) {
return true;
} else if (netMobile == NetUtils.NETWORK_NONE) {
return false;
}
return false;
}
/***
* 网络变化后的回调,这里处理相关逻辑
* @param netMobile
*/
public void onNetChange(int netMobile) {
this.netMobile = netMobile;
//网络状态变化时的操作
if (!isNetConnect()) {
Toast.makeText(getApplicationContext(),"没有网",Toast.LENGTH_SHORT).show();
} else {
Toast.makeText(getApplicationContext(),"有网",Toast.LENGTH_SHORT).show();
}
}
}
基本上监听功能就实现了。简单的效果图:
所以类都给出来了,demo就算了
所以需要测网速。测网速可以TrafficInfo流量类来测试网速。
这里介绍一个测网速的
Facebook给我们提供了这么一个库:在 gradle引入
compile 'com.facebook.network.connectionclass:connectionclass:1.0.1'
facebook/network-connection-class gethub地址
这里给个他人博客介绍地址: 点击打开链接