0 导言
为了让智能手机用户能够随时随地查询互联网所供给的服务,一种高效的办法便是将运用体系的功用拓宽到手机终端,让手机能经过移动网和互联网拜访Web 网站并处理各项事务。Android 体系是Google 公司开发的一个开源手机操作体系,它包含了操作体系、用户界面和运用程序,即智能手机作业所需的悉数软件。Android 的最大特点是它的开放性体系架构,不只具有非常好的开发、调试环境,而且还具有各种可扩展的设备,包含丰厚的图形组件、多媒体支撑功用和强壮的浏览器,而且已有许多比较老练的运用事例。
本文提出了智能手机气候实况预告体系的一种规划完成办法,供开发者参阅。
1 Android运用程序规划原理
一个Android 运用程序,一般由AcTIvity、Intent Receiver、Service、CONtent Provider 四种功用组件构成。可是,并不是每一个Android 运用程序都需求用到这四种功用组件,而是只需上述四种功用组件的某些组合。
1.1 Activity
Activity 是最根本的Android 运用程序组件。大多数运用由多个屏幕组成,一个Activity 一般则是一个独自的屏幕。每一个Activity 都被完成为一个独立的类,而且从Activity 基类中承继而来。Activity 类将会显现由视图控件组成的用户接口,并对事情做出呼应。Android 运用Intent 这个特别类,完成在屏幕与屏幕之间移动。经过解析各种Intent,从一个屏幕导航到另一个屏幕是很简单的。当向前导航时,Activity 将会调用STartActivity(Intent myIntent)办法,然后,体系会在一切装置的运用程序中所界说的IntentFilter 中查找,找到最匹配myIntent的和Intent 对应的Activity.新的Activity 接收到myIntent 的告诉后,开端运转。当startActivity 办法被调用时将触发解析myIntent 的动作。这个机制具有两点优势:一是能够重复运用从其他组件中以Intent 办法发生的一个恳求;二是Activity 能够在任何时分被一个具有相同IntentFilter 的新Activity 替代。
1.2 Intent Receiver
经过Intent Receiver 完成的运用能够对一个外部的事情作出呼应。Intent Receiver 在AndroidManifest.xml 中注册,也能够在代码中运用Context.registerReceiver()进行注册。当一个IntentReceiver 被触发时,运用不用对恳求调用Intent Receiver,体系会在需求的时分发动运用。各种运用还能够经过运用Context.
brOAdcastIntent()将它们自己的Intent Receiver播送给其他运用程序。
1.3 Service
Service 是一段长生命周期的、没有用户界面的程序。例如媒体播映器这个Activity 会运用Context.startService()来发动一个Service,然后能够在后台播映音乐。一起,体系也将坚持这个Service 一向履行,直到Service 运转完毕。体系可经过运用Context.bindService()办法,连接到一个Service 上(假如这个Service 还没有运转将发动它)。当连接到一个Service 之后,还能够运用Service 供给的接口与它通讯。就媒体播映器来说,还能够进行暂停、重播等操作。
1.4 Content Provider
Android 运用程序能够将它们的数据保存到文件、SQL 数据库,乃至是任何有用的设备中。Content Provider 完成了运用数据与其他的运用程序的同享。Content Provider 类完成一组规范的办法,能够让其他运用程序保存或读取此ContentProvider处理的各品种型数据。在Android 中,默许运用SQLite 作为体系数据库,但运用办法略有不同。Android 中每一个运用程序都运转在各自的进程中,当拜访其他运用程序的数据时,需求在不同的虚拟机之间传递数据,这样操作起来会有些困难(正常情况下,不能读取其他运用程序的数据库文件)。ContentProvider 正是处理不同的运用包同享数据的东西。
2 气候实况预告体系的详细完成
依据Android 渠道的智能手机拜访服务器的首要技能是数据交互办法。依据Android 操作体系的气候实况预告体系规划的中心是经过调用通讯协议SOAP(Simple Object AccessProtocol)的接口,从Web Service 供给商中提取气候预告的数据信息,为客户端服务。其根本功用是当用户运转气候预告体系程序时,在手机屏幕上显现出我国的城市称号,用户单击恣意一个城市名,可取得该城市的气候实况预告信息。用户也能够输入城市称号,点击查询取得气候预告信息。CitiesWeather-Forecast 工程目录结构及其源代码文件如图1所示。
2.1 Android渠道的用户界面完成
Android 供给的可改变的用户界面(UI)开发模块是依据XML 文件的。这些XML 文件放在工程/res/layout 下面。这个目录可包含一切运用程序所需的非码部分,比方图片、字符串、xml 文件。当要运用到这些资源时,在代码目录中翻开R.java文件即可。在XML 文件里修改界面的代码,完成起来不只便利,运用时也会愈加灵敏。
在Android 程序规划中要用到一些根本的Android UI 元素,经过运用Views、View Groups 和layouts 可为Activity 创立功用性的、赋有直观力的UI.一般是运用Android SDK 中供给的一些控件,进行布局、扩展和定制这些控件,并运用ViewGroups 去组合Views,创立由相互作用的子控件组成的原子的、重复运用的UI 元素。也能够创立自己的Views,来完成显现数据和与用户交互的新途径;或运用一些承继自View Group 的Layout 管理器来安排Android UI中的单个元素到屏幕上。
在一个Android 运用中,用户界面由View 和View Group目标构建。View 与View Group 有许多品种,而它们都是View类的子类。View 目标是Android 渠道顶用户界面的根本单元。View 类是widgets(东西)类的父类,它们供给了比方文本输入框和按钮之类的UI 目标的完好完成。View Group 类是Layouts(布局)类的父类,它们供给了比方流式布局、表格布局以及相对布局之类的布局架构。
View 目标是一个数据体,它的特点存储了用于屏幕上一块矩形区域的布局参数及内容。并担任它所辖的这个矩形区域之中一切丈量、布局、焦点转化、卷动以及按键/接触手势的处理。作为一个用户界面目标,View 一起也担任着用户交互要害点以及交互事情接受者的人物。气候实况预告体系程序功用比较单一,其UI 也相对比较简单,只需有一个输入框、一个查询按钮以及一个显现一切我国城市信息的列表即可。为了树立Android 渠道的用户界面,首要要在Package Explorer 窗口中打开Layout 后新建。xml 文件,用来对窗口界面进行布局,首要有体系运转的主配置文件main.xml 和result.xml.
Layout 是一类特别的ViewGroup 控件,它们自身没有任何可显现内容,存在的专一原因便是其间的内部结构,能够更好地摆放它的子控件。比方Linearlayout,可将子控件按水平或笔直方向按顺序摆放下去;Tablelayout,能够将子控件依照表格的办法,一枚枚放置好;Relativelayout 更灵敏,能够设定各个控件之间的对齐和摆放联系,合适定制杂乱的界面。有了Layout 的存在,控件和控件之间不再是分裂地存在,而是更有机地结合在一起,设定起来也更为便利。在本实例的main.xml 文件中首要是增加一些界面的布局设置,例如如下代码:
LinearLayout
android:orientation=horizontal
android:layout_width=fill_parent
android:layout_height=wrap_content
>
EditText android:id=@+id/cityText
android:layout_width=wrap_content
android:layout_height=wrap_content
android:text=@string/cityText/>
Button android:id=@+id/searchBtn
android:layout_width=wrap_content
android:layout_height=wrap_content
android:text=@string/searchBtn/>
/LinearLayout>
上述代码生成了一个Linearlayout,界说了一个EditText 和Button,而且设置了相关的参数。在Android 中,控件最重要的巨细特点是width/height,开发者能够指明控件的巨细,控件的宽、高以及在屏幕中的显现方位等,能够设定成为fill_parent 和wrap_content.别的,还能够设置相应的文本信息,并可经过android:text=@string/cityText/>进行引证(string 文件存放在工程的res/values 中)。依照这种办法,还能够依据需求界说相应的布局控件,比如界说用来出现气候实况信息的UI等。
2.2 创立我国城市列表数据
依据气候预告体系功用需求剖析,体系发动后,应在主界面上出现出我国国内一切城市的列表数据,因而需求创立我国城市列表数据,包含获取、解析城市列表数据,并在用户界面上出现出来。为此,需求处理的问题是手机终端从Web 服务器获取了一切类型的数据之后,将这些数据进一步交给Android 手机终端View 组件[4],在手机界面上显现给用户。
⑴ 获取城市列表数据
Android 没有供给Web Service 的组件库,但能够经过修改在PC 或J2ME 上运用的开源Web Service Java 库作为AndroidWeb Servic 库运用。kSOAP2(http://ksoap2.sourceforge.net)是一个在智能手机上的SOAP Web Service 客户端包,可用于资源受限制的Java 环境如Applets 或J2ME 运用程序。在GoogleCode 上有一个项目ksoap2-android(http://code.google.com/p/ksoap2-android/)可用在Android 渠道上完成轻量级的SOAP 库,即运用ksoap2-android 的API 来调用远端Web Service 的服务。
因而需求在CitiesWeatherForecast.java 的onCreate()中进行数据获取的初始化作业。经过界说一个办法public ListString>getAllCitiesNAMEs()可取得我国城市称号列表。也便是说,采用它供给的取得全球各个国家城市的办法GetCitiesByCountry,经过http://www.webservicex.net/globalweather.asmx 上的WebService 可供给气候预告服务。比如,经过Constant.java 中的public class Constant{},设置SOAP Action 要调用的办法名、命名空间以及Web Service URL值,其源代码为:
public static final String SOAP_ACTION=
http://www.webserviceX.NET/GetCitiesByCountry;
public static final String METHOD_NAME=
GetCitiesByCountry;
public static final String SOAP_ACTION2=
http://www.webserviceX.NET/GetWeather;
public static final String METHOD_NAME2=GetWeather;
public static final String NAMESPACE=
http://www.webserviceX.NET;
public static final String URL=
http://www.webservicex.net/globalweather.asmx;
然后在WebServiceCaller.java 中实例化一个SoapSerializationEnvelope目标,设置SoapObject 的命名空间、办法名、参数等;并经过实例化一个AndroidHttpTransport 目标来调用WebService,并取得xml 字符串数据,其代码段如下:
AndroidHttpTransport androidHttpTransport=
new AndroidHttpTransport (Constant.URL);
try {
androidHttpTransport.call(soapAction, envelope);
Object result=envelope.getResponse();
xmlStr=result.toString();
} catch(Exception e) {
e.printStackTrace();
}
⑵ 解析数据列表
Android 操作体系对xml 字符串数据的操作功用很强,供给了dom、sax 以及xmlpul 3 种办法。Android SDK 供给了android.sax 包以便利SAX Handler 的开发,可用来解析xml 成果字符串。在本规划实例的CitiesWeatherForecast.java 文件中,解析xml 数据时,先经过RootElement root=new RootElement(NewDataSet)取得xml 数据的根节点;然后再寻觅其子节点直到找到City 子节点,并设置一个监听器setEndTextElementListener()来取得City 子节点的值;最终运用org.xml.sax 的SAXParser 来解析xml 数据,把数据存入ListString>并回来:
SAXParserFactory factory=SAXParserFactory.newInstance();
SAXParser parser=factory.newSAXParser();
XMLReader xmlreader=parser.getXMLReader();
xmlreader.setContentHandler(root.getContentHandler());
InputSource is=new InputSource
(new StringBufferInputStream(xmlStr));
xmlreader.parse(is);
⑶ 在UI上出现城市列表数据
当取得ListString>类型的数据之后,就能够把它绑定到main.xml 界说的ListView 组件上,然后运用ListActivity 出现列表数据。在CitiesWeatherForecast.java 中的代码段为:
ListString> cityList=getAllCitiesNames();
setListAdapter(new ArrayAdapterString>(this,
android.R.layout.simple_list_item_1, cityList));
即运用办法setListAdapter()把一个ListActivity 填充进去。
2.3 城市气候实况预告体系的调试
城市气候实况预告体系的测验成果如下。在Eclipse 的Package Explorer 窗口顶用鼠标右键挑选CitiesWeatherForecast工程名,在弹出的窗口中挑选Run As→Android Application装置该运用程序到Android 模拟器并发动它。然后单击所要查询的城市称号列表项,稍等片刻便会显现出该城市的气候实况信息。也能够在文本框中直接输入所要查询的城市称号,单击Search同样会取得相应城市的气候预告信息。
3 完毕语
Android 渠道具有极大的开放性和兼容性,而且自身很多运用了开源代码库,深为开发人员所喜欢。Android 智能手机运用程序的开发触及了它的整个体系结构,是一项非常杂乱的工程。本文在介绍依据Android 渠道的运用程序规划原理的基础上,提出了Android 用户界面规划、获取并解析城市列表数据的一种办法,给出了在用户界面上出现数据的原理与规划进程,最终经过模拟器进行了运用程序的调试。当然,依据Android 渠道的开发技能还需求进一步完善,需求在日后的作业中不断探究、研讨,以树立有用的城市气候实况预告体系。