Đọc sâu theo bộ câu hỏi Android
Trang này nối bộ câu hỏi phỏng vấn với bài giải thích đầy đủ. Bắt đầu từ vấn đề chưa hiểu, đọc ví dụ và failure case, làm bài thực hành, rồi quay lại quiz. Lộ trình Senior gợi ý thứ tự học theo buổi.
Từ câu hỏi đến bài học
| Câu hỏi/vấn đề | Bài đọc chuyên sâu | Sau khi đọc, bạn cần tự giải thích được |
|---|---|---|
| Context khác nhau thế nào? Vì sao Activity đã đóng vẫn bị giữ? | Context, ownership và memory leak | Đường reference từ singleton qua callback; cleanup thuộc owner nào |
| Rotation khác process death thế nào? Lưu state ở đâu? | State recovery và lifecycle | Khởi tạo ViewModel mới từ query/ID; saved state khác persistent storage |
| Job/SupervisorJob và hai API song song hoạt động thế nào? | Structured concurrency và partial failure | Scope tree, failure boundary và cancellation của từng nhánh |
| Cold/hot Flow, stateIn và collect theo lifecycle? | Flow, sharing và lifecycle | Collector dừng có làm producer dừng không; khi nào mất giá trị |
| Chọn Coroutine, Service hay WorkManager cho upload? | Background work | Tách lifetime, persist input, scheduling, retry và idempotency |
| UDF là gì? Vì sao event quan trọng có thể mất? | UI state và event delivery | State/action/effect khác nhau; replay không thay acknowledgment/persistence |
| onMeasure/onDraw làm gì? Khi nào invalidate/requestLayout? | Custom View | Tuân thủ MeasureSpec, cache tài nguyên vẽ và kiểm tra accessibility |
| Key của effect/list, rememberUpdatedState và stability? | Jetpack Compose | Identity, phase đọc state, mutation và giới hạn của annotation |
| Offline-first có tránh gửi trùng và mất thao tác không? | Outbox và đồng bộ | Khoảng hở local/remote commit, reconcile và conflict policy |
| Làm sao test được timing, subscription và restoration? | Test Coroutines/StateFlow, ma trận phục hồi | Virtual time thuộc scheduler nào; test nào không tương đương mất process |
| RAM tăng hoặc cuộn giật: bắt đầu đo ở đâu? | Điều tra memory, profiling | Bằng chứng phân biệt leak/cache/churn và frame deadline bị lỡ |
Các bước tiếp theo để hoàn thiện năng lực Senior
- Networking: lỗi, retry và token refresh: phân biệt unknown outcome, request body, authentication và session race.
- Security model và permissions/components: credential, trust boundary, external input và log policy.
- Test strategy: chọn đúng boundary cho SQL, HTTP, lifecycle, timing và release.
- Capstone chat offline: kết nối các bài vào một thiết kế có thể review và kiểm chứng.
Đọc theo một tình huống xuyên suốt
Checkout phục hồi sau mất process
Đọc state recovery, sau đó UI state/event. Phác thảo cart ID, request ID, nguồn xác nhận đơn hàng và màn hình lúc chưa biết server đã commit hay chưa. Thử rotation, STOPPED và mất process như ba trường hợp riêng.
Chat offline không mất hoặc nhân đôi tin nhắn
Đọc outbox, khoảng hở local commit/enqueue và background retry. Dừng client có chủ đích ở từng bước; khi chạy lại, chứng minh mỗi logical message chỉ có một identity ở server.
Màn hình realtime vừa giật vừa giữ Activity cũ
Đọc listener ownership, Flow collection và draw path. Tách hai giả thuyết: leak do lifetime sai, jank do chi phí mỗi frame. Mỗi giả thuyết cần phép đo và cách sửa riêng.
Cách dùng các ví dụ
Các đoạn Kotlin minh họa một boundary hoặc behavior. Bài viết nêu type/dependency giả định và phần chưa triển khai; chúng không phải một ứng dụng Android hoàn chỉnh để copy nguyên vào production. Khi thực hành, bổ sung imports/dependencies, error states, localization và test phù hợp project.
Sau khi đọc, hãy diễn đạt lại bằng bốn ý: cơ chế hoạt động, giả định của giải pháp, trường hợp nó thất bại và phép kiểm chứng. Nếu chưa tự giải thích được một timeline, mở lại phần ví dụ thay vì chỉ học thuộc đáp án.