android天气预报报告

合集下载

Android 天气预报简介

Android 天气预报简介

Android 谷歌天气预报该项目是东方标准广州java培训中心为java技术开发学习人员和android技术开发班的学员共同开发研制的一款生活助手软件《谷歌天气预报》。

项目来自于日常生活中天气预报新闻。

由于人们日益紧凑的生活节奏,对于天气的关注不如以前那么重要,所以为了节省人们的业余时间,直接将天气预报功能搬入了手机软件功能当中,方便人们阅读浏览当地天气情况,并适当做出生活调整。

该项目技术要点为:推送功能+后台服务设计Service+联网功能HTTP+xml解析器XmlPullParser等技术。

一.项目介绍《谷歌天气预报》是一款简单的天气预报定制软件。

界面简洁易懂,方便用户使用。

可以查询几大城市的天气预报情况,主要功能有天气预告、城市温度、湿度、未来几天天气预测等。

该软件使用起来非常方便。

只要输入所查看的城市,软件自动提供当地的天气情况,以供查询。

二.For personal use only in study and research; not for commercial use三.四.功能说明1、进入软件页面2、功能说明1)、【天气】功能:显示当前天气情况。

资料来自于互联网真实天气预报。

2)、【城市】功能:显示当前所在城市。

3)、【温度】功能:显示选择城市天气温度变化。

资料来自互联网真实天气温度预告。

4)、【湿度】功能:显示当地城市湿度5)、【天气预测】功能:预测未来几天的天气状况。

可以预测未来三天以内的天气资料。

6)、【更新日期】功能: 显示当前天气日期。

五.程序设计技术说明本程序主要使用Service服务。

Android开发中,当需要创建在后台运行的程序的时候,就要使用到Service。

Service 可以分为有无限生命和有限生命两种。

特别需要注意的是Service跟Activities是不同的(简单来说可以理解为后台与前台的区别),例如,如果需要使用Service的话,需要调用startService(),从而利用 startService()去调用Service中的OnCreate()和onStart()方法来启动一个后台的Service。

安卓天气预报查询app实验报告

安卓天气预报查询app实验报告

课程设计报告课程名称: 移动平台开发设计题目:天气预报院系:计算机科学与工程学院专业:计算机科学与技术班级:学号:姓名:指导教师:孙霞设计地点: N6-113开课时间: 2016 至 2017 学年第 1 学期目录1. 引言 ........................................................... 错误!未定义书签。

. 题目描述 ................................................... 错误!未定义书签。

. 设计意义 ................................................... 错误!未定义书签。

2. 开发环境 ....................................................... 错误!未定义书签。

. 硬件环境 ................................................... 错误!未定义书签。

. 软件环境 ................................................... 错误!未定义书签。

3. 相关技术及知识点................................................ 错误!未定义书签。

. Activity ................................................... 错误!未定义书签。

. Service .................................................... 错误!未定义书签。

. 网络通信 ................................................... 错误!未定义书签。

4. 需求分析 ....................................................... 错误!未定义书签。

基于Android的-知天气-数据主动监控系统设计与实现的研究报告

基于Android的-知天气-数据主动监控系统设计与实现的研究报告

基于Android的-知天气-数据主动监控系统设计与实现的研究报告随着气候变化和天气的不稳定性越来越严重,天气预报对于人们的生活和生产已经越来越重要。

为了更好地预防气象灾害和保障人们的安全,掌握天气变化信息非常必要。

本研究提出了一种基于Android的-知天气-数据主动监控系统设计与实现的方案,以提高人们在天气预报方面的准确性和效率。

一、系统设计本系统的设计采用三层架构,即用户层、业务逻辑层和数据访问层。

系统结构图如下所示:用户层主要包含用户界面设计和交互逻辑。

用户可以通过界面查询当前天气情况、未来几天的天气预报、空气质量和生活指数。

用户还可以设置关注城市和天气预警。

业务逻辑层主要包括通过API获取天气数据、对数据进行处理和分析、生成预报报告和预警信息等。

