安卓天气预报课程设计报告_第1页
安卓天气预报课程设计报告_第2页
安卓天气预报课程设计报告_第3页
安卓天气预报课程设计报告_第4页
安卓天气预报课程设计报告_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

----word.zl-铁道大学Android系统课程设计报告2016年夏季学期题目:基于Android的天气预报开发学院:电气与电子工程学院专业:电子信息工程学生XX:学号:指导教师:完成日期:2016年7月15日----word.zl-评分表工程号一二三总分总分值255025100得分评阅人说明:工程一,考察程序运行情况。工程二,考察完成情况包括功能完整性,工作量,界面,用户体验等。工程三,考察课程设计报告的格式和完整性。摘要随着移动通信技术的开展和无线数据业务的进步,手机已被赋予了除通话以外的其它许多功能。全新的手机软件领域已逐渐聚焦了众多软件开发商的目光,软件开发者和软件用户将共同面临这个振奋人心的新境界。本设计使用Android设计技术开发了一种运用在Android系统上的手机天气预报软件系统,本系统通过选择城市来获得天气,风向,风向,温度等信息。基于手机的天气预报系统软件可以使用户对于各地的天气情况的实时掌握,极大的方便了用户的出行和行程安排,防止了不必要的麻烦,具有很强的实用性。关键词:Android;手机天气预报软件。目录第1章绪论错误!未定义书签。1.1课题研究容 11.2课题研究的目的和意义 11.3课题研究前景 2第2章系统需求分析 32.1系统功能需求 32.2系统流程图 32.3系统界面需求 42.4系统性能需求 4第3章详细设计和功能实现 53.1界面的设计 53.1.1欢送界面设计 53.1.2菜单界面设计 63.2各模块详细设计 63.2.1欢送模块设计 63.2.1主工程设计 7第4章软件测试 154.1电脑模拟器测试154.2手机端测试 17第5章总结与展望 185.1总结 185.2缺乏与展望 18参考文献 19附录 20重要程序1 18重要程序2 18----word.zl-一、绪论Android是一种基于Linux的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由Google公司和开放手机联盟领导及开发。Android操作系统最初由AndyRubin开发,主要支持手机。2005年8月由Google收购注资。2007年11月,Google与84家硬件制造商、软件开发商及电信营运商组建开放手机联盟共同研发改进Android系统。随后Google以Apache开源许可证的授权方式,发布了Android的源代码。第一部Android智能手机发布于2008年10月。Android逐渐扩展到平板电脑及其他领域上,如电视、数码相机、游戏机等。2011年第一季度,Android在全球的市场份额首次超过塞班系统,跃居全球第一。2012年11月数据显示,Android占据全球智能手机操作系统市场76%的份额,中国市场占有率为90%。2013年09月24日谷歌开发的操作系统Android在迎来了5岁生日,全世界采用这款系统的设备数量已经到达10亿台。1.1课题研究容本课题研究的是基于Android平台下的天气软件,目的是使用户能随时随地的查询天气信息及天气变化情况,让生活更加舒适方便。本文讲述Android平台下天气软件的界面设计以及数据的获取和解析,主要包括界面的实现,控件的使用,界面的布局和数据处理等容,结合中国气象网的天气数据,将准确的天气情况以友好的方式呈现给用户,使用户更加赏心悦目的体验本软件的效劳。通过对界面的布局及控件的应用等相关容的学习,使我们对Android平台下界面开发工作有一个初步的了解,并且经过这次开发过程,能够根本掌握这些容。1.2研究目的和意义天气软件是一种非常实用的信息效劳,随着智能手机的不断普及,各种智能手机平台下都有各种各样的天气软件。Android作为现在主流的智能手机之一,自然也需要这方面的软件。天气关系到人们的日常生活,如告知温暖,方便出行等。一款简单实用的天气软件会很吸引用户。基于Android平台的天气软件已经有很多,经过分析,用户第一眼往往是一个软件的外观,一个好看的界面才能让用户以一种爱美之心去尝试,才能进一步了解一个软件的好坏,所以吸引眼球的界面是争取用户的第一步。因此,界面设计工作对应用程序来说非常重要,在界面上吸引了用户,才能进一步让用户体验应用程序中的功能,使用这个软件。1.3研究前景Android最吸引人的特点是开源特性,因其开源,允许所有人对其代码进展开发和修改,同时又由于其代码的简单易学性,Android在全世界拥有众多的粉丝。Android在中国的前景十分广阔,首先是有成熟的消费者,在国,Android社区十分红火,这些社区为Android在中国的普及做了很好的推广作用。国厂商和运营商也纷纷参加了Android阵营,包括中国移动,中国联通,中兴通讯,华为通讯,联想等大企业,同时不仅仅局限于手机,国厂家也陆续推出了采用Android系统的产品,我们可以预见Android将会被广泛应用在国产智能上网设备上,将进一步扩大Android系统的应用围。Android采用了软件层〔Softwarestack〕的构架,主要分为三个局部。底层以Linux为核作为根底,由C语言开发,只提供根底功能,中间层次包话函数库和虚拟机,由C++开发。最上层是各种应用软件,包话通话程序,短信程序。应用软件可以由各公司或个人自行开发,以JAVA编写。二、系统需求分析2.1系统功能需求1.可以罗列出全国所有的省市县。2.可以查看全国任意城市的天气信息3.可以自由的切换程式去查看其他城市的天气4.提供手动更新以及后台自动更新天气的功能2.2系统流程图图2.1系统流程图2.3系统界面需求根据应用程序的功能需要,对用户界面做如下分析:实时天气界面:显示城市当前的实时天气状况,包括城市名称、城市名片、天气情况、温度上下、星期等信息。界面左边有一列城市列表,显示中国各个城市名称,当用户想知道哪个城市的天气情况时,点击这个城市名就可以获取天气状况,考虑到使软件占用尽量小的存,软件去掉了不必要的花哨,显示城市名称,城市名片,温度和天气情况,同时对未来6天的天气情况简要描述,简要显示星期、天气描述、温度上下等数据,使用户一目了然,使人们及时了解天气变化,对日常生活出行、穿衣做好准备。2.4系统性能需求1.应用程序能根据中国天气网接口返回的数据准确的显示地区天气信息。2.应用程序响应时间应在人的感觉和视觉围,系统响应时间足够迅速。3.应用程序在android4.0及以上版本运行时,应具有适应能力,能稳定运行。4.应用程序操作界面简单明了,易于操作。三、详细设计和功能实现3.1界面的设计3.1.1欢送界面的设计欢送界面,采用简洁明了的布局,添加了一个button点击事件,点击即可跳转到主界面即省份选择菜单。如图3.1所示图3.1欢送界面3.1.2菜单界面设计菜单界面菜单界面采用列向布局和子菜单。这样直观明了,简洁清晰。〔当为省份时标题栏显示中国〕,省份,城市。如图3.2所示3.2ab注:a为省份菜单,b为市级菜单3.2各模块详细设计3.2.1欢送模块设计1.新建一个WeleActivity类,并让它继承Activity类。任何活动都应该重写onCreate()方法。publicclassWeleActivityextendsActivity{ protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState);}}2.新建一个布局文件,命名为wele_layout,根元素选择为LinearLayout。创立成功后,再LinearLayout下添加背景添加语句:android:background="drawable/b"添加一个按钮,用于点击事件的触发:<Buttonandroid:id="+id/button1"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="点击查询天气"/>在WeleActivity里,关联布局文件和实例化button.然后添加onClick,构造出一个intent,传入WeleActivity上下文,传入ChooseAreaActivity.class为目标活动。即在WeleActivity这个活动的根底上翻开ChooseAreaActivity这个活动。然后通过startActivity()方法来执行这个intent。setContentView(R.layout.wele_layout); Buttonbutton1=(Button)findViewById(R.id.button1); button1.setOnClickListener(newOnClickListener(){ publicvoidonClick(Viewv){Intentintent=new Intent(WeleActivity.this,ChooseAreaActivity.class); startActivity(intent);3.2.2主工程设计第一阶段1.新建工程命名为coolweather。为了让工程有更好的构造。需要在.coolweather.app包下再新建一个包,如图3.3所示。图3.3新建包构架其中activity包用于存放所有活动代码,db包用于存放所有数据库相关的代码,model包用于存放所有模型相关的代码,receiver包用于存放所有播送相关的代码,service包用于存放所有效劳相关的代码,util包用于存放所有工具相关的代码。2.创立数据库和表,这样从效劳器获取的数据才能够存储到本地。表的设计这里建立三表,Province,City,County,分别用于存放省,市,县的各种数据信息,三表的建表语句如下〔以county表为例〕County:createtableCounty(idintegerprimarykeyautoincrement,county_nametext,county_codetext,city_idinteger)其中id是自增长主键,county_name表示县名,county_code表示县级代号,city_id是county表关联city表的外键。接下来将建表语句写入到代码中。在db包下新建CoolWeatherOpenHelper类,用于province,city,county的建表。核心代码如下所示。publicvoidonCreate(SQLiteDatabasedb){ //创立表 db.execSQL(CREATE_PROVINCE); db.execSQL(CREATE_CITY); db.execSQL(CREATE_COUNTY); }3.为每表创立一个对应的实体类。在model下分别新建Province类,city类,county类。实体类非常简单,根本就是对应字段的get和set方法。类的创立如图3.4所示。图3.4实体类4.创立一个CoolWeatherDB类,这个类将会把一些常用的数据库操作封装起来,以方便后面使用。代码如下所示。定义数据库名,版本。将构造方法私有化,实例化数据库。保存加载省级、市级、县级数据信息从提交的程序中可以看到CoolWeatherDB是一个单例类,这里将它的构造方法私有化,并提供了一个getInstance()方法来获取CoolWeatherDB的实例,这样就可以保证全局围只会有一个CoolWeatherDB的实例。在CoolWeatherDB中,提供了六组方法,saveProvince()、loadProvince()、saveCity()、loadCities()、saveCounty()、loadCounties(),分别用于存储省份数据、读取所有省份数据,存储城市数据、读取某省所有城市数据,存储县数据、读取某市所有县的数据。第二阶段1.全国所有的省市县的数据都是从效劳器端获取到的,所以为了使程序具有遍历全国省市县的功能,这里和效劳器的交互式必不可少的。所以先在util包下增加一个HttpUtil类。因为在HttpUtil中使用到了HttpCallbackListener接口来回调效劳返回的结果,因此还需要在util包下添加这个接口。另外由于效劳器返回的省市县数据都是“代号|城市,代号|城市,……〞这种格式的,所以要再提供一个工具类来解析和处理这种数据,。在util包下再新建一个Utility类。在该类中,提供了handlepRrovince()、handleCitiesResponse()、handleCountiesResponse()这三个方法,分别用于解析和处理效劳器返回的省级、市级、县级数据。解析的规那么就是先按逗号分隔,再按单竖线分隔,接着将解析出来的数据设置到实体类中,最后调用CoolWeatherDB中的三个save()方法将数据存储到相应的表中。两个类和一个接口的创立如图3.5所示。图3.5解析数据工具类2.工具类准备好,开场布局,在res/layout目录下新建choose_area.xml布局。布局文件中的容比拟简单,先是定义一个50dp高的头布局,并在里面放置了一个TextView用于显示标题容。然后在头布局的下面定义了一个ListView,用于显示省市县的数据。3.编写用于遍历省市县的活动,在activity包下新建ChooseAreaActivity继承自Activity。该类中的代码非常多,这里只把逻辑理理。在onCreate()方法中先是获取到了一些控件的实例,然后去初始化了ArrayAdapter,将它设置为ListView的适配器。之后又去获取到了CoolWeatherDB的实例,并给ListView设置了点击事件,到这,初始化工作完成。在onCreate()方法的最后调用了queryProvince()方法,也就是从这里开场加载省级数据的。queryProvinces()方法的部会首先调用CoolWeatherDB和loadProvinces()方法来从数据库读取省级数据。如果读取到了就直接将数据显示到界面上,如果没有读取到就调用queryFromServer()方法从效劳器上查询数据。queryFromServer()方法会先根据传入的参数来拼装查询地址,现在网上有不少免费的天气预报接口可以实现上述功能,例如新浪天气,百度天气的,这里我准备使用中国天气网提供的API,接口来实现上述功能。比方要想,努力出中国所有的省份,只需访问如下地址,这里需要注意,如果用浏览器直接访问的话,可能会得到一个错误提示。这是因为浏览器认为效劳器应该返回一个xml格式的数据。但实际上效劳器返回的数据,并不是xml格式所导致的,右键查看网页源码代码就可以看到效劳器返回的真是数据了:.weather../data/list3/city.xml效劳器会返回一段文本信息,其中包含了中国所有的省份名称以及省级代号,如下01|,02|,03|XX,04|,05|,06|,07|,08|,09|,10|,11|,12|,13|XX,14|,15|,16|,17|,18|,19|,20|,21|,22|,23|,24|,25|,26|,27|,28|,29|,30|XX,31|,32|,33|澳门,34|可以看到的代号是01,的代号是02,不同省份之间以逗号隔开,省份名称和省级代号之间用单竖线分隔。要想知道某个省有哪些城市,比方的代号是19,那么只要访问如下地址:.weather../data/list3/city19.xml这次效劳器返回的数据如下:190401|,190402|常熟,190403|家港,190404|XX,190405|吴县东山,190406|吴县,190407|吴江,190408|太仓通过这种方式,就能把全国所有的省,市,县,都罗列出来了。那么解决了全国省市县数据的获取,然后就是解决查询天气信息的问题。这里原理同上,比方,XX的县级代号是190404,那么访问如下地址:.weather../data/list3/city190404.xml这时效劳器返回的数据非常简短:190404|101190404其中后半局部的101190404就是XX所对应的天气代号了。这个时候再去访问查询天气接口,将相应的天气代号填入即可,接口地址如下:.weather../data/cityinfo/101190404.html这样效劳器就会把XX当前的天气信息以JSON格式返回给我们了,如下所示:{“weatherinfo〞:“city〞:XX,〞cityid〞:101190404,〞temp1〞:〞21℃〞,〞temp2〞:〞9℃〞,〞weather〞:〞多云转小雨〞,〞img1〞:〞d1.gif〞,〞img2〞:〞n7.gif〞,〞ptime〞:〞11:00〞}其中city表示城市名,cityid表示城市对应的天气代号,temp1和temp2表示气温是几度到几度,weather表示今日天气信息的描述,img1和img2表示今日天气对应的图片,ptime表示天气发布的时间。确定了查询地址之后,接下来就调用HttpUtil的sendHttpRequest()方法来向效劳器发送请求,响应的数据会回调到onFinish()方法中,然后去调用Utility的handleProvincesResponse()方法牵扯到了UI操作,因此必须要在主线程中调用,这里借助了runOnUiThread()方法来实现从子线程切换到主线程,它的实现原理其实也是基于异步消息处理机制的。现在数据库中已经存在了数据,因此调用queryProvinces()就会直接将数据显示到界面上。当你点击了某个省的时候进入到ListView的onClick()方法中,这个时候会根据当前的级别来判断是去调用queryCities()方法还是queryCounties()方法,queryCities()方法是去查询市级数据,而queryCounties()方法是去查询县级数据,这两个方法部的流程和queryProvinces()方法根本一样,不重复说明了。这里重写onBackPressed()方法来覆盖默认Back键的行为,会根据当前的级别来判断是返回市级列表、省级列表、还是直接退出。配置androidMainifest.xml文件。为活动添加访问网络权限<uses-permissionandroid:name="android.permission.INTERNET"/>现在已经程序已经可以运行。如图3.6所示。图3.6省份菜单可以看到,全国所有的省级单位都出来了,继续查看市级单位,比方点击如图3.7所示。图3.7市级菜单然后再点击,结果如图3.8所示。图3.8县级菜单这样第二阶段的开发工作完成。第三阶段1.查询天气,需要把天气信息显示出来。所以要穿件一个新的界面用于显示。创立weather_layout.xml。在这个布局文件中,并没有特殊的控件,根本就是使用TextView显示数据信息,然后嵌套多层LinearLayout和RelativeLayout来控制TextView的显示位置。在Utility类中添加几个方法,用于解析和处理效劳返回的JSON数据,如下所示其中handleWeatherResponse()方法用于将JSON格式的天气信息全部解析出来,saveWeatherInfo()方法,用于将这些数据都存储到SharedPreferences文件中。在activity包下,新建WeatherActivity继承自Activity。该活动用于显示城市名,发布时间,气温,日期等。最后将ChooseAreaActivity和WeatherActivity关联。在ChooseAreaActivity中添加代码:SharedPreferencesprefs=PreferenceManager.getDefaultSharedPreferences(this); if(prefs.getBoolean("city_selected",false)&&!isFromWeatherActivity){ Intentintent=newIntent(this,WeatherActivity.class); startActivity(intent); finish();…………elseif(currentLevel==LEVEL_COUNTY){ StringcountyCode=countyList.get(index).getCountyCode(); Intentintent=newIntent(ChooseAreaActivity.this,WeatherActivity.class); intent.putExtra("county_code",countyCode); startActivity(intent); finish();最后添加切换城市和更新天气按钮。运行程序,如图3.9所示图3.9北安天气四、软件测试4.1电脑模拟器测试软件编写完成,对其进展测试,首先将手机天气预报系统在电脑模拟环境下测试的方案,以下是对系统进展测试,在Eclipse的PackageExplorer窗口中用鼠标右键选择weather工程名,在弹出的窗口中选择"RunAs"→"AndroidApplication"安装该应用程序到Android模拟器并启动它,如图4.1所示。图4.1启动模拟器等待模拟器启动完成软件的安装,然后单击所要查询的城市名称列表项,稍等片刻便会显示出该城市的天气实况信息。电脑模拟测试结果如图4.2所示。图4.2潞城天气经查询当地的天气发现根本一致,所以可以知道软件获得的数据是正确的,说明软件的可行性根本满足要求。4.2手机端测试图4.3临武天气该测试说明开发的天气预报软件可以独立在Android设备运行,满足设计要求的独立性,通过与网络的数据比拟,可以发现,天气预报软件获取的数据与实际的天气情况非常接近,说明数据的准确性,实时性;从图9可以看出,中选择不同的城市时,软件可以通过网络获取不同城市的天气信息,说明该天气预报软件可以获取不同城市的气象信息,满足设计要求。五、总结与展望5.1总结为期两周的Android实训已经完毕,在这两周中我学习了很多,也得到了很多。实训是把理论与实际结合,通过对理论知识的理解,领悟从而运用到生活实际稳固所学的知识,提高对实际生活的认识,积累经历。在此期间能够初次体会到实际生产中的种种技能与经历。完成一项项工程能表达出独立思考能力。在本次Android天气预报软件开发过程中,我通过学校的图书馆资料和网上查询,了解了Android的搭建、Intent、Activity、Service等知识。Android环境搭建的根本工作完成后,本文对界面的控件、布局和美观方面进展设计,对数据获取和解析做了分析,通过模拟器显示城市名片,实时天气情况Android生产实习对目前应用现状进展了分析与比拟,进而研究分析Android平台的系统架构和组件模型。在此根底上,基于Android平台设计和开发,实现对android编程的理解与应用,特别是在对于控件的应用和活动的创立有了很深的理解。5.2缺乏和展望这次实习我制作的软件还是有很多缺乏之处,这个软件还可以进一步开展,比方“短信预报〞、“新闻模块〞等功能,如果这些功能都能实现将会对用户有更多的帮助,使他们的生活更加愉悦和方便。我会继续为这个软件添加功能,直到它成长为一个强大的app。Android智能手机应用程序的开发涉及了它的整个体系构造,是一项非常复杂的工程。我要以严谨的态度对待它。不骄纵,不菲薄。参考文献[1].BillPhillips.Android编程权威指南.人民邮电,2015[2].任玉刚.Android开发艺术探索.电子工业,2016[3].何红辉关爱民.Android源码设计模式解析与实战.人民邮电,2015[4].郝玉龙

.Android程序设计根底.交通大学,2013[5].徐宜生.Android群英传.电子工业,2012附录重要程序1protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); isFromWeatherActivity=getIntent().getBooleanExtra("from_weather_activity",false); SharedPreferencesprefs=PreferenceManager.getDefaultSharedPreferences(this); if(prefs.getBoolean("city_selected",false)&&!isFromWeatherActivity){ Intentintent=newIntent(this,WeatherActivity.class); startActivity(intent); finish(); return; } requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.choose_area); listView=(ListView)findViewById(R.id.list_view); titleText=(TextView)findViewById(R.id.title_text); adapter=newArrayAdapter<String>(this,android.R.layout.simple_list_item_1,dataList); listView.setAdapter(adapter); coolWeatherDB=CoolWeatherDB.getInstance(this); listView.setOnItemClickListener(newOnItemClickListener(){ Override publicvoidonItemClick(AdapterView<?>arg0,Viewview,intindex,longarg3){ if(currentLevel==LEVEL_PROVINCE){ selectedProvince=provinceList.get(index); queryCitys(); }elseif(currentLevel==LEVEL_CITY){ selectedCity=cityList.get(index); queryCounty(); }elseif(currentLevel==LEVEL_COUNTY){ StringcountyCode=countyList.get(index).getCountyCode(); Intentintent=newIntent(ChooseAreaActivity.this,WeatherActivity.class); intent.putExtra("county_code",countyCode); startActivity(intent); finish(); } } }); queryProvince();//加载省级数据}//查询全国的省,优先从数据库查询,如果没有查询到再去效劳器上查询 privatevoidqueryProvince(){ provinceList=coolWeatherDB.loadProvince(); if(provinceList.size()>0){ dataList.clear(); for(Provinceprovince:provinceList){ dataList.add(province.getProvinceName()); } adapter.notifyDataSetChanged(); listView.setSelection(0); titleText.setText("中国"); currentLevel=LEVEL_PROVINCE; }else{ queryFromServer(null,"province"); } }重要程序2privatevoidinitViews(){ weatherInfoLayout=(LinearLayout)findViewById(R.id.weather_info_layout); cityNameText=(TextView)findViewById(R.id.city_name); publishText=(TextView)findViewById(R.id.publish_text); weatherDespText=(TextView)findViewById(R.id.weather_desp); temp1Text=(TextView)findViewById(R.id.temp1); temp2Text=(TextView)findViewById(R.id.temp2); currentDateText=(TextView)findViewById(R.id.current_date); switchCity=(Button)findViewById(R.id.switch_city); refreshWeather=(Button)findViewById(R.id.refresh_weather); StringcountyCode=getIntent().getStringExtra("county_code"); if(!TextUtils.isEmpty(countyCode)){//由县级代号去查询天气 publishText.setText("同步中..."); weatherInfoLayout.setVisibility(View.INVISIBLE); cityNameText.setVisibility(View.INVISIBLE); queryWeatherCode(countyCode); }else{//没有县级代号就直接显示本地天气 showWeather(); } } privatevoidinitEvents(){

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论