Giới thiệu dự án
Sự bùng nổ của các thiết bị di động thông minh (smartphones) trong thập kỷ qua đã định hình lại hoàn toàn cách con người tiếp cận thông tin thời gian thực. Theo thống kê từ Statista, hơn 70% người dùng thiết bị di động truy cập các ứng dụng tiện ích hằng ngày, trong đó nhu cầu tra cứu và dự báo thời tiết chiếm vị trí thiết yếu phục vụ cho các hoạt động di chuyển, tổ chức sự kiện, sản xuất nông nghiệp và logistics. Tuy nhiên, nhiều ứng dụng thời tiết hiện nay trên chợ ứng dụng Google Play thường quá cồng kềnh, chứa nhiều quảng cáo làm giảm hiệu năng thiết bị, hoặc tiêu tốn quá nhiều tài nguyên mạng và bộ nhớ RAM.
Đồ án tốt nghiệp "Xây dựng ứng dụng dự báo thời tiết trên hệ điều hành Android" của tác giả Phạm Viết Long, dưới sự hướng dẫn của Th.S Vũ Thị Nguyệt tại Trường Đại học Công nghệ Thông tin và Truyền thông – Đại học Thái Nguyên (2023), tập trung giải quyết bài toán cung cấp thông tin khí tượng thủy văn chuẩn xác, trực quan, tức thời và tối ưu hóa tài nguyên cho thiết bị di động Android.
+-----------------------------------+
| OpenWeatherMap Cloud API |
+-----------------+-----------------+
| (JSON / REST API)
v
+-----------------------------------+-----------------------------------+
| Android Client |
| |
| +---------------------+ +--------------------+ +----------------+ |
| | Network Handler | | JSON Data Parser | | Picasso Engine | |
| | (HttpURLConnection) | | (Model Mapping) | | (Image Cache) | |
| +----------+----------+ +---------+----------+ +-------+--------+ |
| | | | |
| +-----------------------+---------------------+ |
| | |
| v |
| +---------------------------+ |
| | MainActivity / UI Layout | |
| | (View & Widget Binding) | |
| +---------------------------+ |
+-----------------------------------------------------------------------+
Mục tiêu dự án
- Nghiên cứu kiến trúc nền tảng: Phân tích chuyên sâu hệ điều hành Android, cơ chế quản lý vòng đời Activity, Service, BroadcastReceiver, Content Provider và máy ảo Dalvik/ART.
- Thiết kế kiến trúc hệ thống: Xây dựng mô hình ứng dụng client-server gọn nhẹ, kết nối trực tiếp với dịch vụ web RESTful.
- Hiện thực hóa chức năng khai thác dữ liệu: Tích hợp OpenWeatherMap API để bóc tách dữ liệu khí tượng đa tầng qua định dạng JSON.
- Tối ưu hóa trải nghiệm người dùng (UX/UI): Hiển thị trực quan dữ liệu thời tiết hiện tại (nhiệt độ, độ ẩm, áp suất khí quyển, tốc độ gió, độ che phủ của mây) và dự báo liên tục trong 5 ngày kế tiếp cho các địa phương bất kỳ.
Phương pháp tiếp cận và giải pháp
- Sử dụng ngôn ngữ lập trình Java hướng đối tượng kết hợp bộ công cụ phát triển Android SDK chuẩn.
- Triển khai giao thức truyền thông HTTP/HTTPS bất đồng bộ qua mạng (Multithreading/Background Processing) để giải phóng main UI thread.
- Bóc tách và ánh xạ dữ liệu JSON trả về thành các đối tượng thực thể (Java Plain Old Java Objects - POJOs).
- Tích hợp thư viện xử lý và lưu trữ đệm hình ảnh Picasso nhằm tối ưu hóa tải biểu tượng thời tiết.
Chỉ số kết quả kỳ vọng
- Dung lượng tệp cài đặt (APK): $\le 8.5\text{ MB}$.
- Thời gian phản hồi truy vấn (Latency): $< 800\text{ ms}$ trong điều kiện mạng 4G tiêu chuẩn.
- Mức tiêu thụ bộ nhớ RAM: $< 65\text{ MB}$ trong trạng thái thực thi tiền cảnh (foreground).
- Độ chính xác dữ liệu: Cập nhật liên tục theo chu kỳ trạm thời tiết toàn cầu của OpenWeatherMap với độ trễ dưới 10 phút.
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
Trước khi xây dựng hệ thống, đồ án tiến hành đánh giá ưu và nhược điểm của các giải pháp thương mại hiện hành để định vị khoảng trống công nghệ:
| Tiêu chí |
Ứng dụng Weather Mặc định (OEM) |
AccuWeather / Yahoo Weather |
Ứng dụng của đề tài |
| Dung lượng bộ nhớ cài đặt |
Lớn ($> 40\text{ MB}$) |
Rất lớn ($> 75\text{ MB}$) |
Rất nhỏ ($< 10\text{ MB}$) |
| Tần suất hiển thị quảng cáo |
Trung bình (Tùy hãng) |
Cao (Nhiều Pop-up/Video) |
Không quảng cáo |
| Mức độ phụ thuộc phần cứng |
Gắn chặt vào firmware |
Yêu cầu cấu hình tầm trung |
Tương thích đa thiết bị Android (Low-end OK) |
| Tốc độ phản hồi API |
Phụ thuộc máy chủ hãng |
Phụ thuộc mạng trung gian |
Trực tiếp từ OpenWeatherMap Node |
| Khả năng mở rộng mã nguồn |
Mã nguồn đóng |
Mã nguồn đóng |
Mã nguồn mở, dễ dàng module hóa |
Ma trận ưu tiên yêu cầu người dùng theo phương pháp MoSCoW
- Must Have (Bắt buộc):
- Tự động lấy và hiển thị thông tin thời tiết địa điểm hiện tại (mặc định Hà Nội hoặc vị trí GPS).
- Tìm kiếm và hiển thị thời tiết theo tên thành phố/tỉnh thành bất kỳ.
- Hiển thị chi tiết: Nhiệt độ ($^\circ\text{C}$), Độ ẩm ($%$), Tốc độ gió ($\text{m/s}$), Áp suất ($\text{hPa}$), Độ phủ mây ($%$).
- Tra cứu dự báo thời tiết 5 ngày kế tiếp theo các mốc thời gian.
- Should Have (Nên có):
- Cơ chế tự động nhận diện và cập nhật biểu tượng trạng thái mây/mưa/nắng qua CDN.
- Thông báo lỗi trực quan khi mất kết nối Internet hoặc nhập sai tên địa danh.
- Could Have (Có thể có):
- Tích hợp Widget ngoài màn hình chính (Home Screen App Widget).
- Cảnh báo thời tiết nguy hiểm qua Notification Service.
- Won't Have (Chưa thực hiện ở giai đoạn này):
- Tích hợp bản đồ Radar khí tượng động dạng GIS.
- Tự động dự báo dựa trên mạng nơ-ron học sâu tại cục bộ.
Thiết kế hệ thống
Hệ thống được thiết kế theo mô hình phân tầng hướng dịch vụ, tận dụng tối đa các thành phần cốt lõi của Android OS:
classDiagram
class OpenWeatherJson {
+String base
+int cod
+long dt
+int id
+String name
+Coord coord
+Main main
+Wind wind
+Clouds clouds
+Sys sys
+List~WeatherItem~ weather
}
class Coord {
+double lon
+double lat
}
class Main {
+double temp
+double temp_min
+double temp_max
+double pressure
+double humidity
}
class Wind {
+double speed
+double deg
}
class Clouds {
+int all
}
class Sys {
+String country
+long sunrise
+long sunset
}
class WeatherItem {
+int id
+String main
+String description
+String icon
}
OpenWeatherJson *-- Coord
OpenWeatherJson *-- Main
OpenWeatherJson *-- Wind
OpenWeatherJson *-- Clouds
OpenWeatherJson *-- Sys
OpenWeatherJson *-- WeatherItem
Ngăn xếp công nghệ (Technology Stack)
- Hệ điều hành mục tiêu: Android 5.0 (API Level 21) trở lên (Tối ưu hóa trên Android SDK 33).
- Ngôn ngữ phát triển: Java (JDK 8/11).
- Nền tảng phát triển tích hợp (IDE): Android Studio Flamingo / Electric Eel.
- Thư viện mạng & Hình ảnh:
HttpURLConnection, Picasso 2.71828.
- Định dạng dữ liệu giao tiếp: JSON (RFC 8259).
- Web Service: OpenWeatherMap API 2.5 RESTful Web Service.
Thiết kế giao diện lập trình ứng dụng (API Endpoints)
Hệ thống sử dụng hai điểm cuối RESTful chính:
-
Truy vấn thời tiết thời gian thực theo tên địa danh:
- Endpoint:
GET /data/2.5/weather
- Parameters:
q: Tên thành phố, mã quốc gia (Ví dụ: q=hanoi,vn).
appid: Khóa xác thực API (API Key).
units: Hệ đơn vị tính (units=metric cho độ C và m/s).
lang: Ngôn ngữ trả về (lang=vi).
-
Truy vấn dự báo thời tiết 5 ngày kế tiếp:
- Endpoint:
GET /data/2.5/forecast
- Parameters:
q={city_name}&appid={API_KEY}&units=metric&cnt=40
Implementation và kết quả
Quá trình phát triển (Development Process)
Hệ thống được phát triển qua 4 giai đoạn chính:
- Thiết lập hạ tầng và cấu hình: Khai báo cấu trúc Manifest, phân quyền Internet, thiết lập kết nối mạng và quản trị API Key.
- Xây dựng Data Model (POJO): Chuyển đổi cấu trúc JSON lồng nhau từ OpenWeatherMap thành cây đối tượng Java.
- Xử lý truyền thông và bóc tách dữ liệu: Lập trình các tác vụ bất đồng bộ để gọi API, chuyển đổi InputStream thành JSON String và phân giải vào Model.
- Binding dữ liệu và Tối ưu hóa UI: Ánh xạ thuộc tính khí tượng lên các View (TextView, ImageView) và tải ảnh qua Picasso.
// Khai báo lớp mô hình dữ liệu chính (Main.java) ánh xạ từ trường "main" trong JSON
public class Main {
private double temp;
private double temp_min;
private double temp_max;
private double pressure;
private double humidity;
public Main() {}
public double getTemp() { return temp; }
public void setTemp(double temp) { this.temp = temp; }
public double getTempMin() { return temp_min; }
public void setTempMin(double temp_min) { this.temp_min = temp_min; }
public double getTempMax() { return temp_max; }
public void setTempMax(double temp_max) { this.temp_max = temp_max; }
public double getPressure() { return pressure; }
public void setPressure(double pressure) { this.pressure = pressure; }
public double getHumidity() { return humidity; }
public void setHumidity(double humidity) { this.humidity = humidity; }
}
// Thực thi phân tách đối tượng JSON thời tiết hiện tại trong Controller/Activity
private void parseJsonWeather(String jsonResponse) {
try {
JSONObject jsonObject = new JSONObject(jsonResponse);
// 1. Trích xuất tên thành phố và quốc gia
String cityName = jsonObject.getString("name");
JSONObject sysObj = jsonObject.getJSONObject("sys");
String country = sysObj.getString("country");
txtLocation.setText(cityName + ", " + country);
// 2. Trích xuất thông số nhiệt độ và độ ẩm
JSONObject mainObj = jsonObject.getJSONObject("main");
double temp = mainObj.getDouble("temp");
double humidity = mainObj.getDouble("humidity");
double pressure = mainObj.getDouble("pressure");
txtTemperature.setText(String.format(Locale.getDefault(), "%.1f°C", temp));
txtHumidity.setText(String.format(Locale.getDefault(), "%.0f%%", humidity));
txtPressure.setText(String.format(Locale.getDefault(), "%.0f hPa", pressure));
// 3. Trích xuất thông tin gió và mây
JSONObject windObj = jsonObject.getJSONObject("wind");
double windSpeed = windObj.getDouble("speed");
txtWind.setText(String.format(Locale.getDefault(), "%.1f m/s", windSpeed));
JSONObject cloudsObj = jsonObject.getJSONObject("clouds");
int cloudCoverage = cloudsObj.getInt("all");
txtCloudiness.setText(cloudCoverage + "%");
// 4. Tải biểu tượng trạng thái thông qua thư viện Picasso
JSONArray weatherArray = jsonObject.getJSONArray("weather");
if (weatherArray.length() > 0) {
JSONObject weatherObj = weatherArray.getJSONObject(0);
String iconCode = weatherObj.getString("icon");
String iconUrl = "https://openweathermap.org/img/wn/" + iconCode + "@2x.png";
Picasso.get().load(iconUrl).into(imgWeatherIcon);
}
} catch (JSONException e) {
Log.e("WEATHER_PARSER", "Lỗi bóc tách cấu trúc dữ liệu JSON: " + e.getMessage());
}
}
<!-- Khai báo cấu hình cấp quyền bắt buộc trong AndroidManifest.xml -->
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.vietlong.weatherforecast">
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.WeatherForecast"
android:usesCleartextTraffic="true">
<activity
android:name=".MainActivity"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
Đánh giá và kiểm thử (Testing & Validation)
Ứng dụng đã trải qua các bài kiểm thử tự động và thủ công trên 5 cấu hình thiết bị thực tế khác nhau (từ Android 8.0 Oreo đến Android 13 Tiramisu).
+-----------------------------------------------------------------------+
| KẾT QUẢ KIỂM THỬ TẢI & PHẢN HỒI |
+-----------------------------------------------------------------------+
| Tiêu chí kiểm định Chỉ số đạt được Trạng thái |
+-----------------------------------------------------------------------+
| Thời gian khởi động lạnh 1.24 giây ĐẠT YÊU CẦU |
| Thời gian phân giải JSON 42 mili-giây XUẤT SẮC |
| Tỷ lệ bóc tách thành công 99.8% ĐẠT YÊU CẦU |
| Mức tiêu thụ RAM trung bình 54.2 MB TỐI ƯU |
| Tốc độ khung hình (Render) 59.8 FPS MƯỢT MÀ |
+-----------------------------------------------------------------------+
- Kiểm thử chức năng (Functional Testing): 100% các Use Case (Xem thời tiết hiện tại, Tìm kiếm theo tên thành phố, Xem chuỗi thời tiết 5 ngày) vượt qua các kịch bản kiểm thử chuẩn.
- Xử lý ngoại lệ (Exception Handling): Kiểm thử thành công khả năng tự phục hồi của ứng dụng khi gặp sự cố mất mạng Internet đột ngột hoặc nhập sai tên địa bàn (Ví dụ: chuỗi ký tự rỗng, ký tự đặc biệt).
Đổi mới và đóng góp
- Kiến trúc dữ liệu module hóa cao: Tách rời hoàn toàn các thành phần xử lý dữ liệu mạng (Network Layer), phân giải JSON (Parser Layer) và hiển thị giao diện (View Layer), giúp việc nâng cấp lên kiến trúc MVVM hoặc thay thế Web Service khác trở nên dễ dàng.
- Cơ chế tải và đệm biểu tượng tối ưu: Tận dụng bộ nhớ đệm hai tầng (Memory Cache & Disk Cache) của thư viện Picasso giúp giảm hơn 60% lượng dữ liệu tải lại đối với các biểu tượng thời tiết lặp lại.
- Giải thuật phân giải dữ liệu nhẹ: Không sử dụng các bộ thư viện phân giải quá nặng nề, ứng dụng sử dụng trực tiếp các lớp JSON gốc được Google tinh chỉnh cho Android Runtime, giúp tiết kiệm 35% chu kỳ xử lý CPU khi bóc tách mảng dữ liệu dự báo 40 mốc thời gian.
- Tính khả dụng trên phần cứng hạn chế: Ứng dụng chạy mượt mà trên các dòng máy cấu hình thấp với chỉ 1GB RAM mà không xảy ra hiện tượng tràn bộ nhớ (Out-Of-Memory Exception) hay đóng băng khung hình (ANR).
Ứng dụng thực tế và triển khai
Trường hợp sử dụng thực tế (Use Cases)
- Kế hoạch di chuyển và hoạt động ngoài trời: Người dùng tại đô thị tra cứu nhanh mức độ che phủ mây và nhiệt độ cao nhất/thấp nhất để chủ động phương tiện đi lại.
- Tổ chức sự kiện và du lịch: Tra cứu dữ liệu thời tiết của điểm đến trước 5 ngày, phục vụ công tác chuẩn bị lều trại, sân khấu ngoài trời và logistics.
- Nông nghiệp và ngư nghiệp quy mô nhỏ: Theo dõi độ ẩm không khí và tốc độ gió để điều chỉnh lịch tưới tiêu hoặc lịch trình đánh bắt ven bờ.
+------------------------------------+
| Lập kế hoạch công việc |
+-----------------+------------------+
|
+-----------------------+-----------------------+
| |
v v
+-----------------------------+ +-------------------------------+
| Tra cứu Hiện tại | | Dự báo 5 ngày tới |
| | | |
| - Kiểm tra mưa / nhiệt độ | | - Lập kế hoạch sự kiện |
| - Xem tốc độ gió / áp suất | | - Chuẩn bị hành lý du lịch |
| - Quyết định đồ dùng cá nhân| | - Bố trí kế hoạch sản xuất |
+-----------------------------+ +-------------------------------+
Lộ trình triển khai và mở rộng (Implementation Roadmap)
[Quý 1: Tối ưu lõi] ---> [Quý 2: Widget & Cache] ---> [Quý 3: Room DB & MVVM] ---> [Quý 4: Cảnh báo tự động]
(Hiện tại) (Desktop AppWidget) (Kiến trúc hiện đại) (Foreground Push Notification)
- Giai đoạn 1 (Hiện tại): Hoàn thiện ứng dụng độc lập trên nền tảng Android, đáp ứng đầy đủ tính năng tra cứu trực tiếp qua OpenWeatherMap.
- Giai đoạn 2: Phát triển AppWidget để đưa thông tin nhiệt độ và độ ẩm tức thời ra ngoài màn hình chính của thiết bị.
- Giai đoạn 3: Chuyển đổi mã nguồn sang kiến trúc MVVM (Model-View-ViewModel), tích hợp Room Database để hỗ trợ chế độ xem ngoại tuyến (Offline Caching).
- Giai đoạn 4: Triển khai cơ chế lắng nghe thay đổi vị trí thông qua GPS Provider và kích hoạt cảnh báo dông lốc, mưa lớn qua Firebase Cloud Messaging (FCM).
Hạn chế và hướng phát triển
Hạn chế kỹ thuật
- Phụ thuộc hoàn toàn vào kết nối mạng: Chưa có bộ nhớ đệm cơ sở dữ liệu cục bộ (Local SQLite/Room), do đó khi mất mạng, ứng dụng chưa hiển thị được dữ liệu của phiên tra cứu gần nhất.
- Hạn chế của tài khoản API miễn phí: OpenWeatherMap API bản miễn phí giới hạn 60 lượt gọi/phút và không cung cấp một số chỉ số nâng cao như chỉ số tia cực tím (UV Index) hay chất lượng không khí (AQI).
- Giao diện người dùng ở mức cơ bản: Chưa hỗ trợ tính năng đổi chủ đề động (Dynamic Theming / Dark Mode) theo cài đặt hệ điều hành.
Hướng phát triển trong tương lai
- Bổ sung kiến trúc lưu trữ đệm SQLite/Room để cho phép người dùng xem lại lịch sử tra cứu khi Offline.
- Nâng cấp giao diện người dùng sử dụng Jetpack Compose và thư viện Material Design 3.
- Mở rộng tính năng quản lý danh sách nhiều thành phố yêu thích (Favorite Locations) dạng danh sách trượt (RecyclerView).
- Xây dựng hệ thống Background Worker định kỳ kiểm tra thời tiết nguy hiểm để phát thông báo cảnh báo đến người dùng.
Đối tượng hưởng lợi
+-----------------------------------------------------------------------+
| ĐỐI TƯỢNG HƯỞNG LỢI & GIÁ TRỊ |
+-----------------------------------------------------------------------+
| 1. Sinh viên ngành CNTT / Lập trình di động: |
| - Tài liệu tham khảo toàn diện về vòng đời Activity / Service |
| - Mã nguồn mẫu về kỹ thuật bóc tách RESTful JSON trên Android |
| |
| 2. Lập trình viên Android mới bắt đầu (Junior Developers): |
| - Mẫu hình thiết kế kiến trúc phân tầng kết nối API bên thứ ba |
| - Kỹ thuật tối ưu hóa tài nguyên mạng và lưu trữ đệm hình ảnh |
| |
| 3. Người dùng phổ thông: |
| - Công cụ tra cứu thời tiết hoàn toàn miễn phí, không quảng cáo |
| - Giao diện trực quan, tốc độ phản hồi nhanh, tiết kiệm pin |
+-----------------------------------------------------------------------+
Câu hỏi thường gặp
1. Ứng dụng yêu cầu cấu hình phần cứng và phiên bản hệ điều hành tối thiểu nào?
Ứng dụng tương thích với các thiết bị chạy hệ điều hành Android 5.0 (Lollipop - API Level 21) trở lên, yêu cầu tối thiểu 512 MB RAM, dung lượng bộ nhớ trống 15 MB và thiết bị cần có kết nối mạng Internet (Wi-Fi, 3G, 4G, 5G).
2. Giới hạn tần suất gọi của OpenWeatherMap API ảnh hưởng như thế nào đến khả năng mở rộng?
Tài khoản sinh viên/miễn phí của OpenWeatherMap cho phép tối đa 60 cuộc gọi API mỗi phút và 1.000.000 cuộc gọi mỗi tháng. Khi mở rộng phục vụ số lượng người dùng lớn, hệ sinh thái có thể tích hợp máy chủ trung gian (Backend Gateway Node.js/Go) để lưu bộ đệm kết quả theo từng khu vực trong 10-15 phút, giảm đến 85% số lượng cuộc gọi trực tiếp đến API gốc.
3. Làm thế nào để bảo mật API Key trong ứng dụng Android?
Trong đồ án cơ bản, API Key được lưu trực tiếp trong mã nguồn. Để nâng cao tính bảo mật khi phát hành thương mại, API Key cần được di chuyển vào tệp local.properties, sau đó nạp qua biến BuildConfig hoặc mã hóa thông qua bộ công cụ phát triển native NDK (C/C++ .so file) để chống kỹ thuật dịch ngược mã (Decompilation).
4. Ứng dụng xử lý thế nào khi người dùng nhập sai tên địa danh?
Khi người dùng nhập địa danh không tồn tại hoặc sai định dạng, máy chủ OpenWeatherMap sẽ trả về mã trạng thái HTTP 404 (Not Found) kèm thông điệp lỗi dạng JSON. Khối bắt ngoại lệ JSONException và bộ kiểm tra mã phản hồi HTTP của ứng dụng sẽ bắt sự kiện này và hiển thị thông báo Toast cảnh báo trực quan: "Không tìm thấy thông tin địa điểm, vui lòng kiểm tra lại!".
5. Dự án này có thể tích hợp thêm các dịch vụ bản đồ số (như Google Maps) không?
Có. Kiến trúc của ứng dụng cho phép tích hợp Google Maps SDK for Android. Bằng cách lắng nghe sự kiện chạm trên bản đồ, ứng dụng có thể lấy tọa độ vĩ độ (lat) và kinh độ (lon), sau đó truyền trực tiếp vào Endpoint api.openweathermap.org/data/2.5/weather?lat={lat}&lon={lon} để tra cứu dữ liệu thời tiết tại bất kỳ điểm chạm nào trên toàn cầu.
Kết luận
Đồ án tốt nghiệp "Xây dựng ứng dụng dự báo thời tiết trên hệ điều hành Android" của sinh viên Phạm Viết Long đã hoàn thành toàn diện các mục tiêu nghiên cứu và ứng dụng thực tiễn đề ra. Dự án không chỉ hệ thống hóa chi tiết nền tảng lý thuyết chuyên sâu về kiến trúc hệ điều hành Android, vòng đời thành phần, quản lý tiến trình và mô hình giao tiếp web service, mà còn hiện thực hóa thành công một sản phẩm ứng dụng di động hoàn chỉnh, trực quan và tối ưu hóa hiệu năng.
Sản phẩm cung cấp giải pháp tra cứu dữ liệu khí tượng thủy văn chuẩn xác, tốc độ cao, hỗ trợ đắc lực cho đời sống hằng ngày của người dùng. Với cấu trúc mã nguồn module hóa rõ ràng, đồ án đóng vai trò là một tài liệu kỹ thuật chuẩn mực, tạo tiền đề vững chắc cho việc phát triển các tiện ích di động chuyên sâu hơn như hệ thống cảnh báo thiên tai tự động hay tích hợp công nghệ AI dự báo vi khí hậu cục bộ trong tương lai.