使用Internet资源
在网络连通和WebKit浏览器的前提下,你可能会问,在你能创建基于web的应用程序时,有没有什么理由是用来决定要创建本地的、基于Internet的替代版本。
创建胖的和瘦的客户端应用程序而不依赖于整个基于web的解决方案有很多益处:
❑ 带宽
在有限的并且昂贵的带宽约束下,静态的资源如图片、layout和声音等都是设备上昂贵数据的消费者。通过创建一个本地的应用程序,你可以限制只用于数据更新的带宽需求。
❑ 缓存
移动网络存储还没有达到普遍存在的状态。使用一个基于浏览器的解决方案,部分网络连通可能导致应用程序断断续续。本地的应用程序可以缓存数据来提供尽可能多的功能而不需要一个实时的连接。
❑ 本地特征
Android设备不仅仅是一个运行浏览器的平台;它还包括定位的服务、摄像头硬件和重力加速度计。通过创建本地的应用程序,你可以将在线的数据和设备上的硬件特征结合起来,来提供更加丰富的用户体验。
现代的移动设备提供了很多种访问Internet的途径。大概的看一下,Android提供了三种连接网络的技术。每一种都清晰地提供应用层。
❑ GPRS、EDGE、3G
通过提供移动数据计划的服务商来访问移动网络。
❑ Wi-Fi
Wi-Fi无线接收和移动热点正在变得越来越常见。
连接Internet资源
本书并不覆盖在特定web服务下工作的细节,但了解连接网络和从一个远程数据源获得数据流的一般原理还是有用的。
在你能访问Internet资源之前,你需要在应用程序manifest中添加一个INTERNET的uses-permission节点,如下的XML片段所示:
<uses-permission android:name=”android.permission.INTERNET”/>
接下来的代码片段给出了打开一个Internet数据流的基本样式:
String myFeed = getString(R.string.my_feed);
try {
URL url = new URL(myFeed);
URLConnection connection = url.openConnection();
HttpURLConnection httpConnection = (HttpURLConnection)connection;
int responseCode = httpConnection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_OK) {
InputStream in = httpConnection.getInputStream();
[ ... Process the input stream as required ... ]
}
}
catch (MalformedURLException e) { }
catch (IOException e) { }
Android包含了一些类,帮助你处理网络通信。它们放在java.net.*和android.net.*包中。
在本章的后面,将有一个完整的例子,显示如何获取和处理一个Internet种子来获得过去24小时内能感受到得地震列表。
第9章中包含更多使用GTalk服务的基于Internet通信的细节。第10章描述了更多关于管理特定的Internet连接的信息,包括监视连接状态和配置Wi-Fi接入点连接。
利用Internet资源
Android提供了很多种利用Internet资源的方式。
一个极端,你可以在Activity中使用包含一个基于WebKit的浏览器的WebView Widget。另一个极端,你可以使用客户端的API,例如Google的GData API,来直接处理。介于两者之间,你可以使用基于Java的XML解析工具(如SAX或javax)处理远程XML种子来提取和访问数据。
解析XML和对特定web服务处理的指令阐述并不在本书的范围之内。那就是说,在本章后面的地震例子,给出了一个使用javax类来解析XML种子的完整的可工作的代码。
如果你在你的程序中使用Internet资源,记住一点,用户的数据连接依赖于他们能获得的通信技术。EDGE和GSM是出了名的低带宽,而Wi-Fi连接在手机设定中可能是不可靠的。
通过限制传输数据的量来优化用户体验,并且确保你的应用程序足够强壮来应付网络的掉线和带宽限制。