鸿蒙天气预报应用开发项目

一、项目概述

1.1 项目背景

随着移动互联网的快速发展,天气信息已成为用户日常生活中不可或缺的重要内容。鸿蒙(HarmonyOS)作为面向全场景的分布式操作系统,具备跨设备协同、流畅的用户体验等优势,基于鸿蒙开发天气预报应用,可满足用户在不同鸿蒙设备上便捷获取天气信息的需求。

1.2 项目目标

开发一款功能完善、界面友好的鸿蒙天气预报应用,实现城市天气查询、自动定位、多城市管理、天气预警及历史天气记录等核心功能,为用户提供准确、及时的天气服务,同时适配多种鸿蒙设备,保证应用的稳定性和兼容性。

1.3 适用范围

本项目文档适用于参与该鸿蒙天气预报应用开发的所有技术人员,包括开发工程师、测试工程师、产品经理等,用于明确项目需求、技术方案、开发规范及测试标准,指导项目的全流程实施。

二、需求分析

2.1 功能需求

2.1.1 基础天气查询

用户可手动输入城市名查询对应城市的当前天气信息,包括温度、湿度、风速、天气状况(晴、雨、阴等)。应用支持自动定位功能,获取用户当前所在城市,并展示该城市的天气信息。

2.1.2 多城市切换

用户可添加多个常用城市,在应用中实现快速切换,查看不同城市的天气情况。支持对已添加城市进行删除、排序等管理操作。

2.1.3 天气预警提醒

当查询城市发布天气预警信息(如暴雨预警、台风预警等)时,应用自动弹出提醒通知,展示预警等级、预警内容及持续时间。

2.1.4 历史天气记录

记录用户查询城市的历史天气数据,包括过去7天的温度变化、天气状况等。以图表形式(如折线图)直观展示历史温度变化趋势。

2.2 非功能需求

2.2.1 性能需求

应用启动时间不超过3秒,天气数据加载时间不超过2秒。支持同时管理至少10个常用城市,切换城市时无明显卡顿。

2.2.2 兼容性需求

适配HarmonyOS 3.0及以上版本的手机、平板等设备。支持不同屏幕尺寸和分辨率,界面自适应显示。

2.2.3 安全性需求

用户定位信息仅用于天气查询,不泄露给第三方。网络请求采用加密方式,保障数据传输安全。

2.2.4 可用性需求

界面设计简洁明了,操作流程简单易懂,用户无需复杂学习即可使用。应用运行稳定,无频繁闪退、崩溃等问题,异常情况(如网络断开)有友好提示。

三、总体设计

3.1 架构设计

本应用采用分层架构设计,分为表现层、业务逻辑层、数据访问层和基础层,各层职责清晰,降低模块间的耦合度。

表现层:负责应用的UI展示和用户交互,包括Ability组件、页面布局、控件绑定等,采用鸿蒙的ArkUI框架实现。

业务逻辑层:处理核心业务逻辑,如天气数据的解析与处理、城市管理、预警信息判断、历史记录统计等。

数据访问层:负责数据的获取与存储,包括调用天气API接口获取网络数据、操作本地数据库存储城市信息和历史天气数据。

基础层:提供通用工具支持,如网络请求工具、JSON解析工具、定位工具、图表绘制工具等。

3.2 模块划分

3.2.1 天气查询模块

负责手动输入城市查询和自动定位查询功能的实现。调用定位工具获取用户位置,通过网络请求工具调用天气API获取对应城市的天气数据。

3.2.2 城市管理模块

实现多城市的添加、删除、排序及切换功能。管理本地存储的常用城市列表,提供数据查询和修改接口给业务逻辑层。

3.2.3 预警提醒模块

解析天气API返回的预警信息,判断是否需要触发提醒。调用鸿蒙的通知服务,弹出预警提醒通知。

3.2.4 历史记录模块

存储每日天气数据到本地数据库,按城市和日期进行分类管理。读取历史数据并通过图表工具生成温度变化趋势图。

3.2.5 基础工具模块

封装网络请求工具,支持HTTP/HTTPS请求,处理请求异常和数据缓存。提供JSON解析工具,将API返回的JSON数据转换为应用所需的实体类对象。实现定位工具,调用鸿蒙系统的定位服务获取用户地理位置。

3.3 数据结构设计

3.3.1 天气数据实体类

java

 

public class Weather {

