Multi-Window là một tập hợp các chế độ đa nhiệm trong Android cho phép chạy nhiều ứng dụng trên màn hình cùng lúc. Hệ thống bao gồm ba chế độ: Split Screen để chia màn hình thành hai phần, Picture-in-Picture cho video trong cửa sổ nhỏ và Freeform cho các cửa sổ có kích thước tùy ý trên màn hình lớn. Theo Android Developers (2025), hỗ trợ Multi-Window là bắt buộc đối với thiết bị có chiều rộng màn hình từ 600 dp trở lên và mọi nhà phát triển phải điều chỉnh ứng dụng của mình cho các thay đổi kích thước cửa sổ có thể xảy ra.
Những điểm chính
Multi-Window là một tính năng của Android được giới thiệu trong phiên bản 7.0 Nougat (API 24) cho phép chạy hai hoặc nhiều ứng dụng trên màn hình cùng lúc. Chế độ này là phản ứng của Google trước sự phổ biến ngày càng tăng của máy tính bảng và thiết bị màn hình lớn, nơi chế độ một tác vụ hạn chế năng suất.
Trước Android 7.0, mỗi ứng dụng chiếm toàn bộ màn hình — khi chuyển đổi giữa các ứng dụng, ứng dụng trước đó bị thu nhỏ. Multi-Window đã thay đổi mô hình này: giờ đây một ứng dụng có thể chiếm một phần màn hình trong khi vẫn duy trì trạng thái hoạt động. Đối với nhà phát triển, điều này có nghĩa là onConfigurationChanged và xử lý thay đổi kích thước trở thành bắt buộc.
Trên Android 12L (2022), Google đã đặt Multi-Window làm chế độ mặc định cho các thiết bị màn hình lớn — tất cả ứng dụng trên máy tính bảng chạy ở chế độ cho phép đa cửa sổ. Ngoại lệ duy nhất là các ứng dụng có lệnh cấm rõ ràng trong tệp kê khai.
Split Screen — chế độ phổ biến nhất. Màn hình được chia thành hai phần theo chiều ngang hoặc chiều dọc, người dùng kéo thanh chia. Có sẵn trên điện thoại và máy tính bảng. Được kích hoạt qua Overview (Recents) — bằng cách kéo biểu tượng ứng dụng đến cạnh trên hoặc dưới.
Picture-in-Picture (PiP) — chế độ dành cho ứng dụng video và điều hướng. Nội dung được hiển thị trong cửa sổ nhỏ nổi (khoảng 15–25% màn hình) có thể di chuyển được. Có sẵn trên Android 8.0+. Để kích hoạt, sử dụng enterPictureInPictureMode() trong Activity.
Freeform — chế độ cho cửa sổ kích thước tùy ý, tương tự như trình quản lý cửa sổ trên máy tính. Có sẵn trên Android TV và một số thiết bị màn hình lớn của nhà sản xuất (Samsung DeX). Các ứng dụng chạy trong cửa sổ có thanh tiêu đề và nút điều khiển.
Khi người dùng kích hoạt Multi-Window, Android tạo một phiên bản Activity mới cho mỗi ứng dụng và phân phối không gian màn hình có sẵn. Các Activity được đặt trong các Task riêng biệt nhưng sử dụng cùng một StackView với thanh chia giữa chúng.
Hệ thống thông báo cho mỗi Activity về sự thay đổi kích thước thông qua onConfigurationChanged(). Nếu Activity không xử lý sự kiện này, nó sẽ được tạo lại. Đối với Split Screen, chiều rộng cửa sổ có thể giảm xuống 220 dp — chiều rộng tối thiểu được nền tảng hỗ trợ.
Android cho phép ứng dụng khai báo chiều rộng tối thiểu thông qua android:minWidth và android:minHeight trong tệp kê khai. Nếu không gian có sẵn nhỏ hơn các giá trị này, Activity sẽ chuyển sang trạng thái tạm dừng.
Để hỗ trợ Multi-Window, bạn cần đặt cờ android:resizeableActivity="true" trong tệp kê khai. Điều này có nghĩa là ứng dụng có thể thay đổi kích thước khi cửa sổ thay đổi. Theo mặc định trên Android 12L+, tất cả ứng dụng được coi là có thể thay đổi kích thước — cờ bị bỏ qua.
Khi kích thước cửa sổ thay đổi, Activity có thể được tạo lại (mặc định) hoặc xử lý sự kiện trong onConfigurationChanged nếu configChanges="screenSize|smallestScreenSize" được chỉ định trong tệp kê khai. Nên chỉ định configChanges cho các Activity chính để tránh mất trạng thái.
<activity
android:name=".MainActivity"
android:resizeableActivity="true"
android:configChanges="screenSize|smallestScreenSize|orientation" />
Đối với ứng dụng không hỗ trợ thay đổi kích thước, Android hiển thị hộp thoại cảnh báo. Trong trường hợp này, khi chuyển sang chế độ đa cửa sổ, hệ thống có thể kết thúc Activity và hiển thị snackbar với đề nghị khởi động lại.
Multi-Window thay đổi vòng đời Activity tiêu chuẩn. Khi một ứng dụng khác trở nên hoạt động trong cửa sổ liền kề, Activity hiện tại nhận được lệnh gọi onPause() nhưng không phải onStop() — nó vẫn hiển thị, mặc dù không được tiêu điểm. Điều này quan trọng: trình phát video nên tiếp tục phát ở onPause, không phải ở onStop.
Nhà phát triển cần phân biệt giữa các trạng thái: onPause + isInMultiWindowMode() = true có nghĩa là chỉ mất tiêu điểm, không phải rời khỏi màn hình. Đối với video và hoạt ảnh, đây là tín hiệu không dừng phát mà chỉ bỏ chọn các phần tử điều khiển.
Khi thoát Multi-Window, onMultiWindowModeChanged() được gọi trước onResume(). Điều này cho cơ hội xây dựng lại giao diện cho chế độ toàn màn hình trước khi người dùng bắt đầu tương tác.
Quy tắc đầu tiên là lưu trạng thái. Trong chế độ đa cửa sổ, Activity có thể được tạo lại bất kỳ lúc nào. Sử dụng SavedStateHandle trong ViewModel hoặc onSaveInstanceState cho tất cả dữ liệu cần duy trì giữa các thay đổi cấu hình.
Quy tắc thứ hai là kiểm thử ở chiều rộng tối thiểu 220 dp. Giá trị này được coi là cửa sổ hẹp nhất trong Split Screen. Giao diện phải duy trì tính dễ đọc và chức năng. Nếu một số phần tử vượt quá giới hạn, hãy sử dụng Window Size Class để chuyển đổi giữa các bố cục.
Quy tắc thứ ba là vô hiệu hóa các chức năng không hoạt động trong Multi-Window. Ví dụ, Camera có thể không khả dụng nếu màn hình quá nhỏ. Hãy kiểm tra isInMultiWindowMode() trước khi khởi động camera hoặc các chức năng toàn màn hình khác.
Các câu hỏi thường gặp
Đặt android:resizeableActivity="false" trong tệp kê khai. Trên Android 12L+, cờ bị bỏ qua đối với thiết bị màn hình lớn, vì vậy để cấm hoàn toàn hãy sử dụng android:maxAspectRatio.
Gọi isInMultiWindowMode() từ Activity. Phương thức trả về true nếu ứng dụng đang chạy ở chế độ Split Screen, PiP hoặc Freeform. Bạn cũng có thể đăng ký theo dõi onMultiWindowModeChanged().
Trên Android TV, chỉ có chế độ Picture-in-Picture khả dụng. Split Screen và Freeform không được hỗ trợ — TV sử dụng một màn hình chính với cửa sổ PiP ở góc.
Dịch vụ nền trước tiếp tục hoạt động bất kể chế độ nào. Tuy nhiên, nếu ứng dụng chuyển sang PiP, hệ thống có thể tạm dừng thực thi để tiết kiệm tài nguyên.
Android hỗ trợ kéo và thả giữa các cửa sổ trong Multi-Window thông qua ClipData và View.OnDragListener. Dữ liệu được truyền qua ContentProvider hoặc Intent với FLAG_GRANT_READ_URI_PERMISSION.
Tóm tắ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