Activity — là gì, màn hình ứng dụng trong Android và Lifecycle của nó

Tác giả: IT Sectr Đã đăng: 2026-02-22 Thời gian đọc: 7 phút

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 — thành phần Android đại diện cho một màn hình với UI. Được quản lý qua Lifecycle
  • Vòng đời bao gồm 6 callback: onCreate, onStart, onResume, onPause, onStop, onDestroy
  • Intent — cơ chế khởi chạy Activity và truyền dữ liệu giữa các màn hình
  • Manifest — đăng ký bắt buộc mỗi Activity trong AndroidManifest.xml
  • ViewModel — thành phần Jetpack để bảo toàn dữ liệu khi tạo lại Activity

Activity là gì?

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 Activity

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.

CallbackMục đíchHành động của nhà phát triển
onCreateĐược gọi khi tạo ActivityKhởi tạo UI, đăng ký ViewModel
onStartActivity trở nên hiển thịBắt đầu hoạt ảnh, camera, GPS
onResumeActivity nhận được tiêu điểm đầu vàoTiếp tục video, bộ đếm giờ
onPauseActivity mất tiêu điểmLưu bản nháp, dừng hoạt ảnh
onStopActivity bị ẩn bởi màn hình khácGiải phóng tài nguyên nặng
onDestroyActivity bị hủyDọn dẹp đăng ký, Closeable

Các trạng thái của Activity

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.

Các phương thức vòng đời: onCreate, onStart, onResume

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.

kotlin
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.

Khai báo Activity trong AndroidManifest.xml

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.

xml
<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).

Khởi chạy Activity qua Intent

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).

kotlin
// 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.

kotlin
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)
}

Lưu trạng thái khi tạo lại

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: onSaveInstanceStateViewModel.

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.

kotlin
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())
    }
}

Kiến trúc Single Activity và Jetpack

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.

kotlin
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 khác Fragment như thế nào?

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.

Có thể có bao nhiêu Activity trong một ứng dụng?

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 trong Activity là gì?

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.

Làm thế nào để truyền dữ liệu giữa các Activity?

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 trong Android là gì?

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

  • Activity — thành phần Android cơ bản đại diện cho một màn hình với giao diện người dùng được quản lý qua vòng đời
  • Vòng đời bao gồm sáu callback: onCreate, onStart, onResume, onPause, onStop, onDestroy — mỗi callback có mục đích riêng
  • Intent cung cấp khả năng khởi chạy Activity và truyền dữ liệu giữa các màn hình qua lời gọi tường minh và ngầm định
  • AndroidManifest.xml yêu cầu đăng ký bắt buộc mỗi Activity với tên, chủ đề, hướng và bộ lọc
  • ViewModel từ Jetpack bảo toàn dữ liệu khi Activity được tạo lại, thay thế việc lưu thủ công trong onSaveInstanceState
  • Kiến trúc Single Activity với Navigation Component là tiêu chuẩn hiện đại được Google khuyến nghị cho các dự án Android
  • launchMode kiểm soát hành vi của Activity trong ngăn xếp tác vụ: từ standard đến singleInstance cho các màn hình cách ly

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.

Thảo luận dự án

Đọc thêm