Android手机天气预报系统设计及实现

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 文件中主要是添加一些界面的布局设置,例如如下代码:
android:orientation=horizontal
android:layout_width=fill_parent
android:layout_height=wrap_content
>
android:layout_width=wrap_content
android:layout_height=wrap_content
android:text=@string/citytext/>
android:layout_width=wrap_content
android:layout_height=wrap_content
android:text=@string/searchbtn/>
上述代码生成了一个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 listgetallcitiesnames()可获得中国城市名称列表。也就是说,采用它提供的获得全球各个国家城市的方法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 数据,把数据存入list并返回:
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上呈现城市列表数据
当获得list类型的数据之后,就可以把它绑定到main.xml 定义的listview 组件上,然后使用listactivity 呈现列表数据。在citiesweatherforecast.java 中的代码段为:
list citylist=getallcitiesnames();
setlistadapter(new arrayadapter(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 平台的开发技术还需要进一步完善,需要在日后的工作中不断探索、研究,以建立实用的城市天气实况预报系统。

图灵机器人:“试爱机器人”的未来不可限量
自动驾驶人机交互与接管
NAS网络存储器的网络管理
苹果或彻底改用USB Type-C接口 与市场保持一致
研调:首款5G手机最快2019年问世 五年内4G手机仍是市场主流
Android手机天气预报系统设计及实现
大港股份投资1.3亿元,扩建CIS芯片晶圆级封装产能
TI、恩智浦、美光等芯片大厂陆续裁撤中国研发团队,释放什么信号?
基于rfid的视频监控是怎样的
智能家居以太网供电PoE应用方案
HIOKI高低压均可测量的MR8880-21存储记录仪
3D Touch未来应用方面还有很大潜力
Xilinx SelectIO IP的GUI参数详解及应用设计
对微电网中并联逆变器与电网的谐波交互问题进行分析研究
厚度仅有0.13mm的无源贴片晶振,逆天了
索尼新申请PS VR控制器的概念图曝光
物联网与绿色建筑需求给智能空间市场发带来了什么
2018年我国净增移动通信基站29万个总数已达648万个
中国投入千亿美金加强5G建设抢占发展先机
Uber正洽谈自动驾驶汽车初创公司Aurora