Navigation 组件出来好几年了,但很多项目还是手写 Fragment 管理。不是它不好用,而是多栈、跨模块、深层链接这些场景容易踩坑。 一、Navigation 解决了什么问题 Fragment 跳转代码散落在 Activity 里 返回栈管理容易出 Bug 深层链接和参数传递写起来乱 多
很多 Android 项目测试少,不是因为不想写,而是不知道测什么、怎么测。测试金字塔可以帮你决定投入比例。 一、测试金字塔三层 /\ / \ UI 测试(少、慢、贵) /____\ / \ 集成测试(中) /________\ /
项目越大,构建越慢,耦合越重。模块化的目的不是炫技,是为了让团队能并行开发、独立测试、快速构建。 一、模块化的三种粒度
Android 设备形态越来越杂:折叠屏、平板、挖孔屏、刘海屏、药丸屏。只做一套固定布局已经不够了,响应式 UI 是高级工程师的必修课。 一、WindowInsets:处理好系统栏 ViewCompat.setOnApplyWindowInsetsListener(root) { view, ins
Android 后台限制越来越严。Doze、App Standby、后台启动限制,让 AlarmManager 和 Service 不再是首选。复杂后台任务,现在基本交给 WorkManager。 一、WorkManager 能解决什么问题
本地数据库是 App 的标配。Room 让 SQLite 写起来像操作对象,但用久了会发现:同样的 Room,有人快有人慢,差别就在索引和查询设计。 一、为什么 Room 查询会慢 Room 本质还是 SQLite。慢通常不是 Room 的问题,是 SQL 的问题: 没建索引,全表扫描 一次性查太多
动画不是炫技,它是用户体验的一部分。按钮点击没反馈、页面跳转太生硬,用户会觉得 App“不跟手”。 Android 动画经历过几次演进:View 动画 → 属性动画 → MotionLayout。今天把核心路径串一遍。 一、属性动画 ValueAnimator + ObjectAnimator 属性
前面聊过协程和挂起函数,实际工程中真正高频出现的是 Flow。它把响应式编程带进了 Kotlin,但很多人用了一段时间还是分不清冷流和热流。 一、冷流:只有收集者才触发发射 fun coldFlow(): Flow<Int> = flow { println("flow started")
Compose 再火,传统 View 体系也不会消失。图表、仪表盘、手写签名、游戏场景这些需求,通常还是靠自定义 View 实现。 今天这篇文章,把自定义 View 的绘制流程拆开讲清楚。 一、自定义 View 的三条路径
上一篇聊到 Compose 性能调优,很多同学反馈: “重组到底怎么触发的?为什么 remember 有时不生效?” 这其实不是性能问题,而是状态管理问题。Compose 的 UI 更新完全依赖状态,状态写不对,性能调优就是无本之木。 一、状态驱动 UI 的三个层次 @Composable fun