Android.网络连接状态(联网,2g,3g,wifi等)

Android.网络连接状态(联网,2g,3g,wifi等),第1张

概述net与wap什么意思WAP上网所谓WAP(Wireless Application Protocol)即无线应用协议,是一项全球性的网络通信协议。WAP使移动Internet 有了一个通行的标准,其目标是将Internet的丰富信息及先进的业务引入到移动电话等无线终端之中。WAP定义可通用的平台,把目前Internet网上HTML语言的信息转换成用WML(Wireless Markup Langu net与wap什么意思

WAP上网所谓WAP(Wireless Application Protocol)即无线应用协议,是一项全球性的网络通信协议。WAP使移动Internet 有了一个通行的标准,其目标是将Internet的丰富信息及先进的业务引入到移动电话等无线终端之中。WAP定义可通用的平台,把目前Internet网上HTML语言的信息转换成用WML(Wireless MarkuP Language)描述的信息,显示在移动电话的显示屏上。WAP只要求移动电话和WAP代理服务器的支持,而不要求现有的移动通信网络协议做任何的改动,因而可以广泛的运用于GSM、CDMA、TDMA、3G等多种网络。
NET是微软下一代的 *** 作平台,它允许人们在其上构建各种应用方式,使人们尽可能通过简单的方式,多样化地、最大限度地从网站获取信息,解决网站之间的协同工作,并打破目前计算机、设备、网站、各大机构和工业界间的障碍--即所谓的“数字孤岛”,从而实现因特网的全部潜能,搭建起第三代互联网平台。


AndroID如何判断当前网络类型

一般对网络的判断都是判断是否联网,不过有时候我们需要知道具体的网络类型,比如在3g网络下,百度地图的定位功能存在很大的偏差,这就需要提前判断网络类型针对3g网络情况做特殊的处理。

在androID中判断网络需要用到ConnectivityManager,下面的方法演示了如何用ConnectivityManager**判断当前是否联网**:

public static boolean isNetworkConnected() {ConnectivityManager cm = (ConnectivityManager) AppContext.getInstance().getSystemService(Context.CONNECTIVITY_SERVICE);NetworkInfo ni = cm.getActiveNetworkInfo();return ni != null && ni.isConnectedOrConnecting();}

其中有个疑问,isConnectedOrConnecting()从字面上看是是否连接或者正在连接,如果正在连接的是一个不可用的网络,那应该算不联网的吧 ,所以我觉得还是改成isConnected()好些,根据个人的需求吧。

上面只是判断是否联网,跟我们的目的还有很大的差距,为了获得具体的网络类型需要对NetworkInfo中的信息进一步分解,NetworkInfo的getTypename()方法可以判断出是wifi还是mobile网络,与getTypename()方法对应的是getType方法,返回的是代表连接类型的整形常量,API中标明的有

ConnectivityManager.TYPE_MOBILE,
ConnectivityManager.TYPE_WIFI,
ConnectivityManager.TYPE_WIMAX,
ConnectivityManager.TYPE_ETHERNET,
ConnectivityManager.TYPE_BLUetoOTH

五种,其中只有ConnectivityManager.TYPE_MOBILE,ConnectivityManager.TYPE_WIFI是跟互联网有关的,可见ConnectivityManager并不是专门管理互联网连接的,还负责蓝牙等连接。

先定义一些整形变量代表不同的网络:

/** 没有网络 */public static final int NETWORKTYPE_INVALID = 0;/** wap网络 */public static final int NETWORKTYPE_WAP = 1;/** 2G网络 */public static final int NETWORKTYPE_2G = 2;/** 3G和3G以上网络,或统称为快速网络 */public static final int NETWORKTYPE_3G = 3;/** wifi网络 */public static final int NETWORKTYPE_WIFI = 4;

这些常量将在后面用到。

下面我们通过一个方法来实现判断是wifi还是移动网络,如果是移动网络再通过其他方法进一步分析是3g还是2g:

/**     * 获取网络状态,wifi,wap,2g,3g.     *     * @param context 上下文     * @return int 网络状态 {@link #NETWORKTYPE_2G},{@link #NETWORKTYPE_3G},*{@link #NETWORKTYPE_INVALID},{@link #NETWORKTYPE_WAP}* <p>{@link #NETWORKTYPE_WIFI}     */    public static int getNetWorkType(Context context) {        ConnectivityManager manager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);        NetworkInfo networkInfo = manager.getActiveNetworkInfo();        if (networkInfo != null && networkInfo.isConnected()) {            String type = networkInfo.getTypename();            if (type.equalsIgnoreCase("WIFI")) {                mNetWorkType = NETWORKTYPE_WIFI;            } else if (type.equalsIgnoreCase("MOBILE")) {                String proxyHost = androID.net.Proxy.getDefaultHost();                mNetWorkType = TextUtils.isEmpty(proxyHost)                        ? (isFastMobileNetwork(context) ? NETWORKTYPE_3G : NETWORKTYPE_2G)                        : NETWORKTYPE_WAP;            }        } else {            mNetWorkType = NETWORKTYPE_INVALID;        }        return mNetWorkType;    }

其中为了区别是3g还是2g我们定义了isFastMobileNetwork(context)方法,主要用到了TelephonyManager:

