Activity — một thành phần cơ bản của ứng dụng Android đại diện cho một màn hình duy nhất có giao diện người dùng. Hệ thống quản lý các màn hình thông qua một vòng đời nghiêm ngặt — các callback onCreate, onResume và onDestroy. Mỗi Activity được khai báo trong AndroidManifest.xml và được khởi chạy qua Intent. Đọc thêm về lịch sử của Android trong tài liệu chính thức của Google.
Những điểm chính
Activity — một thành phần chính của ứng dụng Android cung cấp cửa sổ để tương tác với người dùng. Mỗi Activity quản lý một màn hình riêng biệt: danh sách tác vụ, biểu mẫu đăng nhập, trình xem ảnh. Hệ thống Android tạo Activity khi được yêu cầu và hủy nó khi các ứng dụng khác cần bộ nhớ.
Activity xuất hiện lần đầu tiên trong Android 1.0 (2008) và vẫn là khối xây dựng chính của giao diện. Theo Google (2026), 98% ứng dụng trên Google Play chứa ít nhất một Activity. Trong kiến trúc hiện đại, Google khuyến nghị một Activity với nhiều Fragment, tuy nhiên ứng dụng đa màn hình cổ điển vẫn là một thực tiễn phổ biến.
Activity stack (back stack) — ngăn xếp tác vụ lưu trữ lịch sử điều hướng. Khi người dùng nhấn "Quay lại", Activity hiện tại bị hủy và Activity trước đó được khôi phục. Hệ thống quản lý ngăn xếp tự động, nhưng nhà phát triển có thể kiểm soát hành vi thông qua launchMode và cờ Intent.
Vòng đời của Activity là tập hợp các trạng thái và callback mà một màn hình trải qua từ khi tạo đến khi hủy. Hiểu Lifecycle là cực kỳ quan trọng: xử lý trạng thái sai dẫn đến rò rỉ bộ nhớ, mất dữ liệu và ứng dụng bị treo.
Hệ thống Android gọi các callback theo một thứ tự nghiêm ngặt. Nhà phát triển ghi đè các phương thức cần thiết để khởi tạo tài nguyên, lưu dữ liệu và giải phóng bộ nhớ. Mỗi callback có một cặp tương ứng: onCreate ↔ onDestroy, onStart ↔ onStop, onResume ↔ onPause.
| Callback | Mục đích | Hành động của nhà phát triển |
|---|---|---|
| onCreate | Được gọi khi tạo Activity | Khởi tạo UI, đăng ký ViewModel |
| onStart | Activity trở nên hiển thị | Bắt đầu hoạt ảnh, camera, GPS |
| onResume | Activity nhận được tiêu điểm đầu vào | Tiếp tục video, bộ đếm giờ |
| onPause | Activity mất tiêu điểm | Lưu bản nháp, dừng hoạt ảnh |
| onStop | Activity bị ẩn bởi màn hình khác | Giải phóng tài nguyên nặng |
| onDestroy | Activity bị hủy | Dọn dẹp đăng ký, Closeable |
Có bốn trạng thái của Activity: Running (onResume hoạt động), Paused (hiển thị nhưng không có tiêu điểm), Stopped (không hiển thị), Destroyed (đã hủy). Hệ thống có thể kết thúc Activity ở trạng thái Stopped khi thiếu bộ nhớ — dữ liệu phải được lưu trong onSaveInstanceState.
Hãy xem xét ba phương thức chính của vòng đời Activity với ví dụ Kotlin. onCreate — điểm vào, được gọi một lần. Tại đây diễn ra việc liên kết bố cục qua setContentView, khởi tạo RecyclerView, đăng ký LiveData. onStart — Activity trở nên hiển thị với người dùng. onResume — Activity nhận tiêu điểm và sẵn sàng tương tác.
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val recyclerView = findViewById<RecyclerView>(R.id.rv_items)
recyclerView.layoutManager = LinearLayoutManager(this)
loadItems()
}
override fun onStart() {
super.onStart()
startLocationUpdates()
}
override fun onResume() {
super.onResume()
resumeVideoPlayer()
}
}Trong ví dụ, onCreate khởi tạo RecyclerView và tải dữ liệu. onStart bắt đầu cập nhật vị trí địa lý — tài nguyên chỉ nên hoạt động khi màn hình hiển thị. onResume tiếp tục video đã bị tạm dừng trong onPause. Sự tách biệt này ngăn chặn công việc nền không cần thiết.
Mỗi Activity phải được khai báo trong tệp AndroidManifest.xml. Nếu không đăng ký, hệ thống sẽ không tìm thấy màn hình và ném ngoại lệ ActivityNotFoundException. Tệp kê khai chỉ định tên lớp, chủ đề, hướng, launchMode và bộ lọc Intent.
<application
android:allowBackup="true"
android:label="@string/app_name"
android:theme="@style/Theme.MyApp">
<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>
<activity
android:name=".DetailActivity"
android:parentActivityName=".MainActivity" />
</application>Cờ exported xác định liệu các ứng dụng khác có thể khởi chạy Activity hay không. Cho màn hình chính exported=true, cho màn hình nội bộ — false. Thuộc tính parentActivityName kích hoạt điều hướng "Lên" tiêu chuẩn (Up Navigation).
Intent — một đối tượng mô tả hành động cần thực hiện. Trong ngữ cảnh Activity, Intent được sử dụng để khởi chạy một màn hình khác với truyền dữ liệu. Intent có thể là tường minh (chỉ định một lớp cụ thể) và ngầm định (chỉ định một hành động, hệ thống chọn thành phần phù hợp).
// Intent tường minh — khởi chạy DetailActivity với dữ liệu
val intent = Intent(this, DetailActivity::class.java).apply {
putExtra("item_id", itemId)
putExtra("item_name", itemName)
}
startActivity(intent)
// Nhận dữ liệu trong DetailActivity
val itemId = intent.getLongExtra("item_id", 0L)
val itemName = intent.getStringExtra("item_name") ?: ""Để nhận kết quả từ một Activity đã khởi chạy, Activity Result API được sử dụng, thay thế cho startActivityForResult đã lỗi thời. API mới an toàn về kiểu, khai báo và hoạt động với Jetpack Compose.
private val getResult = registerForActivityResult(
ActivityResultContracts.StartActivityForResult()
) { result ->
if (result.resultCode == Activity.RESULT_OK) {
val data = result.data?.getStringExtra("result_key")
}
}
fun openPicker() {
val intent = Intent(this, PickerActivity::class.java)
getResult.launch(intent)
}Khi xoay màn hình hoặc thay đổi cấu hình, Android tạo lại Activity — gọi tuần tự onDestroy và onCreate. Nếu không lưu trạng thái, người dùng sẽ mất dữ liệu đã nhập, vị trí cuộn và các mục đã chọn. Android cung cấp hai cơ chế để giải quyết vấn đề này: onSaveInstanceState và ViewModel.
onSaveInstanceState lưu dữ liệu đơn giản trong Bundle trước khi gọi onDestroy. ViewModel từ Jetpack chịu được việc tạo lại Activity và lưu trữ dữ liệu trong bộ nhớ, hiệu quả hơn cho các đối tượng phức tạp và yêu cầu mạng.
class MainActivity : AppCompatActivity() {
private val viewModel: MainViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// ViewModel tự động lưu dữ liệu
viewModel.items.observe(this) { items ->
updateAdapter(items)
}
}
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putInt("scroll_position", recyclerView.computeVerticalScrollOffset())
}
}Cách tiếp cận hiện đại của Google là kiến trúc Single Activity với một Activity và nhiều Fragment. Ứng dụng sử dụng một MainActivity và tất cả điều hướng được xử lý bởi Navigation Component thông qua NavHostFragment. Ưu điểm: điều hướng tập trung, ViewModel dùng chung cho mỗi màn hình, xử lý Deep Links chính xác.
Jetpack Navigation Component tự động hóa việc quản lý back stack, hoạt ảnh chuyển tiếp và truyền đối số. NavHostFragment được đặt trong bố cục Activity và đồ thị điều hướng (NavGraph) mô tả tất cả các màn hình và kết nối giữa chúng. Cách tiếp cận này được Google khuyến nghị cho các dự án mới và tuân theo nguyên tắc Material Design.
class MainActivity : AppCompatActivity() {
private val navController by lazy {
findViewById<NavHostFragment>(R.id.nav_host_fragment)
.navController
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Thiết lập NavigationUI cho AppBar
setupActionBarWithNavController(navController)
}
override fun onSupportNavigateUp() =
navController.navigateUp() || super.onSupportNavigateUp()
}Câu hỏi thường gặp
Activity — màn hình ứng dụng hoàn chỉnh với vòng đời riêng. Fragment — một phần UI bên trong Activity chịu được việc tạo lại Activity và phụ thuộc vào Lifecycle của nó. Activity là bắt buộc, Fragment là tùy chọn.
Không có giới hạn. Mỗi màn hình thường đại diện cho một Activity riêng biệt. Ứng dụng đơn giản chỉ cần một, cho ứng dụng đa màn hình — từ 5 đến 20. Google khuyến nghị một Activity với nhiều Fragment.
launchMode xác định cách một Activity được tạo trong ngăn xếp tác vụ. Bốn chế độ: standard (tạo phiên bản mới), singleTop, singleTask (một phiên bản cho mỗi tác vụ) và singleInstance (tác vụ cách ly). Chế độ được đặt trong AndroidManifest.xml.
Qua Intent — một đối tượng với extras (putExtra) có thể chứa kiểu nguyên thủy, chuỗi, Parcelable hoặc Serializable. Để giao tiếp phản hồi, Activity Result API được sử dụng — thay thế hiện đại, an toàn về kiểu cho startActivityForResult.
Configuration Change — việc tạo lại Activity khi thay đổi cấu hình (xoay màn hình, thay đổi ngôn ngữ, bàn phím). Hệ thống gọi onDestroy → onCreate. Để lưu dữ liệu, hãy sử dụng onSaveInstanceState hoặc ViewModel từ Jetpack.
Tổng kết
Chúng tôi sẽ phát triển ứng dụng di động chìa khóa trao tay
IT Sectr tạo các ứng dụng iOS và Android cho các công ty khởi nghiệp và doanh nghiệp từ năm 2017. Chúng tôi sẽ tư vấn và đề xuất giải pháp tốt nhất cho bạn.
Đọc thêm