上一篇
安卓应用开发案例
- 行业动态
- 2025-04-22
- 11
本项目为「天气查询应用」,核心功能包括:
- 实时天气数据展示(温度/湿度/风速)
- 未来7天天气预报
- 多城市管理
- 天气预警推送
- 生活指数建议(穿衣/紫外线等)
环境搭建
组件 | 版本说明 |
---|---|
Android SDK | API 33 (Android 13) |
Kotlin | 8.0 |
Gradle | 5.1 |
IDE | Android Studio Giraffe |
依赖管理 | Gradle Wrapper |
// build.gradle(app)核心配置 dependencies { implementation "androidx.core:core-ktx:1.10.1" implementation "androidx.appcompat:appcompat:1.6.1" implementation "com.google.android.material:material:1.9.0" // 网络请求 implementation "com.squareup.retrofit2:retrofit:2.9.0" implementation "com.squareup.retrofit2:converter-gson:2.9.0" // 图片加载 implementation "com.github.bumptech.glide:glide:4.15.1" annotationProcessor "com.github.bumptech.glide:compiler:4.15.1" // 数据库 implementation "androidx.room:room-runtime:2.5.1" kapt "androidx.room:room-compiler:2.5.1" // 生命周期管理 implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:2.6.1" }
功能模块实现
首页天气展示
- 定位服务:使用
FusedLocationProviderClient
获取经纬度 - 数据接口:调用和风天气API(https://dev.qweather.com/)
- UI组件:
ConstraintLayout
+RecyclerView
实现天气列表 - 数据绑定:
LiveData
+ViewModel
架构
// WeatherViewModel.kt class WeatherViewModel(application: Application) : AndroidViewModel(application) { private val _weatherLiveData = MutableLiveData<WeatherData>() val weatherLiveData: LiveData<WeatherData> = _weatherLiveData fun fetchWeather(lat: Double, lon: Double) { viewModelScope.launch { try { val response = RetrofitClient.apiService.getWeather(lat, lon) _weatherLiveData.postValue(response.data) } catch (e: Exception) { _weatherLiveData.postValue(null) } } } }
城市管理模块
- 本地存储:Room数据库存储城市列表
- CRUD操作:支持添加/删除/排序功能
- 搜索功能:结合
SearchView
实现城市模糊查询
-CityEntity.kt @Entity(tableName = "city_table") data class CityEntity( @PrimaryKey val id: Int, val cityName: String, val latitude: Double, val longitude: Double )
天气预警系统
- 推送机制:使用
WorkManager
周期性检查预警 - 通知渠道:创建专用通知通道
weather_alerts
- 样式设计:自定义
NotificationCompat.BigTextStyle
显示预警详情
关键技术点
技术场景 | 解决方案 |
---|---|
异形天气图标 | SVG转Vector Asset,支持不同屏幕密度适配 |
背景天气动画 | Lottiechapter实现雨雪动态效果 |
数据缓存策略 | OKHttp缓存+Room本地数据库双缓存机制 |
暗黑模式适配 | 使用UiModeManager 检测模式,资源文件分-light/-night后缀 |
单元测试覆盖 | Mock Retrofit接口进行网络层测试,使用Robolectric验证UI逻辑 |
第三方库集成表
功能分类 | 库名称 | 用途说明 |
---|---|---|
网络请求 | Retrofit2 + OkHttp | REST API调用与网络缓存 |
图片加载 | Glide | 天气图标/背景图加载 |
图表绘制 | MPAndroidChart | 温度折线图/风力雷达图 |
数据库 | Room + SQLite | 城市数据持久化存储 |
异步任务 | Coroutines + WorkManager | 后台数据同步/定时任务 |
测试与优化
- 内存优化:使用LeakCanary检测Activity泄漏
- 启动优化:采用懒加载策略,非必要组件延迟初始化
- 包体积控制:开启ProGuard混淆,移除debug代码
- 性能监控:集成Firebase Performance Monitoring
发布流程
- 生成签名APK:配置
buildTypes{release{...}}
- 上传至Google Play:完成应用内容评级、截图上传
- 内部测试:通过Google Play Console邀请测试
- 阶段发布:设置分阶段用户比例(5%→50%→100%)
相关问题与解答
Q1:应用启动时定位失败如何处理?
A1:需检查以下方面:
- 声明定位权限:
ACCESS_COARSE_LOCATION
/ACCESS_FINE_LOCATION
- 运行时动态申请权限(Android 6.0+)
- 检查设备GPS是否开启(可通过
LocationServices.isLocationEnabled
) - 超时处理:设置
FusedLocationProviderClient
的timeout参数 - 备用方案:提供手动输入经纬度功能
Q2:网络请求返回401错误如何解决?
A2:排查步骤:
- 检查API Key有效性(和风天气需注册开发者账号)
- 确认请求头
appkey
参数是否正确拼接 - 验证签名算法(部分API需要MD5加密)
- 检查IP是否被限制(服务器防火墙规则)
- 异常处理:捕获
HttpException
并提示用户检查网络