Tính năng màn hình kiểu máy tính cho phép người dùng chạy đồng thời nhiều ứng dụng trong các cửa sổ ứng dụng có thể thay đổi kích thước để có trải nghiệm linh hoạt như trên máy tính.
Trong hình 1, bạn có thể thấy cách bố trí màn hình khi bật tính năng tạo cửa sổ trên máy tính. Những điều cần lưu ý:
- Người dùng có thể chạy đồng thời nhiều ứng dụng song song.
 - Thanh tác vụ nằm ở vị trí cố định ở cuối màn hình, cho biết các ứng dụng đang chạy. Người dùng có thể ghim ứng dụng để truy cập nhanh.
 - Thanh tiêu đề mới có thể tuỳ chỉnh sẽ trang trí phần trên cùng của mỗi cửa sổ bằng các chế độ điều khiển như thu nhỏ và phóng to.
 
    Theo mặc định, các ứng dụng sẽ mở ở chế độ toàn màn hình trên máy tính bảng Android. Để chạy một ứng dụng ở chế độ cửa sổ trên máy tính, hãy nhấn và giữ tay cầm cửa sổ ở đầu màn hình rồi kéo tay cầm trong giao diện người dùng, như trong hình 2.
Khi một ứng dụng mở ở chế độ cửa sổ trên máy tính, các ứng dụng khác cũng sẽ mở ở chế độ cửa sổ trên máy tính.
Người dùng cũng có thể gọi tính năng tạo cửa sổ trên máy tính từ trình đơn xuất hiện bên dưới phần điều khiển cửa sổ khi bạn nhấn hoặc nhấp vào phần điều khiển hoặc dùng phím tắt phím Meta (Windows, Command hoặc Search) + Ctrl + Down.
Người dùng thoát khỏi chế độ cửa sổ trên máy tính bằng cách đóng tất cả các cửa sổ đang hoạt động hoặc bằng cách lấy tay nắm cửa sổ ở đầu cửa sổ trên máy tính và kéo ứng dụng lên đầu màn hình. Phím tắt Meta + H cũng thoát chế độ màn hình kiểu máy tính và chạy lại ứng dụng ở chế độ toàn màn hình.
Để quay lại chế độ cửa sổ trên máy tính, hãy nhấn hoặc nhấp vào ô không gian trên máy tính trong màn hình Gần đây.
Khả năng thay đổi kích thước và chế độ tương thích
Trong hệ thống cửa sổ trên máy tính, các ứng dụng có hướng cố định có thể thay đổi kích thước tuỳ ý. Điều đó có nghĩa là ngay cả khi một hoạt động bị khoá theo hướng dọc, người dùng vẫn có thể đổi kích thước ứng dụng thành một cửa sổ theo hướng ngang.
Những ứng dụng được khai báo là không đổi kích thước (tức là resizeableActivity = false) sẽ có giao diện người dùng được điều chỉnh tỷ lệ trong khi vẫn giữ nguyên tỷ lệ khung hình.
Các ứng dụng máy ảnh khoá hướng hoặc được khai báo là không thay đổi được kích thước sẽ có một cách xử lý đặc biệt cho kính ngắm của camera: cửa sổ có thể thay đổi kích thước hoàn toàn, nhưng kính ngắm vẫn giữ nguyên tỷ lệ khung hình. Bằng cách giả định rằng các ứng dụng luôn chạy ở chế độ dọc hoặc ngang, các ứng dụng sẽ mã hoá cứng hoặc đưa ra các giả định dẫn đến việc tính toán sai hướng hoặc tỷ lệ khung hình của bản xem trước hoặc hình ảnh đã chụp, dẫn đến hình ảnh bị kéo giãn, xoay ngang hoặc lộn ngược.
Cho đến khi các ứng dụng sẵn sàng triển khai kính ngắm camera có khả năng thích ứng hoàn toàn, chế độ xử lý đặc biệt sẽ mang đến trải nghiệm người dùng cơ bản hơn, giúp giảm thiểu những ảnh hưởng mà các giả định sai có thể gây ra.
Để tìm hiểu thêm về chế độ tương thích cho các ứng dụng máy ảnh, hãy xem bài viết Chế độ tương thích với thiết bị.
Phần lồng ghép tiêu đề có thể tuỳ chỉnh
Tất cả ứng dụng chạy trong chế độ cửa sổ trên máy tính đều có một thanh tiêu đề, ngay cả trong chế độ sống động.
Xác minh rằng nội dung của ứng dụng không bị thanh tiêu đề che khuất.
Thanh tiêu đề là một loại phần lồng ghép của thanh chú thích: WindowInsets.Companion.captionBar(); trong các khung hiển thị, WindowInsets.Type.captionBar(), là một phần của thanh hệ thống.
Bạn có thể tìm hiểu thêm về cách xử lý phần lồng ghép trong Hiển thị nội dung tràn viền trong ứng dụng và xử lý phần lồng ghép cửa sổ trong Compose.
Bạn cũng có thể tuỳ chỉnh thanh tiêu đề. Android 15 đã giới thiệu loại giao diện APPEARANCE_TRANSPARENT_CAPTION_BAR_BACKGROUND để làm cho thanh tiêu đề trong suốt, cho phép các ứng dụng vẽ nội dung tuỳ chỉnh bên trong thanh tiêu đề.
Sau đó, các ứng dụng sẽ chịu trách nhiệm tạo kiểu cho phần trên cùng của nội dung để trông giống như thanh chú thích (nền, nội dung tuỳ chỉnh, v.v.) ngoại trừ các phần tử chú thích hệ thống (nút đóng và nút phóng to). Các phần tử này do hệ thống vẽ trên thanh chú thích trong suốt ở trên cùng của ứng dụng.
Các ứng dụng có thể bật/tắt giao diện của các phần tử hệ thống bên trong chú thích cho giao diện sáng và tối bằng cách sử dụng APPEARANCE_LIGHT_CAPTION_BARS, tương tự như cách bật/tắt thanh trạng thái và thanh điều hướng.
Android 15 cũng giới thiệu phương thức WindowInsets#getBoundingRects(), cho phép các ứng dụng xem xét kỹ hơn các phần lồng của thanh phụ đề. Các ứng dụng có thể phân biệt giữa những khu vực mà hệ thống vẽ các phần tử hệ thống và những khu vực chưa được sử dụng mà ứng dụng có thể đặt nội dung tuỳ chỉnh mà không trùng lặp các phần tử hệ thống.
Danh sách các đối tượng Rect do API trả về cho biết những khu vực hệ thống cần tránh. Mọi khoảng trống còn lại (tính bằng cách trừ các hình chữ nhật khỏi phần Lồng ghép thanh chú thích) là nơi ứng dụng có thể vẽ mà không bị chồng lên các phần tử hệ thống và có khả năng nhận dữ liệu đầu vào.
    Để đặt các hình chữ nhật loại trừ cử chỉ hệ thống cho một tiêu đề tuỳ chỉnh, hãy triển khai nội dung sau trong khung hiển thị hoặc Thành phần kết hợp của bạn:
