Chào bạn, dưới đây là bộ 50 câu hỏi phỏng vấn Android (Kotlin) từ cơ bản đến nâng cao, được biên soạn kỹ lưỡng kèm giải thích chi tiết và code demo để bạn chuẩn bị tốt nhất cho buổi phỏng vấn.
Bộ 50 Câu Hỏi Phỏng Vấn Android Kotlin Toàn Tập
1. Sự khác biệt giữa val và var trong Kotlin là gì?
Lời giải:
val(value) là biến chỉ đọc (read-only), tương đương vớifinaltrong Java. Một khi đã gán giá trị thì không thể thay đổi.var(variable) là biến có thể thay đổi giá trị (mutable).Code demo:
val name = "Android" // Không thể gán lại
var version = 13
version = 14 // Hợp lệ
2. Null Safety trong Kotlin hoạt động như thế nào?
Lời giải: Kotlin phân biệt rõ ràng giữa kiểu dữ liệu có thể null (
String?) và không thể null (String). Điều này giúp tránh lỗiNullPointerException(NPE) ngay từ khi biên dịch.Code demo:
var a: String = "abc" // Không thể gán null
var b: String? = "abc" // Có thể gán null
b = null
println(b?.length) // Safe call: trả về null nếu b là null
3. "Lateinit" và "Lazy" initialization khác nhau ra sao?
Lời giải:
lateinitdùng chovar, cho phép khởi tạo biến sau (thường dùng trong Dependency Injection hoặconCreate).lazydùng choval, giá trị chỉ được tính toán trong lần đầu tiên truy cập.Code demo:
lateinit var userRepository: UserRepository
val database: Database by lazy {
Database.getInstance()
}
4. Data Class trong Kotlin là gì?
Lời giải: Là lớp chuyên dùng để chứa dữ liệu. Trình biên dịch sẽ tự động tạo các hàm
equals(),hashCode(),toString(), vàcopy().Code demo:
data class User(val id: Int, val name: String)
5. Companion Object là gì?
Lời giải: Kotlin không có từ khóa
static.companion objectđược dùng để định nghĩa các thành viên thuộc về lớp chứ không phải instance của lớp.Code demo:
class Config {
companion object {
const val BASE_URL = "https://api.example.com"
}
}
6. Sự khác biệt giữa List và MutableList?
Lời giải:
Listlà interface chỉ đọc (không có hàmaddhoặcremove).MutableListcho phép sửa đổi các phần tử bên trong.Code demo:
val list = listOf(1, 2) // Immutable
val mList = mutableListOf(1, 2)
mList.add(3)
7. Extension Functions là gì?
Lời giải: Cho phép thêm chức năng mới vào một lớp có sẵn mà không cần kế thừa lớp đó.
Code demo:
fun String.isEmail(): Boolean = this.contains("@")
val email = "test@gmail.com"
println(email.isEmail())
8. Sealed Class là gì?
Lời giải: Là lớp dùng để biểu diễn một hệ thống phân cấp lớp bị hạn chế. Các subclass phải được định nghĩa trong cùng một file. Thường dùng cho State Management (Success, Error, Loading).
Code demo:
sealed class Result {
data class Success(val data: String) : Result()
object Loading : Result()
}
9. Higher-Order Functions là gì?
Lời giải: Là hàm nhận một hàm khác làm tham số hoặc trả về một hàm.
Code demo:
fun operate(a: Int, b: Int, action: (Int, Int) -> Int): Int {
return action(a, b)
}
10. Scope Functions: let, run, with, apply, also?
Lời giải: Các hàm này thực thi một khối code trên một đối tượng. Khác nhau ở giá trị trả về và cách tham chiếu đối tượng (
ithoặcthis).Code demo:
val person = Person().apply { name = "Diep" } // Trả về chính object
val length = person.let { it.name.length } // Trả về kết quả lambda
11. Coroutines là gì?
Lời giải: Là một giải pháp quản lý luồng nhẹ (lightweight threads), giúp xử lý các tác vụ bất đồng bộ (API call, Database) mà không làm treo UI.
Code demo:
viewModelScope.launch {
val data = repository.getData() // suspend function
}
12. Suspend function là gì?
Lời giải: Là hàm có thể tạm dừng việc thực thi mà không làm chặn luồng hiện tại, sau đó tiếp tục khi dữ liệu đã sẵn sàng. Chỉ gọi được từ coroutine hoặc suspend function khác.
Code demo:
suspend fun fetchUser(): User = withContext(Dispatchers.IO) { ... }
13. Dispatchers trong Coroutines (Main, IO, Default)?
Lời giải:
Main: Chạy trên UI thread.IO: Dành cho các tác vụ nhập xuất (mạng, file).Default: Cho các tác vụ tốn CPU (sắp xếp list, xử lý ảnh).Code demo:
launch(Dispatchers.IO) { /* call API */ }
14. Activity Lifecycle gồm những bước nào?
Lời giải:
onCreate(),onStart(),onResume(),onPause(),onStop(),onDestroy(),onRestart().
15. Sự khác biệt giữa onStart() và onResume()?
Lời giải:
onStart()khi Activity bắt đầu hiển thị với người dùng.onResume()khi Activity sẵn sàng tương tác (có focus).
16. ViewModel là gì? Tại sao nên dùng nó?
Lời giải: Lưu trữ và quản lý dữ liệu liên quan đến UI theo vòng đời. Nó giúp dữ liệu không bị mất khi cấu hình thay đổi (như xoay màn hình).
17. LiveData vs StateFlow?
Lời giải:
LiveDatathuộc Android, nhận biết vòng đời (Lifecycle-aware).StateFlowthuộc Kotlin Coroutines, mạnh mẽ hơn nhưng cần xử lý vòng đời thủ công quarepeatOnLifecycle.
18. Fragment Lifecycle khác gì Activity?
Lời giải: Có thêm các hàm như
onAttach(),onCreateView(),onDestroyView(),onDetach().
19. Cách truyền dữ liệu giữa các Fragments?
Lời giải: Dùng
Shared ViewModel(khuyên dùng),Bundle(Arguments), hoặcFragment Result API.
20. Context trong Android là gì?
Lời giải: Là interface chứa thông tin về môi trường ứng dụng, cho phép truy cập tài nguyên (Resources), khởi chạy Activity, v.v. Có
ApplicationContextvàActivityContext.
21. Intent là gì? Phân biệt Explicit và Implicit Intent?
Lời giải:
Explicit: Chỉ rõ component sẽ chạy (ví dụDetailActivity::class.java).Implicit: Chỉ nêu hành động (ví dụACTION_VIEWđể mở browser).
22. RecyclerView hoạt động như thế nào?
Lời giải: Tối ưu hóa việc hiển thị danh sách lớn bằng cách tái sử dụng (recycle) các view cũ thay vì tạo mới liên tục. Cần
AdaptervàViewHolder.
23. DiffUtil là gì?
Lời giải: Là tiện ích giúp
RecyclerViewtính toán sự khác biệt giữa danh sách cũ và mới để cập nhật chính xác những phần tử thay đổi, thay vì gọinotifyDataSetChanged().
24. ConstraintLayout có lợi ích gì?
Lời giải: Giúp tạo giao diện phức tạp với cấu trúc phẳng (flat hierarchy), giảm độ sâu của view tree, từ đó tăng hiệu năng render.
25. View Binding vs Data Binding?
Lời giải:
View Bindingchỉ thay thếfindViewById.Data Bindingcho phép gán dữ liệu trực tiếp vào XML.
26. Dependency Injection (DI) là gì?
Lời giải: Kỹ thuật cung cấp các object mà một class cần từ bên ngoài thay vì để class đó tự tạo. Giúp code dễ test và bảo trì (ví dụ: Hilt, Koin).
27. Hilt trong Android là gì?
Lời giải: Là thư viện DI chuẩn cho Android được Google khuyên dùng, xây dựng dựa trên Dagger nhưng đơn giản hơn nhiều.
28. Retrofit là gì?
Lời giải: Thư viện Type-safe HTTP client dùng để gọi API, chuyển đổi JSON sang object một cách tự động.
29. Room Persistence Library?
Lời giải: Là một lớp trừu tượng nằm trên SQLite, giúp quản lý database cục bộ dễ dàng hơn với các annotation
@Entity,@Dao,@Database.
30. Cách xử lý đa luồng (Concurrency) trong Android?
Lời giải: Dùng Coroutines (khuyên dùng hiện nay), Thread/Handler, hoặc RxJava.
31. WorkManager là gì?
Lời giải: Dùng để chạy các tác vụ nền (background tasks) ngay cả khi app bị đóng hoặc thiết bị khởi động lại, đảm bảo tác vụ sẽ được thực thi.
32. Service trong Android là gì?
Lời giải: Component chạy ngầm không có UI. Có 2 loại:
Started ServicevàBound Service. Lưu ýForeground Serviceyêu cầu notification.
33. Broadcast Receiver là gì?
Lời giải: Giúp ứng dụng lắng nghe các sự kiện từ hệ thống (Pin yếu, mất mạng) hoặc từ ứng dụng khác.
34. Content Provider là gì?
Lời giải: Quản lý việc truy cập vào tập dữ liệu có cấu trúc và chia sẻ dữ liệu giữa các ứng dụng khác nhau (ví dụ: truy cập Danh bạ).
35. Phân biệt launch và async trong Coroutines?
Lời giải:
launchdùng cho tác vụ "fire and forget", không trả về giá trị.asynctrả về mộtDeferredvà bạn dùngawait()để lấy kết quả.
36. SOLID principles trong Android là gì?
Lời giải: 5 nguyên tắc thiết kế phần mềm giúp code linh hoạt hơn: Single Responsibility, Open/Closed, Liskov Substitution, Interface Segregation, Dependency Inversion.
37. MVVM Architecture là gì?
Lời giải: Model-View-ViewModel. Tách biệt logic xử lý dữ liệu (Model), logic giao diện (ViewModel) và hiển thị (View/Activity).
38. Jetpack Compose là gì?
Lời giải: Framework hiện đại để xây dựng giao diện Android theo phong cách Declarative (khai báo), sử dụng hoàn toàn bằng Kotlin thay vì XML.
39. Recomposition trong Compose là gì?
Lời giải: Là quá trình gọi lại các hàm Composable khi dữ liệu đầu vào (State) thay đổi để cập nhật UI.
40. Remember và State trong Compose?
Lời giải:
mutableStateOfdùng để giữ giá trị,remembergiúp lưu trữ giá trị đó qua các lần Recomposition.
41. Navigation Component là gì?
Lời giải: Thư viện giúp quản lý việc chuyển màn hình, truyền dữ liệu và quản lý Backstack một cách đồng nhất.
42. Làm thế nào để tránh Memory Leak?
Lời giải: Không lưu context của Activity trong biến static, hủy đăng ký Listener/Observer trong
onDestroy(), dùng WeakReference khi cần.
43. ANR (Application Not Responding) là gì?
Lời giải: Lỗi xảy ra khi Main Thread bị chặn quá lâu (thường > 5 giây) do xử lý tác vụ nặng.
44. SharedPreferences vs DataStore?
Lời giải:
DataStorelà giải pháp mới thay thếSharedPreferences, hỗ trợ Coroutines, xử lý lỗi tốt hơn và chạy bất đồng bộ hoàn toàn.
45. Cách tối ưu dung lượng File APK?
Lời giải: Sử dụng Proguard/R8, dùng định dạng ảnh WebP, xóa tài nguyên không dùng (Lint), sử dụng Android App Bundle (.aab).
46. Phân biệt == và === trong Kotlin?
Lời giải:
==kiểm tra giá trị (gọi hàmequals()),===kiểm tra tham chiếu (hai biến có trỏ cùng một vùng nhớ không).
47. Inline function là gì?
Lời giải: Khi dùng từ khóa
inline, trình biên dịch sẽ copy code của hàm đó vào nơi gọi, giúp giảm chi phí cấp phát bộ nhớ cho lambda expression.
48. Kotlin Flow là gì?
Lời giải: Là luồng dữ liệu lạnh (cold stream), phát ra nhiều giá trị theo thời gian và kết thúc thành công hoặc có lỗi.
49. Koin là gì?
Lời giải: Một thư viện Dependency Injection nhẹ cho Kotlin, sử dụng DSL (Domain Specific Language) thay vì code generation như Hilt.
50. Vì sao Android dùng Gradle?
Lời giải: Gradle là hệ thống build tự động, giúp quản lý thư viện (dependencies), định dạng cấu hình build (build types, flavors) và tự động hóa quy trình đóng gói ứng dụng.