    private String cityName; // 城市名称

    private String date; // 日期

    private String condition; // 天气状况

    private int temperature; // 当前温度

    private int minTemperature; // 最低温度

    private int maxTemperature; // 最高温度

    private int humidity; // 湿度(百分比)

    private float windSpeed; // 风速(km/h)

    private Warning warning; // 预警信息

    // getter和setter方法

}

public class Warning {

    private String level; // 预警等级

    private String content; // 预警内容

    private String duration; // 持续时间

    // getter和setter方法

}

3.3.2 城市实体类

java

 

public class City {

    private String cityId; // 城市ID

    private String cityName; // 城市名称

    private double longitude; // 经度

    private double latitude; // 纬度

    private boolean isDefault; // 是否为默认城市

    // getter和setter方法

}

3.4 界面设计

3.4.1 主界面

顶部展示当前城市名称、日期和天气状况图标。中间区域显示当前温度、湿度、风速等核心天气信息。底部提供多城市切换入口、历史记录查看入口和设置按钮。

3.4.2 城市管理界面

展示已添加的常用城市列表,每个城市条目显示城市名称和当前温度。提供添加按钮,跳转至城市搜索界面;支持长按城市条目进行删除、排序操作。

3.4.3 历史记录界面

以列表形式展示过去7天的天气记录,包括日期、天气状况、温度范围。下方展示温度变化折线图,直观呈现温度趋势。

3.4.4 预警提醒界面

弹出式通知窗口,展示预警等级(以不同颜色标识)、预警内容和持续时间。提供“知道了”按钮,点击关闭提醒窗口。

四、详细设计

4.1 表现层设计

采用鸿蒙ArkUI框架的声明式开发范式进行UI布局,主要使用Ability和Component组件构建页面。

主界面Ability:MainAbility,加载主页面布局,绑定天气数据展示控件,实现城市切换、页面跳转等交互逻辑。

城市管理页面:CityManagerComponent,采用List组件展示城市列表,通过Button组件实现添加、删除等操作。

历史记录页面:HistoryRecordComponent,使用List组件展示历史天气列表,结合Chart组件绘制温度变化折线图。

预警提醒组件:WarningDialogComponent,以对话框形式展示预警信息,支持用户交互关闭。

4.2 业务逻辑层设计

4.2.1 天气服务类

java

 

public class WeatherService {

    // 获取当前天气信息

    public Weather getCurrentWeather(String cityId) {

        // 调用数据访问层获取天气API数据

        String weatherJson = WeatherDataDao.getWeatherData(cityId);

        // 解析JSON数据为Weather对象

        Weather weather = JsonParser.parseWeather(weatherJson);

        // 判断是否存在预警信息,若存在则触发提醒

        if (weather.getWarning() != null) {

            WarningManager.showWarning(weather.getWarning());

        }

        // 存储当前天气数据到历史记录

        HistoryRecordDao.saveWeatherRecord(weather);

        return weather;

    }

    // 自动定位获取当前城市天气

    public Weather getLocationWeather() {

        Location location = LocationUtil.getLocation();

        String cityId = CityDao.getCityIdByLocation(location);

        return getCurrentWeather(cityId);

    }

}

4.2.2 城市管理服务类

java

 

public class CityManagerService {

    // 添加常用城市

    public boolean addCity(City city) {

        List<City> cityList = CityDao.getCityList();

        if (cityList.size() >= 10) {

            return false; // 超过最大数量限制

        }

        return CityDao.addCity(city);

    }

    // 删除城市

    public boolean deleteCity(String cityId) {

        return CityDao.deleteCity(cityId);

    }

    // 排序城市列表

    public List<City> sortCityList(List<City> cityList, SortType sortType) {

        // 按指定规则排序(如字母顺序、添加时间)

        // ...排序逻辑

        CityDao.updateCityList(cityList);

        return cityList;

    }

}

4.2.3 历史记录服务类

java

 

public class HistoryRecordService {

    // 获取指定城市的历史天气记录

    public List<Weather> getHistoryRecords(String cityId, int days) {

        return HistoryRecordDao.getWeatherRecords(cityId, days);

    }

    // 生成温度变化趋势数据

