Android程序设计课程设计单
学号 |
|
姓名 |
|
性别 |
|
||
指导教师 |
|
||||||
项目名称 |
Android |
||||||
项目描述 |
方便查询某地的天气情况,便于外出时提前做好规划。 |
||||||
项目评语 |
|
||||||
分项成绩 |
平时成绩 |
实践能力 |
设计报告 |
||||
|
|
|
|||||
总成绩 |
|
等级 |
|
目 录
第一章 概述
第二章 需求分析
2.1 项目背景
2.2 项目需求 4
第三章 相关技术
3.1 Adnroid平台介绍
3.2 关键技术研究
第四章 概要设计
4.1 系统体系结构
4.2 用户界面设计
4.2.1用户欢迎界面
4.2.2天气情况主界面
4.2.3城市管理界面界面
第五章 详细设计
5.1app打开的欢迎界面
5.2天气预报的主界面
5.3 天气信息的一些数据调用
5.4 更多界面的一些设置
5.5数据存储及数据库
第六章 结论
第一章 概述
随着移动应用的蓬勃发展,移动设备(如智能手机和平板电脑)越来越受欢迎,无线带宽的增加导致成本持续下降。在此前提下,移动设备开发技术已经能够在各大高校中成功的应用。基于移动设备技术的应用的最新成果可以为学校师生在学习和生活中提供信息交互、共享资源、远程教育等便利。信息技术能够指导学校的教学理念和信息发展思路并进一步推进学校的教学、科研、管理等工作,形成多元化、人性化、智能化的信息服务环境,能够真正支撑学校教育事业,提高教师的教学质量和工作效率。移动手机应用是一种新的移动学习环境模式,可以有效的改善教学环境。开发优质资源,开发教学方法,开放学习环境,会是一种有益而积极的尝试。
每次出行都要受到天气的影响,天气预报的好处:
1.天气时刻伴随着我们的生活,应用天气预报可以及时了解天气的趋势,给人们的工作、出行、旅游、化妆、洗车、运动生活等带来乐趣和便利。
2.天气变化,让你提前防范,增减衣物和雨伞等
3.以为未来的事情做安排和打算啊,比如明天旅游,明天出行。大的作用就可以预防经济损失,比如暴风,台风等!更大的可以为战争作准备
本课题要求:设计一个基于Android的天气预报的软件。
需重点研究的关键问题:计时器的控制和使用。
第二章 需求分析
2.1 项目背景
天气预报的主要内容是一bai个地区或城市未来一段时期内的阴晴雨雪、最高最低气温、风向和风力及特殊的灾害性天气。就中国而言,气象台准确预报寒潮、台风、暴雨等自然灾害出现的位置和强度,就可以直接为工农业生产和群众生活服务。
天气预报是根据气象观测资料,应用天气学、动力气象学、统计学的原理和方法,对某区域或某地点未来一定时段的天气状况作出定性或定量的预测。它是大气科学研究的一个重要目标。对人们生活有重要意义。
如今人们外出,只须收听或观看天气预报,就可以决定是否带雨具,而在过去,则要顾虑天气情况。那么,气象台每天最重要的工作——天气预报是怎样诞生的呢。
公元前650年左右巴比伦人使用云的样子来预测天气。公元前340年左右亚里士多德在他的《天象论》中描写了不同的天气状态。中国人至少在公元前300年左右有进行天气预报的纪录。古代天气预报主要是依靠一定的天气现象,比如人们观察到晚霞之后往往有好天气。这样的观察积累多了形成了天气谚语。不过许多这些谚语后来被证明是不正确的。
从17世纪开始科学家开始使用科学仪器(比如气压表)来测量天气状态,并使用这些数据来做天气预报。但很长时间里人们只能使用当地的气象数据来做天气预报,因为当时人们无法快速地将数据传递到远处。1837年电报被发明后人们才能够使用大面积的气象数据来做天气预报。
20世纪气象学发展迅速。人类对大气过程的了解也越来越明确。1970年代数字天气预测随电脑硬件发展出现并且发展迅速,今天成为天气预报最主要的方式。1853~1856年,为争夺巴尔干半岛,沙皇俄国同英法两国爆发了克里木战争,结果沙俄战败,正是这次战争,导致了天气预报的出现。
这是一场规模巨大的海战,1854年11月14日,当双方在欧洲的黑海展开激战时,风暴突然降临,且最大风速超过每秒30米,海上掀起了万丈狂澜,使英法舰队险些全军覆没。事后,英法联军仍然心有余悸,法军作战部要求法国巴黎天文台台长勒佛里埃仔细研究这次风暴的来龙去脉。那时还没有电话,勒佛里埃只有写信给各国的天文、气象工作者,向他们收集1854年11月12~16日5天内当地的天气情报。他一共收到250封回信。勒佛里埃根据这些资料,经过认真分析、推理和判断,查明黑海风暴来自茫茫的大西洋,自西向东横扫欧洲,出事前两天,即1854年11月12日和1854年13日,欧洲西部的西班牙和法国已先后受到它的影响。勒佛里埃望着天空飘忽不定的云层,陷入了沉思:“这次风暴从表面上看来得突然,实际上它有一个发展移动的过程。电报已经发明了,如果当时欧洲大西洋沿岸一带设有气象站,及时把风暴的情况电告英法舰队,不就可避免惨重的损失吗?”于是,1855年3月16日,勒佛里埃在法国科学院作报告说,假如组织气象站网,用电报迅速把观测资料集中到一个地方,分析绘制成天气图,就有可能推断出未来风暴的运行路径。勒佛里埃的独特设想,在法国乃至世界各地引起了强烈反响。人们深刻认识到,准确预测天气,不仅有利于行军作战,而且对工农业生产和日常生活都有极大的好处。由于社会上各方面的需要,在勒佛里埃的积极推动下,1856年,法国成立了世界上第一个正规的天气预报服务系统。
天气预报的诞生历史说明,气象条件可以影响局部战争或战役的胜败,而由于战争的需要,又推动和发展了气象事业。
2.2 项目需求
天气预报的起源:
天气预报最早起源于英国。1851年,英国首先通过电报传送观测资料,绘制成地面天气图,并根据天气图制作天气预报。
天气预报的发展:
20世纪20年代开始,气团学说和极锋理论先后被应用在天气预报中。30年代,天气演变的分析从二维发展到了三维。40年代后期,天气雷达的运用,为降水以及台风、暴雨、强风暴等灾害性天气的预报,提供了有效的工具。
根据需求,符合用户的实际要求,系统应实现以下功能:城市的当天天气情况,未来三天的天气情况,所添加城市的信息,管理已添加城市的界面,以及app的分析和背景替换,可以更好的让我们知道城市的天气信息。
学习打开APP的基本控制可以用下图来进行一个说明:
如图2-1所示:
图2-1 学习打卡APP的基本控制
第三章 相关技术
3.1 Adnroid平台介绍
Android 系统是建立在 Linux 系统之上,现阶段其主要的使用对象为便携设备。在我国通常为称为“安卓”。2003 年十月,Android 团队是由 Andy Rubin 等人组成,很快这个基于 Linux核心的系统走入了 Google 公司的视野,在这个团队成立 22 月之后,于 2005年 8 月 Google 公司低价收购了这个团队。于 2007 年 11 月 5 日,向正式向世人展示了安卓系统,并且当天 Google 公司宣布成立了一个由 34 家手机制造厂商、芯片制造厂商以及软件开发商和电信运营商组成的全球性的联盟组织,与此同时与 84 家硬件制造商以及电信运营商组成了开放手持设备联盟,其存在的目的是共同改良以及研发 Android 系统,Google 公司以 Apache 免费开源许可证的授权方式公布了 Android 的源代码。随后在平板电脑等其他领域也开始使用Android 系统。目前,Android 系统已经存在于我们生活的各个角落,比如平板电脑、家用卡拉 OK、智能电视、车载资讯系统等。推出仅仅两年多的 Android系统与 2010 年末所拥有的市场占有率已经超过了 Nokia 公司开发的 Symbian系统,而后者霸占了市场占有率头号交椅达十年之久,这个足以看出 Android系统的受欢迎程度。
图 3-1 为安卓的系统架构图,可以说 Android 系统是由 Linux Kernel 与Google Framework组成的,如果从系统的架构角度来对 Android 系统进行分析的话,Android 系统仅仅是谷歌公司提供的一套 Framework,而 Framework 是工作在 Linux这套系统上的。谷歌公司这样做是有原因的,因为将 Framework工作在 Linux 上是有好处的,众所周知 Linux 系统的核心是由来自全球的软件高手共同开发以及维护的。这对谷歌公司来说,仅仅安心负责 Framework 部分的研发就可以了,这样的话剩下了很多负责系统核心维护以及研发的人员。
图3-1 安卓系统架构
3.2 关键技术研究
在安卓系统中,包含有四个基本组件,其中组件 Activity,Content Provider是可见的,而组件 Service 和 BroadcastReceiver 是不可见的,只会默默的在后台运行。
(1)Service
通过字面意思我们就可以知道 Service 是一种后代的服务程序,在通常情况下他是不会与用户有联系的,所以我们不需要对其设计一个可视化界面,只要它能够实现功能就可以了,他的任务是对可见的 Activity 以及一些数据源进行更新。而且它必须在 Android Manifest.xml 配置文件注册,只有这样才能实现其功能,为了实现这个,我们可以通过 startService()来实现启动一个 Service 的目的。
(2)Activity
在安卓系统中,程序的显示是依靠 Activity 实现的,需要通过 Views 来构建 UI 来达到显示信息的目的。我们经常把他做成一个用户的可视化界面。在安卓系统中的软件程序在一般情况下不是通过仅仅一个 Activity 组成的,而是需要多个才行。比如一个应用程序需要一个 Activity 来进行显示联系人,需要另外一个来编写信息,还需要一个来查看信息以及对应用程序进行修改。虽然一个程序应用了多个 Activity,但是每一个都是相对独立的。虽然单独每一个是独立的但是多个就可以组成了栈,我们将现在活跃的放在栈顶。对于安卓系
统来说每一个 Activity 的生命周期受到系统的制约。
(3)Broadcast Receiver
与 Service 类似,我们通过字面意思就知道 Broadcast Receiver 的作用为广播接收器,相比较处理组件级别系统响应的事件处理机制,Broadcast Receiver的处理对象为系统级别的,尤其是在通过 Intent 来启动一个程序组件的时候,我们可以通过广播事件处理机制来监听和响应。它是对事件驱动程序进行处理的理想方式。
(4)Content Provider
当我们需要进行数据的保存以及检索的时候,Content Provider 就可以发挥它的作用了,通过它我们可以实现程序间的数据互访,如果我们的权限足够高的话,我们可以比较方便的通过 Content Provider 访问很多数据,与此同时为了实现共享数据,我们也可以自己来定义Content Provider,这样也能实现访问功能。。
第四章 概要设计
4.1 系统体系结构
整个系统由四个界面组成,主要分为一个显示城市天气信息、一个所添加城市信息、一个管理城市的界面,以及一个更多界面,可以在其中查看版本,替换主题背景等。
4.2 用户界面设计
4.2.1用户欢迎界面
用户的打开APP后的界面如图4-1所示,标题栏是本计时器的名称,中间的时钟显示的是上次学习的总时长。时钟下方的日志显示的分别是序号,最后一次学习时长,总时长。下方有记录和暂停两个按钮。
图4-1 用户欢迎
4.2.2天气情况界面
图4-2 天气情况
4.2.3城市管理界面
图4-3 城市管理
第五章 详细设计
5.1app打开的欢迎界面
打开app一开始会出现一个欢迎界面,这个界面会自动存在1.5秒,然后自动进入主界面。其中的java码为:
相关代码如下所示:
package com.example.operation;
import android.annotation.SuppressLint;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import androidx.appcompat.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;
public class Welcome extends AppCompatActivity {
private EditText mEditSupplyNumber;
private Button mBtnSubmitSupplyNumber;
@SuppressLint(“HandlerLeak”)
private Handler mGoHomeHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
goHome();
super.handleMessage(msg);
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_welcome);
}
@Override
protected void onStart() {
super.onStart();
//在2秒后发送一个空信息通知handler
mGoHomeHandler.sendEmptyMessageDelayed(0, 1500);
}
private void goHome() {
//跳转到主界面
startActivity(new Intent(Welcome.this, MainActivity.class));
finish();
}
}
5.2天气预报的主界面
其中包含一些天气的跳转,一些点击事件的定义,以及固定的几个城市的名称和code代码,可以在数据库中添加这几个城市的信息,可以让用户每当打开app都可以看到这几个城市的天气信息。
相关代码如下所示:
package com.example.operation;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.viewpager.widget.ViewPager;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.text.TextUtils;
import android.util.Log;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import com.example.operation.city_manager.CityManagerActivity;
import com.example.operation.city_manager.CityManagerAdapter;
import com.example.operation.db.DBManger;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
ImageView addCityIv, moreIv;
LinearLayout pointLayout;
RelativeLayout outLayout;
ViewPager mainVp;
List<Fragment> fragmentList;
List<String> cityList;
List<ImageView> imgList;
private CityFragmentPagerAdapter adapter;
private SharedPreferences pref;
private int bgNum;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initUI();
}
private void initUI() {
addCityIv = findViewById(R.id.main_iv_add);
moreIv = findViewById(R.id.main_iv_more);
pointLayout = findViewById(R.id.main_layout_point);
outLayout=findViewById(R.id.main_out_layout);
exchangeBg();
mainVp = findViewById(R.id.main_vp);
addCityIv.setOnClickListener(this);
moreIv.setOnClickListener(this);
fragmentList = new ArrayList<>();
cityList = DBManger.queryALLCityName();//获取数据库包含的城市信息列表
imgList = new ArrayList<>();
if (cityList.size() == 0) {
DBManger.addCityInfo(“北京”,”101010100″);
DBManger.addCityInfo(“济南”,”101120101″);
DBManger.addCityInfo(“菏泽”,”101121001″);
DBManger.addCityInfo(“上海”,”101020100″);
DBManger.addCityInfo(“青岛”,”101120201″);
cityList.add(“北京”);
cityList.add(“济南”);
cityList.add(“菏泽”);
cityList.add(“上海”);
cityList.add(“青岛”);
}
try {
Intent intent = getIntent();
String city = intent.getStringExtra(“city”);
if (!cityList.contains(city)&&!TextUtils.isEmpty(city)) {
cityList.add(city);
}
}catch (Exception e){
Log.i(“animee”,”出错”);
}
initPager();
adapter = new CityFragmentPagerAdapter(getSupportFragmentManager(), fragmentList);
mainVp.setAdapter(adapter);
//创建小圆点指示器
initPoint();
//设置最后一个城市信息
mainVp.setCurrentItem(fragmentList.size() – 1);
//设置页面监听
setPagerListener();
}
public void exchangeBg(){
pref = getSharedPreferences(“bg_pref”, MODE_PRIVATE);
bgNum = pref.getInt(“bg”, 2);
switch (bgNum){
case 0:
outLayout.setBackgroundResource(R.drawable.dd);
break;
case 1:
outLayout.setBackgroundResource(R.drawable.dd2);
break;
case 2:
outLayout.setBackgroundResource(R.drawable.dd3);
break;
}
}
private void setPagerListener() {
/*设置监听事件*/
mainVp.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
for (int i =0;i<imgList.size();i++){
imgList.get(i).setImageResource(R.mipmap.a1);
}
imgList.get(position).setImageResource(R.mipmap.a2);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
}
private void initPoint() {
//创建小圆点Viewpager页面指示器函数
for (int i = 0; i < fragmentList.size(); i++) {
ImageView pIv = new ImageView(this);
pIv.setImageResource(R.mipmap.a1);
pIv.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT));
LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) pIv.getLayoutParams();
lp.setMargins(0, 0, 20, 0);
imgList.add(pIv);
pointLayout.addView(pIv);
}
imgList.get(imgList.size() – 1).setImageResource(R.mipmap.a2);
}
private void initPager() {
for (int i = 0; i < cityList.size(); i++) {
CityWeatherFragment cwFrag = new CityWeatherFragment();
Bundle bundle = new Bundle();
bundle.putString(“city”, cityList.get(i));
cwFrag.setArguments(bundle);
fragmentList.add(cwFrag);
}
}
@Override
public void onClick(View v) {
Intent intent = new Intent();
switch (v.getId()) {
case R.id.main_iv_add:
intent.setClass(this, CityManagerActivity.class);
break;
case R.id.main_iv_more:
intent.setClass(this, MoreActivity.class);
break;
}
startActivity(intent);
}
}
5.3 天气信息的一些数据调用
此页编码包括一些天气数据的网络接口调用,和网上一些gson数据的调用,也包括一些页面的跳转和点击事件。
相关代码如下所示:
package com.example.operation;
import android.app.AlertDialog;
import android.content.SharedPreferences;
import android.os.Bundle;
import androidx.fragment.app.Fragment;
import android.text.TextUtils;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.ScrollView;
import android.widget.TextView;
import com.example.operation.base.BaseFragment;
import com.example.operation.bean.WeatherBean;
import com.example.operation.db.DBManger;
import com.google.gson.Gson;
import com.squareup.picasso.Picasso;
import java.util.List;
import static android.content.ContentValues.TAG;
import static android.content.Context.MODE_PRIVATE;
/**
* A simple {@link Fragment} subclass.
*/
public class CityWeatherFragment extends BaseFragment implements View.OnClickListener {
TextView tempTv, cityTv, conditionTv, windTv, temRangeTv, dateTv, clothIndexTv, carIndexTv, coldIndexTv, sportIndexTv, raysIndexTv;
ImageView dayIv;
LinearLayout futureLayout;
ScrollView outLayout;
String ur11 = “http://t.weather.itboy.net/api/weather/city/”;
String city;
private String indexList;
private String indexList1;
private SharedPreferences pref;
private int bgNum;
private List<WeatherBean.DataBean.ForecastBean> forecast;
public void exchangeBg() {
pref = getActivity().getSharedPreferences(“bg_pref”, MODE_PRIVATE);
bgNum = pref.getInt(“bg”, 2);
switch (bgNum) {
case 0:
outLayout.setBackgroundResource(R.drawable.dd);
break;
case 1:
outLayout.setBackgroundResource(R.drawable.dd2);
break;
case 2:
outLayout.setBackgroundResource(R.drawable.dd3);
break;
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_city_weather, container, false);
initView(view);
exchangeBg();
Bundle bundle = getArguments();
String city = bundle.getString(“city”);
String cityCode = DBManger.queryInfoByCity(city);
String url = ur11 + cityCode;
System.out.println(“a url ” + url);
loadData(url);
return view;
}
public void onSuccess(String result) {
parseShowData(result);
//更新数据
/* int i = DBManger.updateInfoByCity(city,result);
if (i<=0){
//更新数据库失败,说明没有这条城市信息,增加这个城市记录
DBManger.addCityInfo(city,result);
}*/
}
@Override
public void one rror(Throwable ex, boolean isOnCallback) {
//数据库当中查找上一次信息显示在Fragment当中
String s = DBManger.queryInfoByCity(city);
if (!TextUtils.isEmpty(s)) {
parseShowData(s);
}
}
private void parseShowData(String result) {
//使用gson解析数据
WeatherBean weatherBean = new Gson().fromJson(result, WeatherBean.class);
WeatherBean.DataBean data = weatherBean.getData();
WeatherBean.CityInfoBean cityInfo = weatherBean.getCityInfo();
forecast = data.getForecast();
dateTv.setText(forecast.get(0).getYmd());
cityTv.setText(cityInfo.getCity());
windTv.setText(forecast.get(0).getFx());
temRangeTv.setText(forecast.get(0).getHigh());
coldIndexTv.setText(forecast.get(0).getType());
tempTv.setText(data.getWendu());
List<WeatherBean.DataBean.ForecastBean> futureList = data.getForecast();
futureList.remove(0);
for (int i =0;i<3;i++){
View itemView = LayoutInflater.from(getActivity()).inflate(R.layout.item_main_center, null);
itemView.setLayoutParams(new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,LinearLayout.LayoutParams.WRAP_CONTENT));
futureLayout.addView(itemView);
TextView idateTv = itemView.findViewById(R.id.item_center_tv_date);
TextView iconTv = itemView.findViewById(R.id.item_center_tv_con);
TextView itemprangeTv = itemView.findViewById(R.id.item_center_tv_tmp);
ImageView iIv = itemView.findViewById(R.id.item_center_tv_iv);
WeatherBean.DataBean.ForecastBean dateBean = futureList.get(i);
idateTv.setText(dateBean.getDate());
iconTv.setText(dateBean.getType());
itemprangeTv.setText(dateBean.getHigh());
}
}
private void initView(View view) {
//用于初始化控件操作
tempTv = view.findViewById(R.id.frag_tv_currenttemp);
cityTv = view.findViewById(R.id.frag_tv_city);
coldIndexTv = view.findViewById(R.id.frag_tv_condition);
windTv = view.findViewById(R.id.frag_tv_wind);
temRangeTv = view.findViewById(R.id.frag_tv_temprange);
dateTv = view.findViewById(R.id.frag_tv_date);
clothIndexTv = view.findViewById(R.id.frag_index_tv_dress);
carIndexTv = view.findViewById(R.id.frag_index_tv_washcar);
conditionTv = view.findViewById(R.id.frag_index_tv_cold);
sportIndexTv = view.findViewById(R.id.frag_index_tv_sport);
raysIndexTv = view.findViewById(R.id.frag_index_tv_rays);
dayIv = view.findViewById(R.id.frag_tv_today);
futureLayout = view.findViewById(R.id.frag_center_layout);
outLayout = view.findViewById(R.id.out_layout);
//设置监听
clothIndexTv.setOnClickListener(this);
carIndexTv.setOnClickListener(this);
coldIndexTv.setOnClickListener(this);
sportIndexTv.setOnClickListener(this);
raysIndexTv.setOnClickListener(this);
}
@Override
public void onClick(View v) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
switch (v.getId()) {
case R.id.frag_index_tv_dress:
builder.setTitle(“穿衣指数”);
break;
case R.id.frag_index_tv_washcar:
builder.setTitle(“洗车指数”);
break;
case R.id.frag_index_tv_cold:
builder.setTitle(“感冒指数”);
break;
case R.id.frag_index_tv_sport:
builder.setTitle(“运动指数”);
break;
case R.id.frag_index_tv_rays:
builder.setTitle(“紫外线指数”);
break;
}
builder.create().show();
}
}
5.4 更多界面的一些设置
主要包括一些背景的调换按钮,数据清理,版本显示和分享app按钮四个操作按钮。
package com.example.operation;
import androidx.appcompat.app.AlertDialog;
import androidx.appcompat.app.AppCompatActivity;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.RadioGroup;
import android.widget.TextView;
import android.widget.Toast;
import com.example.operation.db.DBManger;
public class MoreActivity extends AppCompatActivity implements View.OnClickListener {
TextView bgTv, cacheTv, versionTv, shareTv;
RadioGroup exbgRg;
ImageView backIv;
private SharedPreferences pref;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_more);
initUI();
}
private void initUI() {
bgTv = findViewById(R.id.more_tv_exchange);
cacheTv = findViewById(R.id.more_tv_cache);
versionTv = findViewById(R.id.more_tv_version);
shareTv = findViewById(R.id.more_tv_share);
backIv = findViewById(R.id.more_iv_back);
exbgRg = findViewById(R.id.more_rg);
bgTv.setOnClickListener(this);
cacheTv.setOnClickListener(this);
shareTv.setOnClickListener(this);
backIv.setOnClickListener(this);
pref = getSharedPreferences(“bg_pref”, MODE_PRIVATE);
String versionName = getVersionName();
versionTv.setText(“当前版本:v”+versionName);
setRGListener();
}
private void setRGListener() {
exbgRg.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(RadioGroup group, int checkedId) {
int bg = pref.getInt(“bg”, 0);
SharedPreferences.Editor editor = pref.edit();
Intent intent = new Intent(MoreActivity.this,MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK/Intent.FLAG_ACTIVITY_NEW_TASK);
switch (checkedId){
case R.id.more_rb_green:
if (bg==0) {
Toast.makeText(MoreActivity.this,”您选择的为当前背景,无需改变”,Toast.LENGTH_SHORT).show();
return;
}
editor.putInt(“bg”,0);
editor.commit();
break;
case R.id.more_rb_pink:
if (bg==1) {
Toast.makeText(MoreActivity.this,”您选择的为当前背景,无需改变”,Toast.LENGTH_SHORT).show();
return;
}
editor.putInt(“bg”,1);
editor.commit();
break;
case R.id.more_rb_blue:
if (bg==2) {
Toast.makeText(MoreActivity.this,”您选择的为当前背景,无需改变”,Toast.LENGTH_SHORT).show();
return;
}
editor.putInt(“bg”,2);
editor.commit();
break;
}
startActivity(intent);
}
});
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.more_iv_back:
finish();
break;
case R.id.more_tv_cache:
clearCache();
break;
case R.id.more_tv_share:
shareSoftwareMsg(“说天气app是你的朋友,让你体验Ta的温暖!”);
break;
case R.id.more_tv_exchange:
if (exbgRg.getVisibility() == View.VISIBLE) {
exbgRg.setVisibility(View.GONE);
}else {
exbgRg.setVisibility(View.VISIBLE);
}
break;
}
}
private void shareSoftwareMsg(String s) {
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType(“text/plain”);
intent.putExtra(Intent.EXTRA_TEXT, s);
startActivity(Intent.createChooser(intent, “说天气”));
}
private void clearCache() {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setTitle(“提示信息”).setMessage(“确定要删除所有缓存吗?”);
builder.setPositiveButton(“确定”, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
DBManger.deleteAllInfo();
;
Toast.makeText(MoreActivity.this, “已清除全部缓存”, Toast.LENGTH_SHORT).show();
Intent intent = new Intent(MoreActivity.this, MainActivity.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK / Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
}).setPositiveButton(“取消”, null);
builder.create().show();
}
public String getVersionName() {
PackageManager manager = getPackageManager();
String versionName = null;
try {
PackageInfo info = manager.getPackageInfo(getPackageName(),0);
versionName=info.versionName;
}catch (PackageManager.NameNotFoundException e){
e.printStackTrace();
}
return versionName;
}
}
5.5数据存储及数据库
此app也采用了数据存储和数据库,包括城市列表的数据存储和城市天气信息的存储。
第六章 结论
本次课程设计项目在准备阶段时,首先参考了一些推荐系统技术的参考资料,并加以思考如何才能通过多种途径在安卓技术上突破,做一个对学习和生活都有意义的APP。通过研究我们手机上的系统自带软件,我们产生了做一个能提供天气预报的软件的想法。我们打算做的软件则可以记录每天的天气情况,并展示未来几天的天气,以列表的形式呈现给用户,让用户更加清楚现在或者未来几天的天气。
为了解决一些问题,我们参考了网上的一些资料和文献。纵观整个设计与实现过程,最为重要的关键步骤是系统的分析和系统的设计过程,包含数据库设计,界面设计以及算法设计等。此外,在编写代码时对代码的维护与重构也是不可或缺的一环。总的说来,一个完整的系统设计过程,离不开系统设计者全面的知识储备和设计者开发的周期管理及项目整体思想的构建。
虽然通过本次设计完成了一款能提供天气预报的软件,但是其功能还是有些简单,在将来希望能够对其进行改善。目前只能储存几个固定城市的天气预报,比如,以后可以添加搜索某个城市的天气预报的功能等。
原创文章,作者:端木书台,如若转载,请注明出处:https://blog.ytso.com/273226.html