private static boolean isFastMobileNetwork(Context context) {TelephonyManager telephonyManager = (TelephonyManager)context.getSystemService(Context.TELEPHONY_SERVICE);    switch (telephonyManager.getNetworkType()) {        case TelephonyManager.NETWORK_TYPE_1xRTT:            return false; // ~ 50-100 kbps        case TelephonyManager.NETWORK_TYPE_CDMA:            return false; // ~ 14-64 kbps        case TelephonyManager.NETWORK_TYPE_EDGE:            return false; // ~ 50-100 kbps        case TelephonyManager.NETWORK_TYPE_EVDO_0:            return true; // ~ 400-1000 kbps        case TelephonyManager.NETWORK_TYPE_EVDO_A:            return true; // ~ 600-1400 kbps        case TelephonyManager.NETWORK_TYPE_GPRS:            return false; // ~ 100 kbps        case TelephonyManager.NETWORK_TYPE_HSDPA:            return true; // ~ 2-14 Mbps        case TelephonyManager.NETWORK_TYPE_HSPA:            return true; // ~ 700-1700 kbps        case TelephonyManager.NETWORK_TYPE_HSUPA:            return true; // ~ 1-23 Mbps        case TelephonyManager.NETWORK_TYPE_umts:            return true; // ~ 400-7000 kbps        case TelephonyManager.NETWORK_TYPE_EHRPD:            return true; // ~ 1-2 Mbps        case TelephonyManager.NETWORK_TYPE_EVDO_B:            return true; // ~ 5 Mbps        case TelephonyManager.NETWORK_TYPE_HSPAP:            return true; // ~ 10-20 Mbps        case TelephonyManager.NETWORK_TYPE_IDEN:            return false; // ~25 kbps        case TelephonyManager.NETWORK_TYPE_LTE:            return true; // ~ 10+ Mbps        case TelephonyManager.NETWORK_TYPE_UNKNowN:            return false;        default:            return false;        }    }

整个过程可总结为:第一步通过ConnectivityManager判断是wifi还是mobile网络,在通过TelephonyManager判断移动网络的类型。


具体实现监控网络
package com.zgrb.integrationse_ysl.service;import androID.app.Service;import androID.content.broadcastReceiver;import androID.content.Context;import androID.content.Intent;import androID.content.IntentFilter;import androID.net.ConnectivityManager;import androID.net.NetworkInfo;import androID.os.IBinder;import androID.util.Log;import com.zgrb.integrationse_ysl.HomeActivity;import com.zgrb.integrationse_ysl.util.Common;import com.zgrb.integrationse_ysl.util.LogUtil;public class NetworkService extends Service {    private static String TAG = "NetworkService";    private ConnectivityManager connectivityManager;    private NetworkInfo networkInfo;    private broadcastReceiver NetworkReceiver = new broadcastReceiver() {        @OverrIDe        public voID onReceive(Context context,Intent intent) {            String action = intent.getAction();            LogUtil.i(TAG,"======网络广播======");            if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {                Log.d(TAG,"==网络状态改变");                connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);                networkInfo = connectivityManager.getActiveNetworkInfo();                if (networkInfo != null && networkInfo.isAvailable()) {                    String name = networkInfo.getTypename();                    LogUtil.i(TAG,"==当前使用网络:" + name);                    Common.isNetwordAvailable = true;                } else {                    Common.isNetwordAvailable = false;                    LogUtil.e(TAG,"==没有可用网络==");                }                HomeActivity.showVIEw(context);            }        }    };    private static final String NFCADAPTER_EXTRA_STATE = "androID.nfc.extra.ADAPTER_STATE";    private static final int STATE_OFF = 1;    // private static final int STATE_TURNING_ON = 2;    private static final int STATE_ON = 3;    // private static final int STATE_TURNING_OFF = 4;    private broadcastReceiver NfcReceiver = new broadcastReceiver() {        @OverrIDe        public voID onReceive(Context context,Intent intent) {            String action = intent.getAction();            Log.d(TAG,"== nfc action:" + action);            if (action.equals(nfcAction)) {                int nfcState = intent.getIntExtra(NFCADAPTER_EXTRA_STATE,-1);                Log.e(TAG,"==nfcState:" + nfcState);                if (nfcState == STATE_ON) {                    Log.e(TAG,"==nfc is opened");                    Common.isNfcAvailable = true;                } else if (nfcState == STATE_OFF) {                    Log.e(TAG,"==nfc is closed");                    Common.isNfcAvailable = false;                }                // HomeActivity.showVIEw(context);            }        }    };    @OverrIDe    public IBinder onBind(Intent intent) {        return null;    }    @OverrIDe    public voID onCreate() {        super.onCreate();        LogUtil.i(TAG,"===service==onCreate");//        registerNfcReceiver();        registerNetworkReceiver();    }    private voID registerNetworkReceiver() {        LogUtil.i(TAG,"==注册网络广播==");        IntentFilter intentFilter = new IntentFilter();        intentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);        registerReceiver(NetworkReceiver,intentFilter);    }    private String nfcAction = "androID.nfc.action.ADAPTER_STATE_CHANGED";    private voID registerNfcReceiver() {        Log.d(TAG,"==注册NFC广播==");        IntentFilter filter = new IntentFilter();        filter.addAction(nfcAction);        registerReceiver(NfcReceiver,filter);    }    @OverrIDe    public voID onDestroy() {        super.onDestroy();        Log.d(TAG,"==解绑网络广播==");        unregisterReceiver(NetworkReceiver);//        unregisterReceiver(NfcReceiver);    }}

源码

参考:http://blog.csdn.net/nanzhiwen666/article/details/8288433#

总结

以上是内存溢出为你收集整理的Android.网络连接状态(联网,2g,3g,wifi等)全部内容,希望文章能够帮你解决Android.网络连接状态(联网,2g,3g,wifi等)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1089373.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-27
下一篇 2022-05-27

发表评论

登录后才能评论

评论列表(0条)

保存