    public List<TemperatureTrend> generateTemperatureTrend(List<Weather> weatherList) {

        List<TemperatureTrend> trendList = new ArrayList<>();

        for (Weather weather : weatherList) {

            TemperatureTrend trend = new TemperatureTrend();

            trend.setDate(weather.getDate());

            trend.setMaxTemp(weather.getMaxTemperature());

            trend.setMinTemp(weather.getMinTemperature());

            trendList.add(trend);

        }

        return trendList;

    }

}

4.3 数据访问层设计

4.3.1 天气数据访问类

java

 

public class WeatherDataDao {

    // 调用天气API获取数据

    public static String getWeatherData(String cityId) {

        String apiUrl = "https://api.weather.com/weather?cityId=" + cityId + "&key=your_api_key";

        return HttpUtil.sendGetRequest(apiUrl);

    }

}

4.3.2 城市数据访问类

采用鸿蒙的偏好设置(Preferences)存储常用城市列表,实现数据的持久化。

java

 

public class CityDao {

    private static final String PREFERENCES_NAME = "city_preferences";

    private static final String CITY_LIST_KEY = "city_list";

    // 获取城市列表

    public static List<City> getCityList() {

        Preferences preferences = PreferencesUtil.getPreferences(PREFERENCES_NAME);

        String cityListJson = preferences.getString(CITY_LIST_KEY, "[]");

        return JsonParser.parseCityList(cityListJson);

    }

    // 添加城市

    public static boolean addCity(City city) {

        List<City> cityList = getCityList();

        cityList.add(city);

        String cityListJson = JsonParser.toJson(cityList);

        Preferences preferences = PreferencesUtil.getPreferences(PREFERENCES_NAME);

        return preferences.putString(CITY_LIST_KEY, cityListJson).flush();

    }

    // 删除城市

    public static boolean deleteCity(String cityId) {

        List<City> cityList = getCityList();

        cityList.removeIf(city -> city.getCityId().equals(cityId));

        String cityListJson = JsonParser.toJson(cityList);

        Preferences preferences = PreferencesUtil.getPreferences(PREFERENCES_NAME);

        return preferences.putString(CITY_LIST_KEY, cityListJson).flush();

    }

}

4.3.3 历史记录数据访问类

使用鸿蒙的关系型数据库(RelationalStore)存储历史天气数据,支持按城市和日期查询。

java

 

public class HistoryRecordDao {

    private static final String DB_NAME = "weather_history.db";

    private static final String TABLE_NAME = "weather_record";

    // 保存天气记录

    public static void saveWeatherRecord(Weather weather) {

        OrmContext ormContext = DatabaseUtil.getOrmContext(DB_NAME, TABLE_NAME);

        WeatherRecordEntity entity = new WeatherRecordEntity();

        entity.setCityId(CityDao.getCityIdByName(weather.getCityName()));

        entity.setDate(weather.getDate());

        entity.setCondition(weather.getCondition());

        entity.setTemperature(weather.getTemperature());

        entity.setMinTemperature(weather.getMinTemperature());

        entity.setMaxTemperature(weather.getMaxTemperature());

        entity.setHumidity(weather.getHumidity());

        entity.setWindSpeed(weather.getWindSpeed());

        ormContext.insert(entity);

        ormContext.flush();

    }

    // 获取历史天气记录

    public static List<Weather> getWeatherRecords(String cityId, int days) {

        OrmContext ormContext = DatabaseUtil.getOrmContext(DB_NAME, TABLE_NAME);

        // 查询指定城市最近days天的记录

        // ...查询逻辑

        // 转换为Weather列表返回

        return weatherList;

    }

}

4.4 基础工具设计

4.4.1 网络请求工具

封装HttpURLConnection实现HTTP请求,支持GET方法,处理请求超时、网络异常等情况,并对返回数据进行缓存。

java

 

public class HttpUtil {

    private static final int TIMEOUT = 5000;

    public static String sendGetRequest(String url) {

        HttpURLConnection connection = null;

        BufferedReader reader = null;

        try {

            URL requestUrl = new URL(url);

            connection = (HttpURLConnection) requestUrl.openConnection();

            connection.setRequestMethod("GET");

            connection.setConnectTimeout(TIMEOUT);

            connection.setReadTimeout(TIMEOUT);

            int responseCode = connection.getResponseCode();

            if (responseCode == HttpURLConnection.HTTP_OK) {

                InputStream inputStream = connection.getInputStream();

                reader = new BufferedReader(new InputStreamReader(inputStream));

                StringBuilder response = new StringBuilder();

                String line;

                while ((line = reader.readLine()) != null) {

                    response.append(line);

                }

                return response.toString();

            }

        } catch (Exception e) {

            e.printStackTrace();

        } finally {

            if (reader != null) {

                try {

                    reader.close();

                } catch (IOException e) {

                    e.printStackTrace();

                }

            }

            if (connection != null) {

                connection.disconnect();

            }

        }

        return null;

    }

}

