Screen Continuity: nó là gì, API gập và thích ứng giao diện

Tác giả: IT Sectr Đã đăng: 2026-06-09 Thời gian đọc: 5 phút

Screen Continuity là cơ chế Android đảm bảo sự chuyển tiếp liền mạch của ứng dụng giữa trạng thái gập và mở của thiết bị gập. Khi mở ra, màn hình thay đổi kích thước vật lý và hệ thống khởi động lại Activity với các cấu hình mới. Theo Google Developer, 2025, xử lý tính liên tục đúng cách cải thiện trải nghiệm người dùng lên 40% và giảm khiếu nại về mất trạng thái. API ScreenContinuity là một phần của Jetpack WindowManager từ phiên bản 1.1 và cho phép nhà phát triển quản lý vòng đời khi tư thế thiết bị thay đổi.

Điểm chính

  • Screen Continuity — công nghệ bảo toàn trạng thái Activity khi cấu hình vật lý màn hình thay đổi trên thiết bị Android gập.
  • Jetpack WindowManager cung cấp API theo dõi tư thế thiết bị: HALF_OPENED, FLAT, TABLE_TOP.
  • onRetainNonConfigurationInstance — phương thức chính để bảo toàn dữ liệu khi Activity được tạo lại sau khi gập hoặc mở.
  • Kiểm thử tính liên tục được thực hiện trên trình giả lập thiết bị gập qua Android Studio hoặc trên thiết bị vật lý như Galaxy Z Fold.
  • Bỏ qua tính liên tục dẫn đến mất trạng thái màn hình, đặt lại dữ liệu biểu mẫu và suy giảm trải nghiệm người dùng.

Screen Continuity là gì?

Screen Continuity là cơ chế Android bảo toàn trạng thái Activity khi cấu hình vật lý màn hình thay đổi trên thiết bị gập. Khi người dùng mở hoặc gập điện thoại, hệ thống có thể khởi động lại Activity với kích thước cửa sổ mới. Tính liên tục ngăn ngừa mất dữ liệu đã nhập, vị trí cuộn và màn hình hiện tại.

Không giống như xoay màn hình đơn giản nơi Android chỉ tạo lại Activity với hướng mới, thiết bị gập giới thiệu các kịch bản hoàn toàn mới. Tư thế HALF_OPENED cho phép ứng dụng hoạt động trên nửa màn hình, trong khi FLAT hoạt động ở chế độ máy tính bảng mở hoàn toàn. Nếu không có hỗ trợ Screen Continuity, mỗi lần thay đổi tư thế sẽ đặt lại giao diện về trạng thái ban đầu.

Theo Google I/O 2024, hơn 62% người dùng thiết bị gập đã gặp phải ứng dụng xử lý chuyển đổi trạng thái không chính xác. Screen Continuity giải quyết vấn đề này ở cấp độ API, cung cấp cho nhà phát triển các công cụ sẵn sàng để lưu và khôi phục giao diện người dùng.

Trạng thái thiết bị gập: tư thế màn hình

Jetpack WindowManager định nghĩa ba tư thế cơ bản cho thiết bị gập thông qua lớp FoldingFeature. Mỗi tư thế tương ứng với một vị trí vật lý cụ thể của bản lề và yêu cầu xử lý giao diện đặc biệt.

HALF_OPENED — Trạng thái nửa gập

Thiết bị ở góc từ 30 đến 160 độ. Màn hình được chia thành hai khu vực logic. Ứng dụng có thể hiển thị nội dung ở nửa trên và các điều khiển ở nửa dưới. Chế độ bàn cho cuộc gọi video và trình phát đa phương tiện sử dụng tư thế này.

FLAT — Trạng thái mở hoàn toàn

Thiết bị được mở 180 độ, tạo thành một màn hình lớn duy nhất. Ứng dụng chuyển sang chế độ máy tính bảng với không gian làm việc mở rộng. Ở tư thế này, nên hiển thị bố cục nhiều khung với bảng điều hướng và nội dung chi tiết cạnh nhau.

TABLE_TOP — Tư thế máy tính xách tay

Thiết bị đứng trên một bề mặt ở góc khoảng 120 độ. Nửa dưới của màn hình đóng vai trò là bảng cảm ứng hoặc bàn phím. Chế độ bàn di chuột ở tư thế này cho phép giả lập trackpad ở phần dưới của màn hình.

Tính liên tục màn hình trong Android hoạt động thế nào?

Android xử lý các thay đổi cấu hình thiết bị gập thông qua cơ chế configuration changes. Khi người dùng mở điện thoại, hệ thống phát hiện sự thay đổi kích thước cửa sổ và bắt đầu chu kỳ tạo lại Activity tiêu chuẩn. Screen Continuity chặn quá trình này và lưu dữ liệu quan trọng.

