android开发中经常会用到判断手机网络状态的功能,android系统本身会提供各种服务供我们来监测手机的系统状态,当某一种服务的状态的发生改变的时候也会发送一条默认的广播。那么我们就可以拿到系统所提供的服务,截取系统发送的广播来实时的判断当前手机系统的网络连接状态。
一、我们首先在AndroidManifest.xml的配置文件中申请我们的网络访问权限。<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>,android.net.conn.CONNECTIVITY_CHANGE为系统网络发生改变时发送的广播标识。我们来手动监听他。
<!-- 注册广播 -->
<receiver android:name=".service.NetBroadcastReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter>
</receiver> 二、判断网络状态的类。注释的比较详细,不明白的欢迎留言。
package com.tianhe.utils;
import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
/**
* Created by Administrator on 2016/4/6.
*/
public class NetUtil {
public static final int NETWORN_NONE = 0;
public static final int NETWORN_WIFI = 1;
public static final int NETWORN_MOBILE = 2;
/**
* 测试ConnectivityManager
* ConnectivityManager主要管理和网络连接相关的操作
* 相关的TelephonyManager则管理和手机、运营商等的相关信息;WifiManager则管理和wifi相关的信息。
* 想访问网络状态,首先得添加权限<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
* NetworkInfo类包含了对wifi和mobile两种网络模式连接的详细描述,通过其getState()方法获取的State对象则代表着
* 连接成功与否等状态。
*
*/
public static int getNetworkState(Context context) {
//获取网络链接的服务
ConnectivityManager connManager = (ConnectivityManager) context
.getSystemService(Context.CONNECTIVITY_SERVICE);
// Wifi的状态
//CONNECTING 链接, CONNECTED 连接, SUSPENDED暂停, DISCONNECTING 断开, DISCONNECTED 断开, UNKNOWN 未知
NetworkInfo.State state = connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
.getState();
if (state == NetworkInfo.State.CONNECTED || state == NetworkInfo.State.CONNECTING) {
return NETWORN_WIFI;
}
// 3G的状态
state = connManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE)
.getState();
if (state == NetworkInfo.State.CONNECTED || state == NetworkInfo.State.CONNECTING) {
return NETWORN_MOBILE;
}
return NETWORN_NONE;
}
}
三、自定义广播类监听。
package com.tianhe.service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import com.tianhe.app.App;
import com.tianhe.utils.NetUtil;
import java.util.ArrayList;
/**
* Created by Administrator on 2016/4/6.
*/
public class NetBroadcastReceiver extends BroadcastReceiver {
public static ArrayList<netEventHandler> mListeners = new ArrayList<netEventHandler>();
private static String NET_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(NET_CHANGE_ACTION)) {
App.mNetWorkState = NetUtil.getNetworkState(context);
if (mListeners.size() > 0)// 通知接口完成加载
Log.e("运行了吗这个地方?","运行了吗");
for (netEventHandler handler : mListeners) {
handler.onNetChange();
}
}
}
public static abstract interface netEventHandler {
public abstract void onNetChange();
}
}
四、在我们需要的地方实现我们的接口就可以。我的代码接口中的判断,有网络就定位,没网络就停止定位。
@Override
public void onNetChange() {
// TODO Auto-generated method stub
if (NetUtil.getNetworkState(this) == NetUtil.NETWORN_NONE) {
Log.e("有没有网络", "没有网络");
locationClient.stopLocation();//停止定位
locationClient.onDestroy();
}else {
onCreate();
}
}更多内容扫一扫关注微信公众号:
在Android开发中,判断手机网络状态是常见需求。Android系统通过服务和广播通知网络变化。开发者需要在AndroidManifest.xml中声明ACCESS_NETWORK_STATE权限,并监听CONNECTIVITY_CHANGE广播,以此实时获取网络连接状态。

674

被折叠的 条评论
为什么被折叠?