此外,还需要对用户关注的城市进行监测,主动推送相关信息。

数据访问层主要负责天气数据的查询和操作。

本系统采用第三方API进行数据获取,同时也会将用户关注城市的天气数据保存在本地数据库中。

二、系统实现本系统采用Android Studio进行开发,使用了第三方API进行数据获取和展示。

用户可以通过应用程序主界面轻易地查询到当前定位城市的天气情况,也可以通过搜索功能添加/删除想要关注的城市。

同时,本系统还加入了推送功能,当用户关注的城市出现重要天气变化时,会主动推送相关信息。

此外,在预警信息方面,本系统同样可以通过API获取和展示。

除此之外,为了更好地保证用户体验,本系统还加入了各种便捷功能,包括天气预报分享、天气预报动态壁纸、生活指数查询等等。

三、总结通过本研究,我们提出了一种基于Android的-知天气-数据主动监控系统设计与实现的方案,通过该方案实现了定位查询城市实时天气、搜索添加关注城市、主动推送关注城市天气变化、预警信息展示等功能,大大提高了人们在天气预报方面的准确性和效率。

在今后的应用和推广中,我们还需不断完善和更新,以及优化系统的性能和稳定性。

Android天气预报系统文档

Android天气预报系统文档

[键入公司名称]实训课程设计天气预报程序xx2011/12/291项目任务概述1.1项目背景随着3G时代的到来,移动互联网成为Internet下一个热点,android可以很好的使用Internet,获取网站上的数据,android天气预报系统就利用这一方式为用户提供服务。

天气预报的主要功能是为用户提供今日以及未来两天的天气预报。

1.2 项目任务本项目实现在 Android移动设备天气预报功能,系统根据用户输入的地址,在Internet上请求获得该地址的天气情况,并发回数据,在系统调用该数据后,将天气实况显示给用户。

2需求分析用户可以使用该系统实现日记的编写,修改和删除,日记内容阅读以及以文本文档形式将日记导入SDcard中。

2.1总体用例图查看当日天气预报查看未来两天天气预报查看地理信息图12.2 天气预报用例图查看当日天气预报2.3天气预报业务流程输入地址选择列表item进入系统进入今日预报页面退出系统图2用户通过点击桌面图标,进入系统。

再通过在文本框中输入的地址,来进入当天天气预报界面。

再点击箭头按钮,页面跳转到未来两天天气预报的界面。

2.4 查看未来两天天气预报用例图2.5 查看未来两天天气预报流程图图22.6 查看地理信息用例图查看未来两天天气预报输入地址选择列表item点击按钮进入系统进入今日预报页面进入明日预报界面退出系统2.7查看地理信息流程图图33 系统设计3.1 天气预报系统UI——登录界面查看地理信息点击MENU 选择MENU 查看地理信息回到系统图43.2天气预报UI——登录界面说明在此界面中,正如大家所见。

含有两个TextView组件,一个ImageView组件,一个AutoCompleteTextView,其字符大小分别是默认的大小。

其中AutoCompleteTextView能够给用户提供选项列表,用户只要单击列表中的一项,此页面就回自动跳转到下一页面。

3.3 天气预报UI——今日天气预报界面图5 图63.4天气预报UI——今日天气预报界面说明此界面中分别含有六个TextView组件,五个ImageView组件,一个ImageButton 组件,一个Menu,在此布局文件中有五个相对布局。

“移动应用开发”实验报告---天气预报

“移动应用开发”实验报告---天气预报

“移动应用开发”实验报告1数据代码即运行结果截图一、整体架构、本次实验我分配的任务是查看某地区天气的活动代码编写和添加权限与注册的相关代码,具体的过程在下面:1、活动(Activity)整体结构2、设计界面(layout)整体结构二、数据代码本次作业(天气预报)的设计界面效果图如下:2接着需要编写遍历省市县的活动,即MainActivity。