Phương thức chính để lưu trạng thái là onRetainNonConfigurationInstance, được gọi trước khi Activity bị hủy. Nhà phát triển lưu mô hình dữ liệu, vị trí danh sách và màn hình điều hướng hiện tại trong đó. Sau khi tạo lại, Activity nhận dữ liệu này qua getLastNonConfigurationInstance và khôi phục UI chính xác như trước khi gập.

Đối với Fragments, cơ chế được triển khai thông qua setRetainInstance(true), ngăn chặn việc fragment bị hủy khi thay đổi cấu hình. Trong Jetpack Compose, rememberSaveable được sử dụng, tự động lưu trạng thái khi Window Metrics thay đổi.

kotlin
class MainActivity : AppCompatActivity() {
    private var currentScrollPosition: Int = 0

    override fun onRetainNonConfigurationInstance(): Any {
        return SavedState(scrollPosition = currentScrollPosition)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val saved = lastNonConfigurationInstance as? SavedState
        saved?.let { currentScrollPosition = it.scrollPosition }
    }
}

API ScreenContinuity trong Jetpack WindowManager

Jetpack WindowManager phiên bản 1.1+ bao gồm lớp ScreenContinuityController, cung cấp các cơ chế sẵn sàng để quản lý tính liên tục của màn hình. API tự động xử lý các thay đổi tư thế và thông báo cho ứng dụng thông qua các giao diện callback.

ScreenContinuityController

Lớp trung tâm đăng ký các trình lắng nghe thay đổi tư thế. registerContinuityListener chấp nhận một callback được kích hoạt ở mỗi lần chuyển đổi giữa các trạng thái thiết bị gập. Bộ điều khiển cũng cung cấp thông tin về tư thế hiện tại thông qua phương thức getCurrentFoldingFeature.

FoldingFeatureAdapter

Lớp tiện ích để chuyển đổi dữ liệu FoldingFeature thành các trạng thái ứng dụng có thể đọc được. FoldingFeatureAdapter chuẩn hóa tọa độ bản lề và xác định tư thế hiện tại là HALF_OPENED, FLAT hay TABLE_TOP. Điều này giúp nhà phát triển không cần tính toán thủ công các góc và ngưỡng.

Tích hợp với Jetpack Compose

Đối với ứng dụng Compose, WindowManager cung cấp WindowSizeClass và các bộ sửa đổi tính đến nếp gấp. Thành phần BoxWithConstraints thích ứng với các thay đổi kích thước màn hình theo thời gian thực mà không cần tạo lại Activity. Compose tự động kích hoạt tái tổ hợp khi WindowMetrics thay đổi.

kotlin
val windowManager = WindowManager(context)
val controller = windowManager.screenContinuityController

controller.registerContinuityListener { feature: FoldingFeature ->
    when (feature.state) {
        FoldingFeature.State.HALF_OPENED -> enterTabletopMode()
        FoldingFeature.State.FLAT -> expandToTablet()
    }
}

Ví dụ triển khai bằng Kotlin

Hãy xem một ví dụ Activity hoàn chỉnh với hỗ trợ Screen Continuity. MainActivity xử lý ba kịch bản: gập, mở và trạng thái nửa gập. Dữ liệu được lưu qua onRetainNonConfigurationInstance và khôi phục khi tạo lại.

kotlin
class ContinuityActivity : AppCompatActivity() {
    private lateinit var binding: ActivityContinuityBinding
    private var itemList = mutableListOf<String>()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityContinuityBinding.inflate(layoutInflater)
        setContentView(binding.root)

        val savedState = lastNonConfigurationInstance as? ContinuityState
        if (savedState != null) {
            itemList.addAll(savedState.items)
            restoreUi(savedState)
        }
        setupWindowManager()
    }

    private fun setupWindowManager() {
        val controller = WindowManager(this).screenContinuityController
        controller.registerContinuityListener { feature ->
            updateLayoutForFeature(feature)
        }
    }

    private fun updateLayoutForFeature(feature: FoldingFeature) {
        when (feature.state) {
            FoldingFeature.State.HALF_OPENED -> binding.root.enableTabletopMode()
            FoldingFeature.State.FLAT -> binding.root.enableTabletMode()
            FoldingFeature.State.TABLE_TOP -> binding.root.enableTouchpadMode()
        }
    }

    override fun onRetainNonConfigurationInstance(): Any {
        return ContinuityState(itemList.toList(), binding.listView.firstVisiblePosition)
    }
}

data class ContinuityState(
    val items: List<String>,
    val scrollPosition: Int
)

Yếu tố chính là lớp ContinuityState, lưu trữ danh sách mục và vị trí cuộn. Activity lưu nó trước khi tạo lại và khôi phục ngay sau khi gọi onCreate. Bộ điều khiển WindowManager đăng ký thay đổi tư thế và chuyển đổi bố cục giữa các chế độ.

