当前位置:首页 > 开发 > 移动开发 > 正文

Android网络

发表于: 2014-08-25   作者:chen592969029   来源:转载   浏览次数:
摘要: Android访问网络有很多种方式,比如WiFi,移动网络(3G等)... 他们是有一个优先级的。 当WiFi连接,打开3G网络,3G网络将被自动屏蔽; 当3G连接,连接WiFi,3G网络将被屏蔽,启用WiFi; 当WiFi连接,然后关闭,如果3G网络可用,将自动切换到3G网络。 这是系统默认的,可以通过API来改变这种优先级。比如:当3G连接,连接WiFi,我们希望仍然使

Android访问网络有很多种方式,比如WiFi,移动网络(3G等)...

他们是有一个优先级的。

  • 当WiFi连接,打开3G网络,3G网络将被自动屏蔽;
  • 当3G连接,连接WiFi,3G网络将被屏蔽,启用WiFi;
  • 当WiFi连接,然后关闭,如果3G网络可用,将自动切换到3G网络。

这是系统默认的,可以通过API来改变这种优先级。比如:当3G连接,连接WiFi,我们希望仍然使用3G网络,那么

ConnectivityManager connMgr = (ConnectivityManager)
                getSystemService(Context.CONNECTIVITY_SERVICE);        
connMgr.setNetworkPreference(ConnectivityManager.TYPE_MOBILE);

当这样设置之后,会自动断开WiFi连接。

那通过代码,怎么知道WiFi是否连接或者移动网络是否连接呢?

//判断是否有网络连接
    public boolean isOnline() {
        ConnectivityManager connMgr = (ConnectivityManager)
                getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
        //connMgr.setNetworkPreference(ConnectivityManager.TYPE_MOBILE);
        return (networkInfo != null && networkInfo.isAvailable());
    }
    //判断WiFi是否连接
    public boolean isWifiConnected() {
        ConnectivityManager connMgr = (ConnectivityManager)
                getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        return (networkInfo != null && networkInfo.isConnected());
    }
    //判断移动网络是否连接
    public boolean isMobileConnected() {
        ConnectivityManager connMgr = (ConnectivityManager)
                getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo networkInfo = connMgr.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        return (networkInfo != null && networkInfo.isConnected());
    }

 判断WiFi是否连接,还可以通过WifiManager

//判断WiFi是否连接
    public boolean isWifiConnected() {
        WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        if (wifiManager.isWifiEnabled()) {
            WifiInfo wifiInfo = wifiManager.getConnectionInfo();

            return wifiInfo != null && SupplicantState.COMPLETED == wifiInfo.getSupplicantState();
        }

        return false;
    }

它还提供了很多操控WiFi的方法,比如连接或断开WiFi连接,打开或关掉WiFi等。

有WiFi连接并不等于连接到Internet。比如:手机连接到无线路由器,而无线路由器没有连接Internet,这种情况可以用代码容易地判断

    //判断WiFi连接时是否能够访问Internet
    public boolean hasWifiInternetAccess() {
        WifiManager mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
        if(mWifiManager.isWifiEnabled()) {
            return mWifiManager.pingSupplicant();
        }
        return false;
    }

上面的方法其实并不能准确的判断当WiFi连接是是否可以访问Internet。例如,当连接到机场的WiFi,它需要打开浏览器,在弹出的页面上输入用户名密码,此时pingSupplicant返回的是TRUE,当这种情况时,只能通过代码访问某个网址,检查返回值来检测是否能够上网。

通常,为了更好的用户体验,比较大的网络请求只在有WiFi的情况下才发出,比如下载地图数据,下载高质量的音乐。因为网络请求是一个比较耗时的操作,所以不能放在主线程(UI线程)进行,了解更多请点击这里。可以使用Android中的AsyncTask发送网络请求。

TextView textView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_network_test);

        textView = (TextView) findViewById(R.id.textView);

        NetworkTask networkTask = new NetworkTask();
        networkTask.execute();
    }

    private class NetworkTask extends AsyncTask<Void, Void, Void> {
        String statusCode = "";

        @Override
        protected Void doInBackground(Void... voids) {
            //耗时操作。在这里是发送网络请求,系统会将本方法里面的代码在新的工作线程里面执行
            DefaultHttpClient client = new DefaultHttpClient();
            HttpParams params = client.getParams();
            int timeoutInMillisecond = 10000;
            HttpConnectionParams.setConnectionTimeout(params, timeoutInMillisecond);
            HttpConnectionParams.setSoTimeout(params, timeoutInMillisecond);

            int retryTimes = 1;
            if (retryTimes > 0) {
                client.setHttpRequestRetryHandler(new DefaultHttpRequestRetryHandler(retryTimes, true));
            }

            HttpGet get = new HttpGet("http://www.cchen.com");
            HttpResponse response = null;
            try {
                response = client.execute(get);
                statusCode = String.valueOf(response.getStatusLine().getStatusCode());
            } catch (IOException e) {
                statusCode = "-1";
            }
            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            //更新UI。上面方法执行完毕后,系统会在主线程(UI线程)执行本方法中的代码
            textView.append(statusCode + "\n");
        }
    }

注意,上面的HttpConnectionParams设置了两个Timeout:

  • ConnectionTimeOut,建立连接的timeout
  • SoTimeout,socket timeout,等待返回数据的timeout

上面代码设置两个timeout都是10秒。那假如手机不能上网,是不是10秒之后才会抛出异常呢?答案是否定的。

  • 如果手机不能上网,这里会立即报错。注意,这里指的是上网,不是连接WiFi或者移动网络,因为连接上了WiFi或者移动网络并不等于连接上Internet。
  • 如果手机能上网,访问某个网址,连接时间超过10秒,则会报错。例如,上面我给的网址,http://www.cchen.com,这是一个不存在的网址,因此,程序在10秒之后,屏幕显示错误码-1.

还有当我们听着音乐回到家中,手机自动连接到WiFi,这个时候程序就应该播放高质量的音乐了,那我们怎么知道手机的网络连接类型发生了变化呢?Android系统在手机网络类型发生变化的时候,会发送一个广播

ConnectivityManager.CONNECTIVITY_ACTION

所以,我们只需要监听这个广播,再利用上面的代码,就能轻易得知当前网络类型,然后进行相关操作。

 

 

Android网络

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

编辑推荐
  Android中访问网络用的是HttpClient的方式,即Apache提供的一个jar包。安卓中继承了改jar包,所
android 网络拨号流程: frameworks\base\services\java\com\android\server\ ConnectivityService.j
简介 本文探究了 Android 的网络功能。了解如何利用 Android 的网络选项来实现有趣、有用的东西。An
简介 本文探究了 Android 的网络功能。了解如何利用 Android 的网络选项来实现有趣、有用的东西。An
简介 本文探究了 Android 的网络功能。了解如何利用 Android 的网络选项来实现有趣、有用的东西。An
在Android中,可以有多种方式来实现网络编程: 创建URL,并使用URLConnection/HttpURLConnection 使
在当前网络成为必不可少的条件时,android系统也集成的wifi,bluetooth,eth,cablemodem等等,为了将
Android -- 网络管理分析 在当前网络成为必不可少的条件时,android系统也集成的wifi,bluetooth,eth,
Android网络编程概述 首先,应该了解的几个问题: 1)Android平台网络相关API接口 a) java.net.*(标
简介 本文探究了 Android 的网络功能。了解如何利用 Android 的网络选项来实现有趣、有用的东西。An
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号