代码如下:package com.example.chen.weatherforecast;import android.app.ProgressDialog;import android.content.Intent;import android.content.SharedPreferences;import android.preference.PreferenceManager;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.text.TextUtils;import android.view.View;import android.view.Window;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;3import java.util.ArrayList;import java.util.List;import DB.CoolWeatherDB;import model.City;import model.County;import model.Province;import unity.HttpCallbackLinster;import unity.HttpUtil;import util.Utility;public class MainActivity extends AppCompatActivity {public static final int LEVEL_PROVINCE = 0; //省级public static final int LEVEL_CITY = 1; //市级public static final int LEVEL_COUNTY = 2; //县级private ProgressDialog progressDialog;private ListView listView; //显示省市县的数据private TextView title_text; //标题内容private ArrayAdapter<String> adapter; //listView 的适配器private List<String> datalist = new ArrayList<String>();private List<Province> provinceList; //省列表private List<City> cityList; //市列表private List<County> countyList; //县列表private CoolWeatherDB coolWeatherDB;private Province selectProvince; //选中的省private City selectCity; //选中的市private int currentLevel; //选中的县private Boolean isFromWeatherActivity;@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);requestWindowFeature(Window.FEATURE_NO_TITLE);setContentView(yout.activity_main);isFromWeatherActivity =getIntent().getBooleanExtra("from_weather_activity",false);SharedPreferences pref =PreferenceManager.getDefaultSharedPreferences(MainActivity.this);if(pref.getBoolean("city_cheeked",false)&& !isFromWeatherActivity ) { Intent intent = new Intent(this,LookWeather.class);startActivity(intent);finish();4} listView = (ListView)findViewById(R.id.list_view);title_text = (TextView)findViewById(R.id.title_text);adapter = newArrayAdapter<String>(MainActivity.this,yout.simple_list_item_1, datalist);listView.setAdapter(adapter);coolWeatherDB = CoolWeatherDB.getInstance(this);listView.setOnItemClickListener(newAdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> parent, View view, int position, long id) {if(currentLevel == LEVEL_PROVINCE) {selectProvince = provinceList.get(position);querCity(); //选中省,则查找该省的市} else if(currentLevel == LEVEL_CITY) {selectCity = cityList.get(position);querCounty(); //选中市,则查找该市的县} else if(currentLevel == LEVEL_COUNTY) //选中县,则查找该县所对应的天气{String countyCode = countyList.get(position).getCountycode();Intent intent = new Intent(MainActivity.this,LookWeather.class); intent.putExtra("county_code",countyCode);startActivity(intent);finish();} } });querProvince();} //查找省,如果在数据库中没有找到,则在服务器上找private void querProvince() {provinceList = coolWeatherDB.loadProvince();if(provinceList.size() > 0) {datalist.clear();for(Province province : provinceList) {datalist.add(province.getProvinceName());}adapter.notifyDataSetChanged();listView.setSelection(0);title_text.setText("中国");currentLevel = LEVEL_PROVINCE;} else{ //在服务器上查找5querfromServer(null, "province");} } //查找市,如果在数据库中没有找到,则在服务器上找private void querCity() {cityList = coolWeatherDB.loadCity(selectProvince.getId());if(cityList.size() > 0) {datalist.clear();for(City city : cityList) {datalist.add(city.getCityName());}adapter.notifyDataSetChanged();listView.setSelection(0);title_text.setText(selectProvince.getProvinceName());currentLevel = LEVEL_CITY;} else{ querfromServer(selectProvince.getProvinceCode(),"city");} } //查找县,如果在数据库中没有找到,则在服务器上找private void querCounty() {countyList = coolWeatherDB.loadCounty(selectCity.getId());if(countyList.size() > 0) {datalist.clear();for(County county : countyList) {datalist.add(county.getCountyName());} adapter.notifyDataSetChanged();listView.setSelection(0);title_text.setText(selectCity.getCityName());currentLevel = LEVEL_COUNTY;} else{ querfromServer(selectCity.getCityCode(),"county");} } //根据传入的代号和类型在服务器上查找数据private void querfromServer(final String code,final String type){ String address;if(!TextUtils.isEmpty(code)) { address ="/data/list3/city" + code +".xml";} else{ address = "/data/list3/city.xml";} showProgressDialog();HttpUtil.sendRequstWithURLConnection(address, newHttpCallbackLinster() {@Overridepublic void onFinish(String response) { boolean result = false;if ("province".equals(type)) { result =Utility.handleProvince(coolWeatherDB, response);6} else if ("city".equals(type)) { result =Utility.handleCity(coolWeatherDB, response, selectProvince.getId());} else if ("county".equals(type)) { result =Utility.handleCounty(coolWeatherDB, response, selectCity.getId());} if (result) { runOnUiThread(new Runnable() { @Overridepublic void run() { closeProgressDialog();if ("province".equals(type)) { querProvince();} else if ("city".equals(type)) { querCity();} else if ("county".equals(type)) { querCounty();} } });} } public void onError(Exception e) { runOnUiThread(new Runnable() { @Overridepublic void run() { closeProgressDialog();Toast.makeText(MainActivity.this,"加载失败",Toast.LENGTH_SHORT).show();} });} });} private void showProgressDialog() { if(progressDialog == null){ progressDialog = new ProgressDialog(MainActivity.this);progressDialog.setMessage("正在加载...");progressDialog.setCanceledOnTouchOutside(false);} progressDialog.show();} private void closeProgressDialog() {if(progressDialog != null) {progressDialog.dismiss();} } //捕获返回键,来判断此时应直接返回省,市列表还是返回到显示天气的页面public void onBackPressed() {if(currentLevel == LEVEL_COUNTY) {querCity();}else if(currentLevel == LEVEL_CITY) {querProvince();}else { if (isFromWeatherActivity) {Intent intent = new Intent(MainActivity.this, LookWeather.class); startActivity(intent);} finish();} } }还要加上权限声明和注册Activity,即AndroidManifest.xml的代码:7<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="/apk/res/android"package="com.example.chen.weatherforecast"><uses-permission android:name="android.permission.INTERNET"/><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activity android:name=".MainActivity"><intent-filter><action android:name="android.intent.action.MAIN" /><category android:name="UNCHER" /> </intent-filter></activity><activity android:name=".LookWeather"> </activity></application></manifest>2、获取省、市、县的天气数据在Utility类中添加解析JSON数据与处理。

基于Android的天气预报APP的设计与实现

基于Android的天气预报APP的设计与实现

基于Android的天气预报APP的设计与实现基于Android的天气预报APP的设计与实现一、引言现如今,移动互联网的普及使得手机成为人们生活中不可或缺的工具之一。

天气预报是手机上常用的功能之一,能够提供精准的天气信息,帮助人们合理安排出行和生活。

因此,基于Android的天气预报APP的设计与实现变得尤为重要。

二、功能需求分析在设计与实现之前,首先对天气预报APP的功能需求进行分析。

根据用户的需求,天气预报APP的主要功能如下:1. 实时天气查询:用户可以随时随地查询当前所在位置的实时天气信息,包括温度、风速、湿度等。

2. 天气预报功能:用户可以查看未来几天的天气预报,包括温度变化趋势、天气状况等,帮助用户进行合理的出行计划。

3. 城市切换功能:用户可以切换不同城市进行天气查询,方便用户查看其他地区的天气情况。

4. 生活指数推荐:根据天气情况,推荐用户合适的衣着、环境指数等生活建议,提供更好的生活体验。

5. 天气提醒功能:用户可以设置天气提醒,当天气状况达到所设阈值时,APP会发送通知提醒用户。

6. 数据更新功能:APP需要提供数据更新的功能,保持天气数据的及时性与准确性。

三、系统设计在系统设计阶段,需要考虑系统的整体架构以及各个模块的设计。

1. 系统架构设计基于Android平台的天气预报APP的系统架构如下:(1) 用户界面层:这是用户与APP进行交互的界面层,用户可以通过界面层进行数据的输入与输出。

(2) 业务逻辑层:这是处理业务逻辑的层,包括天气数据的获取、数据展示、天气提醒的设置等功能。

(3) 数据访问层:这是与后台数据进行交互的层,负责获取实时天气数据和天气预报数据。

(4) 后台数据层:这是存储实时天气数据和天气预报数据的后台数据库。

2. 模块设计(1) 用户界面设计:根据功能需求,设计用户友好的界面,包括实时天气显示界面、预报天气显示界面、城市切换界面等。

(2) 数据获取与处理模块设计:该模块负责向后台数据层请求天气数据,并对数据进行处理,提供给用户界面层显示。

android 天气预报功能详解

android 天气预报功能详解

通过google接口在Android中实现天气预报效果Android可以通过google实现获取指定经纬度位置或者某一个城市的天气信息。

如果是根据经纬度查询天气信息,需要对精度为进行转换,例如lat值为31.174165,需要过滤掉小数点,变为31174165传到接口中,维度也一样处理,处理后传给/ig/api?weather=,,,31174165,121433841既可以获取数据。

这里要注意一个问题,如果大家获取的经纬度序列很长,直接去掉小数点,有时候也无法获取天气信息,例如40.478224838152528,124.97828006744385,去掉小数点后,传到参数位置,无法获取值,需要大家将经纬度按下面方式转换一下,只取小数点后6位就可以了。

int latI = (int) (lat * 1E6);int lonI = (int) (lon * 1E6);下面的例子演示了根据输入城市,获取该城市的天气预报,Weather.java的61行,是根据经纬度获取天气信息。

工程结构:Weather.java类package com.AndroidWeather;import java.io.InputStream;import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;import org.apache.http.HttpEntity;import org.apache.http.HttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.client.methods.HttpUriRequest; import org.apache.http.impl.client.DefaultHttpClient; import org.apache.http.util.EntityUtils;import org.w3c.dom.Document;import org.w3c.dom.NodeList;import org.xml.sax.InputSource;import android.app.Activity;import android.graphics.Bitmap;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.util.Log;import android.view.View;import android.widget.Button;import android.widget.EditText;import android.widget.ImageView;import android.widget.TextView;public class Weather extends Activity {public EditText ETplace;public TextView TvPlace;public Button query;public TextView placeName;public ImageView imView;/** Called when the activity is first created. */@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(yout.main1);ETplace = (EditText) findViewById(R.id.place);query = (Button) findViewById(R.id.query);imView = (ImageView) findViewById(R.id.myImageView);placeName = (TextView) findViewById(Place);query.setOnClickListener(new Button.OnClickListener() { public void onClick(View v) {try {TvPlace = (TextView) findViewById(Place); // String place = ETplace.getText().toString();String place =CntoSpell.getFullSpell(ETplace.getText().toString());placeName.setText(place);String weather = "";// String url = "/ig/api?&weather=" // + place;String url ="/ig/api?weather=,,,31174165,121433841";DefaultHttpClient client = new DefaultHttpClient();HttpUriRequest req = new HttpGet(url);HttpResponse resp = client.execute(req);// String strResult =// EntityUtils.toString(resp.getEntity());// Log.i("weather->", strResult);// 一华氏度等于9/5摄氏度数值+32HttpEntity ent = resp.getEntity();InputStream stream = ent.getContent();DocumentBuilder b =DocumentBuilderFactory.newInstance().newDocumentBuilder();Document d = b.parse(new InputSource(stream));NodeList n =d.getElementsByTagName("forecast_conditions");// 获得图片url 当天的。

基于Android平台的天气预报系统设计

基于Android平台的天气预报系统设计

基于Android平台的天气预报系统设计基于Android平台的天气预报系统设计一、引言随着移动互联网的快速发展,人们对于天气预报的需求也越来越高。

天气预报系统成为了人们日常生活中不可或缺的一部分,通过天气预报系统,人们可以方便地获取准确的天气信息,从而做好相应的准备。

近年来,基于Android平台的天气预报系统开始受到人们的关注和使用。

本文旨在探讨基于Android平台的天气预报系统的设计。

二、系统需求分析1.功能需求(1)实时天气查询:用户可以根据所在位置或者指定地点查询实时天气情况;(2)未来天气预测:用户可以查看未来一周内的天气预测,包括温度、湿度、风力等信息;(3)城市切换:用户可以切换不同城市的天气信息;(4)气象预警:系统可以及时推送气象预警信息给用户,以便用户做好相应的应对措施;(5)天气统计:系统可以对历史天气数据进行统计分析,提供数据可视化展示。

2.性能需求(1)响应时间:系统应能够及时响应用户的查询请求,并在短时间内返回准确的结果;(2)稳定性:系统应具备稳定的运行性能,能够长时间运行而不产生崩溃等故障;(3)界面友好:系统的界面设计应符合用户的使用习惯,易于操作;(4)数据准确性:系统提供的天气数据应准确可靠,能够及时更新。

三、系统设计1.前端设计(1)用户界面:系统提供一个简洁、直观的用户界面,采用现代化的UI设计风格,用户可以通过界面进行各种操作;(2)实时天气查询:在主界面上提供实时天气查询功能,用户可以输入所在位置或者选择城市进行查询;(3)未来天气预测:用户在查询完实时天气后,可滑动屏幕或点击按钮查看未来一周内的天气预测;(4)城市切换:用户可以在设置中切换不同城市,系统会根据城市来更新天气数据;(5)气象预警:系统可在主界面上以弹窗或通知的形式提醒用户气象预警信息;(6)天气统计:用户可以在设置中查看历史天气数据的统计信息(如最高温度、最低温度、降雨量等),系统通过图表等方式展示数据。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

Android天气预报论文学院: 电子信息工程学院专业: 计算机应用学号: 11033801135学生姓名: 郎红指导教师: 黄炜日期: 2013年11月13一、项目背景现有的3G技术和移动互联网技术的快速发展,智能手机功能的不断增强,让基于Android平台的查询需求越来越多。

本软件就是利用现有的网络快速获取网络上的天气信息并显示到手机终端上,为用户提供实时的天气查询和近期天气查询服务,为工作、出行等带来便利。

通过Web Service等技术让用户体验到前所未有的移动计算。

二、需求分析(一)功能需求在这个综合示例中,有一个显示天气情况的用户界面,可以通过图片和文字显示当前和未来几天的天气状况,包括温度、湿度、风向和雨雪情况等。

这些天气数据是通过后台服务获取的,这个后台服务按照一定时间间隔,从搜索引擎上获取天气预报信息,并将天气信息保存在后台服务中。

示例还需要提供基于SMS短信的天气数据服务,其他手机用户可以向本示例所在的手机上发送SMS短信,在短信中包含特定的关键字,则可以将已有的天气情况通过SMS短信回复给用户。

最后,每个被发送的SMS短信都会被记录下来,用户可以浏览或删除这些记录信息。

(二)界面需求从上面的描述中可以基本了解软件的功能需求,但为了将需求分析过程变得简单明了,首先找出用户界面上需要显示的内容。

功能描述中有“显示天气情况的用户界面”和“用户可以浏览或删除这些记录信息”,除此以外,一般应用软件还应有显示配置信息的界面。

因此,本示例应该包含三个用户界面:显示天气预报的用户界面、显示已发送SMS短信的用户界面、浏览和设置配置信息的用户界面(三)内部功能从用户界面出发,分析隐藏在界面后面的内部功能,这些功能则是程序正常运行的基础(1)显示天气预报的用户界面;①获取搜索引擎的天气数据②保存天气数据信息(2)显示SMS短信的用户界面①根据关键字监视SMS短信②发送包含天气信息的SMS短信③将发送SMS短信的相关信息写入数据库(3)浏览和设置配置信息的用户界面①将用户设置的配置信息保存到数据库②启动时读取数据库中的配置信息③支持恢复缺省设置三、程序设计(一)用户界面设计根据需求中的用户界面分析,应用程序应包含三个主要的用户界面,每个用户界面的显示内容在“显示天气预报的用户界面”中,显示目标城市的当前的天气状况,包括城市名称、温度、湿度、风向、雨雪情况和获取数据时间等信息。

在界面的下方显示未来四天的天气状况,但仅包括温度和雨雪情况在“显示已发送SMS短信的用户界面”中,显示每个回复短信的时间、目标手机号码、城市名称、当天的天气状况和未来一天的天气状况在“浏览和设置配置信息的用户界面”中,显示希望获取天气预报的城市名称、获取数据的频率和短信监视的关键字,并允许用户设置是否提供短信服务,以及是否记录回复短信信息用户界面草图:(二)数据库设计本示例主要有两种数据需要存储配置信息:因为配置信息的数据量很小,从Android支持的存储方式上分析,可以保存在SharedPreference、文件或SQLite数据库中SMS短信服务信息: SMS短信服务信息是一个随着时间推移而不断增加的数据,属于文本信息,而且有固定的格式,因此适合使用SQLite数据库进行存储综合分析这两个需要存储的数据,选择SQLite数据库作为存储数据的方法(1)配置信息:配置信息中主要保存目标城市的名称,访问搜索引擎更新天气信息的频率,请求天气信息服务短信的关键字,以及是否提供短信服务和是否记录短信服务内容,配置信息的数据库表结构(2)SMS短信服务信息:SMS短信服务信息主要保存请求天气服务短信的发送者、短信内容、接收时间和回复信息的内容,SMS短信服务信息的数据库表结构(三)程序设计程序模块设计:从功能需求上分析,可以将整个应用程序划分为4个模块,分别是用户界面、后台服务、数据库适配器和短信监听器。

下图是模块结构图从模块结构图中不难看出,后台服务是整个应用程序的核心,主要包含数据获取子模块和短信服务子模块。

数据获取子模块负责周期性的从搜索引擎获取天气信息;短信服务子模块则负责处理接收到的服务请求短信,并发送包含天气信息的短信。

后台服务由用户界面通过Intent启动,启动后的后台服务可以在用户界面关闭后仍然保持运行状态,直到用户通过用户界面发送Intent停止服务,或系统因资源不足而强行关闭服务。

用户界面从后台服务获取天气信息,而没有直接通过网络访问搜索引擎的天气数据。

一方面是因为后台服务使用了工作线程,通过后台服务获取天气数据可以避免因网络通信不畅造成界面失去响应。

另一方面,在用户关闭界面后,后台服务仍然需要更新天气信息,以保证短信服务数据的准确性。

用户界面通过直接调用数据库适配器,向SQLite数据库中读写配置信息,或对SMS短信服务信息进行操作。

短信监听器是一个BroadcastReceiver,监视所有接收到的短信。

如果短信中包含用户自定义的关键字,短信监听器则会认为这条短信是天气服务请求短信,将短信的相关信息写入后台服务的短信服务队列。

如果用户在配置信息中选择无需提供短信服务,短信监听器仍然继续监听所有短信,只是后台服务不再允许将服务请求短信写入服务队列。

数据库适配器封装了所有对SQLite数据库操作的方法,用户界面和后台服务会调用它实现数据库操作。

四、项目功能描述(一)系统主要功能本软件要完成在android手机上实现天气的即时预报。

所涉及的功能有:1.启动程序后可以进行城市、更新频率的设置;2.可以通过图片和文字显示当前和未来的天气状况,包括温度、湿度、风向和雨雪情况等。

使用效果图实现与相应天气的结合。

3.这些天气数据是通过后台服务获取的,这个后台服务可以按照一定的时间间隔,通过搜索引擎提供的公共接口获取天气预报信息,并将天气信息保存在本地数据库中。

(二) 工程结构在程序开发阶段,首先确定“天气预报软件”的工程名称为WeatherDemo,包名称为edu.hrbeu.WeatherDemo。

然后根据程序模块设计的内容,建立WeatherDemo示例,WeatherDemo示例源代码的文件结构:为了使源代码文件的结构更加清晰,WeatherDemo示例设置了多个命名空间中,分别用来保存用户界面、数据库、后台服务、SMS短信和天气数据的源代码文件,WeatherDemo 示例的命名空间WeatherDemo示例将不同用途的源代码文件放置在不同的命名空间中。

WeatherDemo示例的文件用途说明Android资源文件保存在/res的子目录中。

/res/drawable目录中保存的是图像文件,/res/layout目录中保存的是布局文件,/res/values目录中保存的是用来定义字符串和颜色的文件,/res/xml目录保存的是XML格式的数据文件。

所有在程序开发阶段可以被调用的资源都保存在这些目录中,资源文件名称与用途:(三)数据库适配器数据库适配器是最底层的模块,主要用于封装用户界面和后台服务对SQLite数据库的操作。

数据库适配器的核心代码主要在DBAdapter.java文件中用户保存配置信息的类文件Config.javaConfig.java文件的全部代码如下:1 package edu.hrbeu.WeatherDemo.DB;23 public class Config {4 public static String CityName;5 public static String RefreshSpeed;6 public static String ProvideSmsService;7 public static String SaveSmsInfo;8 public static String KeyWord;910 public static void LoadDefaultConfig(){11 CityName = "New York";12 RefreshSpeed = "60";13 ProvideSmsService = "true";14 SaveSmsInfo = "true";15 KeyWord = "NY";16 }17 }从代码中不难看出,公有静态属性CityName、RefreshSpeed、ProvideSmsService、SaveSmsInfo和KeyWord,完全对应数据库中保存配置信息表的属性(参照表12.1)。

在程序启动后,保存在数据库中的城市名称、更新频率、是否提供短信服务、是否保存短信信息和关键字等内容,将被读取到这个Config类中,供其它模块做逻辑判断时使用。

代码第10行的LoadDefaultConfig()函数,保存了程序内置的配置参数此函数会在两个情况下被调用,用户主动选择“恢复缺省设置”;首次启动程序时,用来初始化保存配置参数的数据库,DBAdapter类与以往介绍过的数据库适配器类相似,都具有继承SQLiteOpenHelper的帮助类DBOpenHelper 。

DBOpenHelper在建立数据库时,同时建立两个数据库表,并对保存配置信息的表进行了初始化。

在DBAdapter类中,用户界面会调用SaveConfig()和LoadConfig(),从SQLite数据库中保存和读取配置信息。

保存配置信息时,SaveConfig()函数会将Config类中的公有静态属性写入数据库;反之,LoadConfig()会将数据库中的配置信息写入Config类中的公有静态属性。

另一个会调用DBAdapter类的是后台服务,即WeatherService类。

后台服务主要调用SaveOneSms(SimpleSms sms)、DeleteAllSms()和GetAllSms()函数,分别用来保存SMS短信记录、删除所有SMS数据记录和获取所有SMS数据记录。

在GetAllSms()函数中,调用了一个私有函数ToSimpleSms(Cursor cursor),用来将从数据库获取的数据转换为SimpleSms实例数组。

(四)短信监听器短信监听器本质上是BroadcastReceiver,用于监听Android系统所接收到的所有SMS 短消息,可以在应用程序关闭后仍然继续运行,核心代码在SmsReceiver.java文件中。

在介绍SmsReceiver类前,先说明用来保存SMS短信内容和相关信息的SimpleSms类。

android.telephony.SmsMessage是Android提供的短信类,但这里需要一个更精简、小巧的类,保存少量的信息,因此构造了SimpleSms类,仅用来保存短信的发送者、内容、接收时间和返回结果。

相关文档
最新文档