4.4.2 JSON解析工具

使用Gson库实现JSON数据与实体类的相互转换,简化数据解析流程。

java

 

public class JsonParser {

    private static final Gson GSON = new Gson();

    // 解析天气数据

    public static Weather parseWeather(String json) {

        return GSON.fromJson(json, Weather.class);

    }

    // 解析城市列表

    public static List<City> parseCityList(String json) {

        Type type = new TypeToken<List<City>>() {}.getType();

        return GSON.fromJson(json, type);

    }

    // 对象转换为JSON

    public static String toJson(Object object) {

        return GSON.toJson(object);

    }

}

4.4.3 定位工具

调用鸿蒙系统的定位服务,获取用户的经纬度信息,进而转换为对应的城市ID。

java

 

public class LocationUtil {

    public static Location getLocation() {

        ACCESS_LOCATION = requestPermissions(new String[]{Manifest.permission.LOCATION});

        if (ACCESS_LOCATION) {

            LocationCallback locationCallback = new LocationCallback() {

                @Override

                public void onLocationReport(Location location) {

                    // 获取经纬度

                    double longitude = location.getLongitude();

                    double latitude = location.getLatitude();

                    // 存储定位结果

                    LocationUtil.location = new Location(longitude, latitude);

                }

            };

            // 注册定位回调,获取定位信息

            LocationManager.getInstance().requestLocationUpdates(locationCallback);

            // 等待定位结果返回

            try {

                Thread.sleep(2000);

            } catch (InterruptedException e) {

                e.printStackTrace();

            }

            return location;

        }

        return null;

    }

}

五、开发实现

5.1 开发环境搭建

操作系统:Windows 10或macOS。

开发工具:DevEco Studio 4.0及以上版本。

开发语言:Java。

依赖库:Gson(用于JSON解析)、鸿蒙系统SDK(HarmonyOS 3.0及以上)。

5.2 核心功能实现步骤

5.2.1 项目初始化

1. 打开DevEco Studio,创建新的鸿蒙项目,选择“Empty Ability”模板,设置项目名称、包名、保存路径等信息。

2. 配置项目的build.gradle文件,添加Gson依赖:

gradle

 

dependencies {

    implementation 'com.google.code.gson:gson:2.8.9'

}

5.2.2 基础工具实现

1. 按照4.4节的设计,实现HttpUtil、JsonParser、LocationUtil等基础工具类。

2. 封装PreferencesUtil和DatabaseUtil工具类,分别用于偏好设置和关系型数据库的初始化与管理。

5.2.3 数据访问层实现

1. 创建WeatherDataDao、CityDao、HistoryRecordDao类,实现数据的获取与存储逻辑。

2. 定义WeatherRecordEntity实体类,对应关系型数据库中的表结构,使用鸿蒙的ORM注解进行配置。

5.2.4 业务逻辑层实现

1. 实现WeatherService、CityManagerService、HistoryRecordService等业务服务类,处理核心业务逻辑。

2. 开发WarningManager类,实现预警信息的展示与通知功能。

5.2.5 表现层实现

1. 使用ArkUI的声明式布局编写主界面、城市管理界面、历史记录界面等页面布局文件。

2. 在Ability中绑定布局文件,实现控件的事件监听与数据绑定,完成用户交互逻辑。

5.3 关键技术点实现

5.3.1 网络请求与数据解析

调用HttpUtil发送GET请求获取天气API数据,通过JsonParser将返回的JSON数据解析为Weather实体类对象,示例代码如下:

java

 

// 获取北京的天气数据

String cityId = "110100";

Weather weather = new WeatherService().getCurrentWeather(cityId);

// 展示天气信息

textTemperature.setText(weather.getTemperature() + "℃");

textCondition.setText(weather.getCondition());

textHumidity.setText("湿度:" + weather.getHumidity() + "%");

textWindSpeed.setText("风速:" + weather.getWindSpeed() + "km/h");