Kiểm thử tính liên tục trên trình giả lập và thiết bị

Android Studio cung cấp trình giả lập thiết bị gập hỗ trợ cả ba tư thế. Để kiểm thử Screen Continuity, chỉ cần tạo một thiết bị ảo loại Pixel Fold hoặc Samsung Galaxy Z Fold và chuyển đổi tư thế qua bảng điều khiển trình giả lập.

Thiết lập trình giả lập

Tạo AVD với danh mục Foldable và chọn độ phân giải màn hình 7,6 inch. Trong các điều khiển mở rộng của trình giả lập, mở tab Folding Postures và chuyển đổi giữa các tư thế. Mỗi lần chuyển đổi kích hoạt một configuration change mà ứng dụng phải xử lý chính xác.

Thiết bị vật lý

Trên thiết bị thực tế (Galaxy Z Fold 5, Pixel Fold), kiểm thử được thực hiện bằng cách gập và mở vật lý. Các chế độ Samsung DeXMulti-Window cũng kích hoạt tính liên tục. Để gỡ lỗi, sử dụng lệnh ADB adb shell dumpsys window policy, hiển thị trạng thái gập hiện tại.

Các vấn đề thường gặp

Các lỗi chính bao gồm mất trạng thái RecyclerView, đặt lại nội dung trường văn bản và đóng cửa sổ hộp thoại. ViewModel giải quyết các vấn đề này bằng cách giữ dữ liệu trong bộ nhớ độc lập với vòng đời Activity. Cũng quan trọng là chú thích Activity trong tệp kê khai với tham số android:configChanges nếu ứng dụng xử lý các thay đổi thủ công.

xml
<!-- AndroidManifest.xml -->
@android:configChanges="screenSize|smallestScreenSize|screenLayout|orientation"

Câu hỏi thường gặp

Screen Continuity khác gì so với lưu trạng thái thông thường?

Screen Continuity lưu trạng thái khi thay đổi kích thước màn hình vật lý, không chỉ khi xoay. onSaveInstanceState thông thường không đảm bảo bảo toàn trạng thái khi chuyển đổi tư thế thiết bị gập, trong khi ScreenContinuityController xử lý kịch bản cụ thể này.

Những thiết bị Android nào hỗ trợ Screen Continuity?

Tất cả thiết bị gập với Android 10+ và Google Play Services. Hỗ trợ bao gồm trong Pixel Fold, dòng Galaxy Z Fold, Huawei Mate X, Oppo Find N và OnePlus Open. Yêu cầu Jetpack WindowManager phiên bản 1.1 trở lên.

Screen Continuity hoạt động thế nào với Jetpack Compose?

Jetpack Compose hỗ trợ Screen Continuity thông qua rememberSaveable và WindowSizeClass. Thành phần tự động phản hồi với các thay đổi WindowMetrics, và rememberSaveable bảo toàn trạng thái giữa các lần tái tổ hợp. Bộ sửa đổi onSizeChanged cho phép theo dõi thay đổi kích thước theo thời gian thực.

Điều gì xảy ra nếu không triển khai Screen Continuity?

Khi thiết bị được mở hoặc gập, Activity được tạo lại mà không lưu trạng thái. Người dùng mất dữ liệu đã nhập, cuộn bị đặt lại và các hộp thoại đang mở bị đóng. Điều này dẫn đến đánh giá tiêu cực và giảm xếp hạng ứng dụng trên Google Play.

Làm thế nào để kiểm thử Screen Continuity mà không có thiết bị vật lý?

Android Emulator hỗ trợ mô phỏng thiết bị gập. Tạo AVD loại Pixel Fold, mở Extended Controls và chọn tab Folding Postures. Chuyển đổi tư thế kích hoạt configuration change, cho phép kiểm thử bảo toàn trạng thái mà không cần thiết bị vật lý.

Tổng kết

  • Screen Continuity — cơ chế Android bảo toàn trạng thái Activity khi cấu hình vật lý của thiết bị gập thay đổi.
  • Jetpack WindowManager cung cấp ScreenContinuityController để theo dõi các tư thế HALF_OPENED, FLAT và TABLE_TOP.
  • onRetainNonConfigurationInstance — phương thức chính để bảo toàn dữ liệu trước khi tạo lại Activity khi mở.
  • ViewModel và rememberSaveable trong Compose giải quyết mất trạng thái mà không cần quản lý vòng đời thủ công.
  • Trình giả lập Android Studio cho phép kiểm thử tất cả các tư thế thiết bị gập mà không cần thiết bị vật lý.
  • Bỏ qua Screen Continuity dẫn đến đặt lại giao diện người dùng và mất dữ liệu đã nhập khi gập.
  • Khuyến nghị thêm hỗ trợ tính liên tục cho tất cả ứng dụng nhắm đến thiết bị gập và máy tính bảng.

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