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(); } }