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网络开发与应用实战详解》一书深入浅出地介绍了Android系统中如何实现网络通信,并提供了丰富的源码示例。这本书涵盖的内容广泛,包括基础的HTTP请求、数据解析、网络状态管理以及高级的WebSocket通信和...
以下是关于Android网络摄像头实现及其相关技术的详细解释: 1. **Socket通信**: Socket是TCP/IP协议族的一部分,提供了进程间通信的能力,允许不同设备间的应用程序之间进行双向数据传输。在Android网络摄像头...
在Android开发中,实现"android 网络速率实时显示"功能涉及到多个核心知识点,包括网络数据的获取、服务(Service)的使用、悬浮窗(FloatingWindow)的创建与管理等。以下将逐一详解这些技术点。 首先,**网络数据...
总之,Android网络开发是一个包含多个层面的复杂主题,包括基本的网络协议、Android特有的API使用、安全性和性能优化等。开发者需要深入理解这些原理,才能在实践中编写出高效、稳定的网络应用。
【Android网络测速App源代码】是一个专门为Android平台设计的应用程序,用于测试设备的网络速度,包括上传和下载的速度。这个App不仅提供了基本的测速功能,还具有记录查询和结果保存到TXT文件的能力,同时结合了...
1. Android网络编程概述 Android网络编程是指在Android平台上开发能够处理网络请求的应用程序的编程实践。这通常涉及实现客户端与服务器之间的数据交换,使用不同的网络协议如HTTP/HTTPS以及进行网络状态监控等。 2...
"精通Android网络开发"意味着你需要深入理解网络通信的基本原理,并能熟练运用各种技术来实现Android应用与服务器之间的数据交换。以下是一些关于Android网络开发的重要知识点: 1. **HTTP/HTTPS协议**:Android...
《Android网络开发技术实战详解》是一本专注于Android平台网络编程的专著,旨在帮助开发者深入理解和实践Android应用程序中的网络通信技术。这本书详细介绍了如何在Android应用中实现各种网络功能,如HTTP请求、数据...
精通ANDROID网络开发.part1 由于上传限制,此书籍采用分卷压缩,需要与 精通ANDROID网络开发.part2一起才能正常解压使用
本节将深入探讨Android网络编程的基础知识,主要围绕Java网络编程这一核心概念展开。 首先,理解Android网络编程的基础概念至关重要。在Android中,网络操作通常在后台线程中执行,以避免阻塞主线程导致应用无响应...
本文将深入探讨“Android网络操作”的核心概念、常用方法以及如何利用封装好的框架进行高效开发。 一、Android网络访问基础 在Android中,网络操作主要依赖于java.net和HttpURLConnection类库,但出于性能和易用性...
《Android网络开发与应用实战详解》是一本深入探讨Android平台上的网络编程技术的书籍,由人民邮电出版社出版,作者王东华。这本书通过实践案例,详细讲解了如何在Android应用中实现各种网络功能,包括数据的获取、...
"android网络加载显示进度条"这一主题主要涉及两个关键概念:ProgressDialog和多线程(Thread)。下面将详细介绍这两个知识点。 首先,ProgressDialog是Android系统提供的一个对话框组件,它允许开发者创建一个带有...
Android网络请求,存在多网络的情况下(比如同时开启了移动网络和WiFi),网络请求优先走WiFi,如果想强制切换网络,看代码里面即可
以下是对这个“android网络收音机”应用的一些关键知识点的详细解释: 1. **Android开发基础**:这个应用是用Java或Kotlin语言编写的,基于Android SDK进行开发。开发者需要对Android的四大组件(Activity、Service...
《Android网络开发技术实战详解》是一本专注于Android平台网络编程的实用指南,旨在帮助开发者深入理解网络技术在Android应用中的实现。这本书以详实的记录和丰富的内容为特点,不仅覆盖了网络通信的基础知识,还...
本资料"Android网络开发从入门到精通源码"由张余提供,旨在帮助开发者系统地学习并掌握Android平台上的网络编程技术。 一、Android网络基础 在Android中,我们主要通过HttpURLConnection、HttpClient(已废弃)、...
《Android网络开发从入门到精通》.张余版,总大小为226MB,只能分4部分上传,需要的并没分的给我留言,留下邮箱或其它方式,看到后我发给你们,免费。
Android网络框架的另一个重要部分是Android的Service组件,它可以在后台持续运行,处理长时间的网络任务,避免阻塞UI线程。IntentService是一种特殊的Service,适合执行单一的任务并自动停止服务。除此之外,还可以...
对android网络的封装,完整demo,可以直接使用