5.3.2 自动定位功能

通过LocationUtil获取用户的经纬度信息,调用城市API将经纬度转换为城市ID,再根据城市ID查询天气数据,示例代码如下:

java

 

// 自动定位并获取天气

Weather locationWeather = new WeatherService().getLocationWeather();

if (locationWeather != null) {

    textCityName.setText(locationWeather.getCityName());

    updateWeatherInfo(locationWeather);

} else {

    ToastUtil.show("定位失败,请手动查询");

}

5.3.3 图表绘制

使用鸿蒙的Chart组件绘制历史温度变化折线图,将HistoryRecordService生成的温度趋势数据绑定到图表中,示例代码如下:

java

 

// 获取历史温度趋势数据

List<TemperatureTrend> trendList = new HistoryRecordService().generateTemperatureTrend(weatherList);

// 配置折线图

LineChart lineChart = (LineChart) findComponentById(ResourceTable.Id_line_chart);

LineChartData chartData = new LineChartData();

List<Entry> entries = new ArrayList<>();

for (TemperatureTrend trend : trendList) {

    entries.add(new Entry(trend.getMaxTemp()));

}

LineDataSet dataSet = new LineDataSet(entries, "最高温度");

chartData.addDataSet(dataSet);

lineChart.setChartData(chartData);

六、测试

6.1 测试环境

测试设备:鸿蒙系统3.0及以上版本的手机(如华为Mate 40)、平板(如华为MatePad Pro)。

测试工具:DevEco Studio自带的模拟器、Android Debug Bridge(ADB)。

6.2 测试内容

6.2.1 功能测试

天气查询测试:手动输入不同城市名,验证天气数据展示的准确性;开启自动定位,检查定位结果与天气数据的正确性。

城市管理测试:添加多个城市,验证添加功能;删除、排序城市,检查操作后列表的一致性。

预警提醒测试:模拟发布天气预警的城市,验证预警提醒是否正常弹出。

历史记录测试:查看不同城市的历史天气记录,检查数据完整性和图表展示效果。

6.2.2 性能测试

启动时间测试:多次启动应用,记录启动时间,确保不超过3秒。

加载速度测试:查询不同城市天气,记录数据加载时间,确保不超过2秒。

稳定性测试:长时间运行应用,频繁切换城市和功能模块,检查是否出现闪退、崩溃等问题。

6.2.3 兼容性测试

在不同型号、不同屏幕尺寸的鸿蒙设备上安装应用,检查界面显示是否正常,功能是否可用。

6.2.4 安全性测试

检查定位信息是否仅本地存储,未泄露给第三方。

验证网络请求是否采用加密方式,数据传输是否安全。

6.3 测试结果

记录各项测试的结果,对于测试中发现的问题,及时反馈给开发人员进行修复,修复后进行回归测试,确保应用符合需求规格。

七、项目部署

7.1 应用打包

在DevEco Studio中,选择“Build -> Build App(s)/Hap(s) -> Build Hap(s)”,生成HAP安装包。配置应用的签名信息,确保应用可正常安装和运行。

7.2 部署方式

本地部署:通过ADB工具将HAP安装包安装到测试设备上,用于内部测试。

应用市场部署:将打包好的应用提交到华为应用市场,经过审核后,供用户下载安装。

八、维护与迭代

8.1 日常维护

监控应用的运行状态,收集用户反馈的问题,及时进行bug修复。定期更新天气API接口,确保数据的准确性和可用性。适配鸿蒙系统的新版本,保证应用的兼容性。

8.2 功能迭代

根据用户需求和市场变化,规划后续功能迭代,例如:增加未来7天的天气预测功能;支持天气数据的分享功能,可分享至社交平台;添加生活指数推荐(如穿衣指数、防晒指数等)。

九、总结

本项目基于鸿蒙系统开发了一款功能完善的天气预报应用,实现了城市天气查询、自动定位、多城市切换、天气预警提醒和历史天气记录等核心功能,满足了用户在鸿蒙设备上便捷获取天气信息的需求。通过分层架构设计,降低了模块间的耦合度,提高了代码的可维护性和扩展性。在开发过程中,重点解决了网络请求、数据解析、定位服务和图表绘制等关键技术问题,确保了应用的稳定性和性能。后续可根据用户反馈和市场需求,进一步优化应用功能和用户体验,推动应用的持续迭代与升级。

   

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