// In a custom View's onLayout or a similar lifecycle method
override fun onLayout(changed: Boolean, left: Int, top: Int, right: Int, bottom: Int) {
    super.onLayout(changed, left, top, right, bottom)
    if (changed) {
        // Calculate the height of your custom header
        val customHeaderHeight = 100 // Replace with your actual header height in pixels
        // Create a Rect covering your custom header area
        val exclusionRect = Rect(0, 0, width, customHeaderHeight)
        // Set the exclusion rects for the system
        systemGestureExclusionRects = listOf(exclusionRect)
    }
}
Hỗ trợ chế độ đa nhiệm và nhiều phiên bản
Đa nhiệm là cốt lõi của tính năng tạo cửa sổ trên máy tính và việc cho phép nhiều phiên bản của ứng dụng có thể giúp người dùng tăng năng suất đáng kể.
Android 15 giới thiệu PROPERTY_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI. Các ứng dụng có thể đặt thuộc tính này để chỉ định rằng giao diện người dùng hệ thống sẽ xuất hiện cho ứng dụng để cho phép ứng dụng này chạy dưới dạng nhiều phiên bản.
Bạn có thể khai báo PROPERTY_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI trong AndroidManifest.xml của ứng dụng trong thẻ <activity>:
<activity
    android:name=".MyActivity"
    android:exported="true"
    android:resizeableActivity="true">
    <meta-data
        android:name="android.window.PROPERTY_SUPPORTS_MULTI_INSTANCE_SYSTEM_UI"
        android:value="true" />
</activity>
Quản lý các phiên bản ứng dụng bằng cử chỉ kéo
Ở chế độ nhiều cửa sổ, người dùng có thể bắt đầu một phiên bản ứng dụng mới bằng cách kéo một phần tử khung hiển thị ra khỏi cửa sổ của ứng dụng. Người dùng cũng có thể di chuyển các phần tử giữa các phiên bản của cùng một ứng dụng.
Android 15 giới thiệu 2 cờ để tuỳ chỉnh hành vi kéo:
DRAG_FLAG_START_INTENT_SENDER_ON_UNHANDLED_DRAG: Cho biết rằng một thao tác kéo chưa được xử lý sẽ được uỷ quyền cho hệ thống bắt đầu nếu không có cửa sổ hiển thị nào xử lý thao tác thả. Khi sử dụng cờ này, phương thức gọi phải cung cấpClipDatacóClipData.ItemchứaIntentSenderkhông thay đổi cho một hoạt động sẽ được khởi chạy (xemClipData.Item.Builder#setIntentSender()). Hệ thống có thể khởi chạy ý định hoặc không dựa trên các yếu tố như kích thước màn hình hiện tại hoặc chế độ cửa sổ. Nếu hệ thống không khởi chạy ý định, thì ý định sẽ bị huỷ bằng quy trình kéo thông thường.DRAG_FLAG_GLOBAL_SAME_APPLICATION: Cho biết thao tác kéo có thể vượt qua ranh giới cửa sổ (đối với nhiều phiên bản của cùng một ứng dụng).Khi [
startDragAndDrop()][20] được gọi với cờ này, chỉ những cửa sổ hiển thị thuộc cùng một ứng dụng mới có thể tham gia vào thao tác kéo và nhận nội dung được kéo.
Ví dụ sau đây minh hoạ cách sử dụng các cờ này với startDragAndDrop():
// Assuming 'view' is the View that initiates the drag
view.setOnLongClickListener {
    // Create an IntentSender for the activity you want to launch
    val launchIntent = Intent(view.context, NewInstanceActivity::class.java)
    val pendingIntent = PendingIntent.getActivity(
        view.context,
        0,
        launchIntent,
        PendingIntent.FLAG_IMMUTABLE // Ensure the PendingIntent is immutable
    )
    // Build the ClipData.Item with the IntentSender
    val item = ClipData.Item.Builder()
        .setIntentSender(pendingIntent.intentSender)
        .build()
    // Create ClipData with a simple description and the item
    val dragData = ClipData(
        ClipDescription("New Instance Drag", arrayOf(ClipDescription.MIMETYPE_TEXT_PLAIN)),
        item
    )
    // Combine the drag flags
    val dragFlags = View.DRAG_FLAG_START_INTENT_SENDER_ON_UNHANDLED_DRAG or
                    View.DRAG_FLAG_GLOBAL_SAME_APPLICATION
    // Start the drag operation
    view.startDragAndDrop(
        dragData,                     // The ClipData to drag
        View.DragShadowBuilder(view), // A visual representation of the dragged item
        null,                         // Local state object (not used here)
        dragFlags                     // The drag flags
    )
    true // Indicate that the long click was consumed
}
Các điểm tối ưu hoá khác
Tuỳ chỉnh cách khởi chạy ứng dụng và chuyển đổi ứng dụng từ chế độ cửa sổ trên máy tính sang chế độ toàn màn hình.
Chỉ định kích thước và vị trí mặc định
Không phải ứng dụng nào cũng cần cửa sổ lớn để mang lại giá trị cho người dùng, ngay cả khi có thể đổi kích thước.
Bạn có thể dùng phương thức ActivityOptions#setLaunchBounds() để chỉ định kích thước và vị trí mặc định khi một hoạt động được khởi chạy.
Dưới đây là ví dụ về cách đặt ranh giới khởi chạy cho một hoạt động:
val options = ActivityOptions.makeBasic()
// Define the desired launch bounds (left, top, right, bottom in pixels)
val launchBounds = Rect(100, 100, 700, 600) // Example: 600x500 window at (100,100)
// Apply the launch bounds to the ActivityOptions
options.setLaunchBounds(launchBounds)
// Start the activity with the specified options
val intent = Intent(this, MyActivity::class.java)
startActivity(intent, options.toBundle())
Chuyển sang chế độ toàn màn hình từ không gian trên màn hình
Các ứng dụng có thể chuyển sang chế độ toàn màn hình bằng cách gọi Activity#requestFullScreenMode().
Phương thức này hiển thị ứng dụng ở chế độ toàn màn hình ngay từ cửa sổ trên máy tính.
Để yêu cầu chế độ toàn màn hình từ một hoạt động, hãy dùng mã sau:
// In an Activity
fun enterFullScreen() {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.UPSIDE_DOWN_CAKE) { // Android 15 (U)
        requestFullScreenMode()
    }
}