Chế độ tương thích với thiết bị

Android kích hoạt chế độ tương thích cho những ứng dụng khai báo hướng hoặc các quy tắc hạn chế về khả năng đổi kích thước. Chế độ tương thích đảm bảo hành vi được chấp nhận của ứng dụng trên thiết bị màn hình lớn và điện thoại màn hình gập có thể gập lại nhưng khả năng hữu dụng chưa tối ưu.

Chế độ ghi đè cho mỗi ứng dụng cho phép nhà sản xuất thiết bị thay đổi hành vi của ứng dụng để cải thiện trải nghiệm người dùng hoặc ngăn ứng dụng gặp lỗi các thiết bị cụ thể.

Thiết bị tham chiếu

Các thiết bị sau có thể yêu cầu chế độ ghi đè cho mỗi ứng dụng do tính năng cấu hình hoặc cấu hình không được ứng dụng hỗ trợ tốt:

  • Máy tính bảng: Hướng tự nhiên của một số máy tính bảng, chẳng hạn như Pixel Tablet, là hướng ngang. Một thiết bị ở hướng tự nhiên khi Display#getRotation() trả lại hàng Surface.ROTATION_0. Nếu ứng dụng giả định ROTATION_0 là hướng dọc, bố cục ứng dụng và bản xem trước của máy ảnh có thể không khớp với màn hình thiết bị.
  • Thiết bị có thể gập lại theo chiều ngang: Một số thiết bị có thể gập lại (chẳng hạn như Pixel Fold) đang ở giai đoạn hướng dọc khi gập lại, nhưng hướng ngang khi mở ra. Nếu ứng dụng giả định hướng khi mở là hướng dọc, nhấp nháy lặp lại hoặc các vấn đề về bố cục.
  • Điện thoại gập có thể gập lại: Điện thoại gập khi mở thường ở chế độ dọc hướng. Tuy nhiên, khi gập lại, điện thoại thường có một màn hình nhỏ ở theo hướng ngang. Ứng dụng phải xác định và điều chỉnh cho phù hợp hướng của màn hình.

Các vấn đề thường gặp về khả năng tương thích

Các ứng dụng thường gặp vấn đề về khả năng tương thích do hướng ứng dụng các quy tắc hạn chế, quy tắc hạn chế về khả năng đổi kích thước và tỷ lệ khung hình, cách xử lý không chính xác hướng bản xem trước của máy ảnh và các API bị sử dụng sai mục đích.

Hiệu ứng hòm thư

Hiệu ứng hòm thư đặt ứng dụng ở chính giữa màn hình hoặc trên màn hình lớn, sang một bên hoặc bên kia để thuận tiện truy cập. Hiệu ứng mờ (thanh có màu đồng nhất hoặc hình nền bị mờ) lấp đầy khu vực hiển thị chưa sử dụng dọc theo các cạnh hoặc trên cùng và cuối ứng dụng.

Hiệu ứng hòm thư thường diễn ra trên các thiết bị có màn hình lớn do kích thước và tỷ lệ khung hình của màn hình thiết bị thường khác với tỷ lệ khung hình của màn hình chuẩn mà hầu hết các ứng dụng đều được thiết kế.

Hình 1. Ứng dụng bị hạn chế để chỉ hiển thị theo hướng dọc được tạo hiệu ứng hòm thư trên máy tính bảng xoay ngang và có thể gập lại.

Vấn đề

Ứng dụng chỉ hỗ trợ một số cấu hình màn hình vì ứng dụng đã khắc phục một số lỗi hướng, tỷ lệ khung hình cố định hoặc không thể đổi kích thước.

Các chế độ cài đặt cấu hình kiểm soát khả năng đổi kích thước và hướng ứng dụng bao gồm sau:

  • screenOrientation: Chỉ định một hướng cố định cho ứng dụng. Các ứng dụng cũng có thể đặt hướng trong thời gian chạy bằng cách sử dụng Activity#setRequestedOrientation().

  • resizeableActivity: Cho biết liệu hệ thống có thể đổi kích thước ứng dụng cho vừa với các cửa sổ có kích thước khác nhau. Trên Android 11 (cấp độ API) 30) trở xuống, chỉ định xem ứng dụng có hỗ trợ chế độ nhiều cửa sổ hay không. Bật Android 12 (API cấp 31) trở lên, chỉ định xem ứng dụng có hỗ trợ hay không chế độ nhiều cửa sổ trên màn hình nhỏ (sw < 600 dp). Trên Android 12 và cao hơn, ứng dụng hỗ trợ chế độ nhiều cửa sổ trên màn hình lớn (sw >= 600dp) bất kể chế độ cài đặt này là gì.

  • maxAspectRatio: Chỉ định tỷ lệ khung hình tối đa được ứng dụng hỗ trợ. Chỉ những ứng dụng có resizeableActivity được đặt thành false mới có thể đặt maxAspectRatio.

  • minAspectRatio: Chỉ định tỷ lệ khung hình tối thiểu được ứng dụng hỗ trợ. Chỉ những ứng dụng có resizeableActivity được đặt thành false mới có thể đặt minAspectRatio.

Tối ưu hoá

Ứng dụng phải hỗ trợ tất cả các hướng của thiết bị và màn hình có chế độ nhiều cửa sổ cũng như kích thước. Xoá mọi quy tắc hạn chế về hướng và tỷ lệ khung hình cố định khỏi ứng dụng bố cục và tệp kê khai ứng dụng.

Giải pháp về khả năng tương thích

Nếu một ứng dụng có hướng hoặc tỷ lệ khung hình cố định chạy trong một cửa sổ mà ứng dụng không trực tiếp hỗ trợ kích thước hoặc hướng cửa sổ, Android tạo hiệu ứng hòm thư để duy trì tính liên tục.

Kể từ Android 12 (API cấp 31) và tiếp tục với 12L (API cấp 32), nền tảng này áp dụng nhiều tính năng nâng cao cho các ứng dụng dạng hòm thư. Thiết bị nhà sản xuất triển khai các giao diện người dùng nâng cao. Bạn không cần làm gì thêm cho ứng dụng của bạn để hưởng lợi từ những cải tiến.

Android 12 (API cấp 31) ra mắt các tính năng nâng cao mang tính thẩm mỹ sau đây, có thể được định cấu hình bởi nhà sản xuất thiết bị:

  • Góc bo tròn: Các góc của cửa sổ ứng dụng có giao diện tinh tế hơn.
  • Độ trong suốt của thanh hệ thống: Các thanh trạng thái và thanh điều hướng phủ lên có dạng bán trong suốt, làm cho các biểu tượng trên thanh luôn có thể xem được trên nền hòm thư.
  • Tỷ lệ khung hình có thể định cấu hình: Bạn có thể điều chỉnh tỷ lệ khung hình của ứng dụng để cải thiện giao diện của ứng dụng.

Hình 2. Ứng dụng dạng hòm thư có các tính năng nâng cao cho giao diện người dùng.

12L (API cấp 32) bổ sung một số điểm cải tiến về chức năng như sau:

  • Vị trí có thể định cấu hình: Trên màn hình lớn, nhà sản xuất thiết bị có thể đặt ứng dụng ở bên trái hoặc bên phải màn hình, làm cho tương tác dễ dàng hơn.

  • Nút khởi động lại được thiết kế lại: Nhà sản xuất thiết bị có thể khởi động lại nút cho chế độ tương thích với kích thước một giao diện mới để người dùng dễ nhận ra hơn.

Android 13 (API cấp 33) bổ sung một hộp thoại hướng dẫn người dùng về cách định vị ứng dụng dạng hòm thư trên màn hình hoặc thêm hòm thư ở chế độ chia đôi màn hình:

Hình 3. Ứng dụng dạng hòm thư có hộp thoại hướng dẫn người dùng.

Chế độ tương thích với kích thước

Chế độ tương thích với kích thước là hiệu ứng hòm thư có chứa nút điều khiển khởi động lại. Chiến lược phát hành đĩa đơn cho phép người dùng khởi động lại ứng dụng và vẽ lại màn hình. Lệnh gọi trên Android chế độ tương thích với kích thước cho các ứng dụng được xác định là không thể đổi kích thước. Khi một hoạt động sẽ di chuyển sang một vùng chứa hiển thị không tương thích với thì hệ thống có thể điều chỉnh kích thước của ứng dụng để lấp đầy màn hình thiết bị vào ít nhất một phương diện.

Thay đổi về cấu hình thiết bị có thể kích hoạt chế độ tương thích với kích thước như sau:

  • Xoay thiết bị
  • Gấp hoặc mở thiết bị có thể gập lại
  • Thay đổi giữa chế độ hiển thị toàn màn hình và chế độ chia đôi màn hình

Vấn đề

Chế độ tương thích với kích thước thường áp dụng cho các hoạt động bị hạn chế trong và được định cấu hình (hoặc do hệ thống xác định) thành không thể đổi kích thước.

Ứng dụng của bạn được xem là có thể đổi kích thước và sẽ không được đặt về kích thước chế độ tương thích—nếu đáp ứng bất kỳ tiêu chí nào sau đây:

Nếu không đáp ứng điều kiện nào, thì ứng dụng của bạn được coi là chưa có thể đổi kích thước và có thể được đặt ở chế độ tương thích với kích thước.

Tối ưu hoá

Ứng dụng phải hỗ trợ mọi kích thước màn hình. Làm cho ứng dụng có thể đổi kích thước bằng cách đặt giá trị Thuộc tính android:resizeableActivity của <activity> hoặc phần tử <application> vào true trong tệp kê khai ứng dụng. Thiết kế bố cục thích ứng cho ứng dụng của bạn. Để biết thêm thông tin, xem Hỗ trợ nhiều kích thước màn hìnhHỗ trợ nhiều cửa sổ.

Giải pháp về khả năng tương thích

Android đặt một ứng dụng vào chế độ tương thích với kích thước khi hệ thống xác định Bạn có thể cải thiện màn hình của ứng dụng dạng hòm thư bằng cách điều chỉnh kích thước ứng dụng để lấp đầy cửa sổ hiển thị ở ít nhất một chiều. Hệ thống sẽ hiển thị nút điều khiển khởi động lại giúp tạo lại quy trình của ứng dụng, hoạt động và vẽ lại màn hình. Xem thêm bài viết Tổng quan về quy trình và luồng.

Vòng lặp nhấp nháy

Khi một ứng dụng không hỗ trợ tất cả các hướng hiển thị, ứng dụng đó có thể lặp lại nhiều lần yêu cầu hướng mới khi cấu hình thay đổi, tạo ra một vòng lặp vô hạn khiến màn hình nhấp nháy hoặc ứng dụng xoay liên tục.

Vấn đề

Trên Android 12 (API cấp 31) trở lên, nhà sản xuất thiết bị có thể định cấu hình thiết bị của họ để bỏ qua các hạn chế về hướng do ứng dụng chỉ định và thay vào đó thực thi chế độ tương thích. Ví dụ: thiết bị có thể gập lại có thể bỏ qua android:screenOrientation="portrait" của hoạt động cài đặt khi hoạt động được hiển thị trên kích thước máy tính bảng ngang của thiết bị, màn hình trong.

Nếu các quy tắc hạn chế về hướng của một ứng dụng bị bỏ qua, thì ứng dụng đó có thể được lập trình bằng cách gọi Activity#setRequestedOrientation(). Cuộc gọi kích hoạt quá trình khởi động lại ứng dụng nếu ứng dụng hiện không xử lý các thay đổi về cấu hình (xem Xử lý thay đổi về cấu hình). Sau khởi động lại, các quy tắc hạn chế về hướng của ứng dụng lại bị bỏ qua, ứng dụng sẽ lặp lại lệnh gọi đến setRequestedOrientation(), lệnh gọi này sẽ kích hoạt quá trình khởi động lại ứng dụng và cứ tiếp tục như vậy trong một vòng lặp tự duy trì.

Một cách khác để bạn có thể gặp phải vấn đề này là khi hướng tự nhiên (hướng thông thường như do Android xác định) của màn hình thiết bị ở chế độ ngang (tức là gọi Trả lại hàng Display#getRotation() Surface.ROTATION_0 khi thiết bị hiển thị theo hướng ngang ). Trước đây, các ứng dụng giả định rằng Display.getRotation() = Surface.ROTATION_0 có nghĩa là thiết bị ở hướng dọc, nhưng điều này không phải như vậy luôn luôn là đúng, ví dụ như trên màn hình trong của một số thiết bị có thể gập lại và trên một số máy tính bảng.

Một ứng dụng ở hướng ngang trên màn hình bên trong có thể gập lại, có thể kiểm tra xoay màn hình, nhận giá trị ROTATION_0, giả định hướng tự nhiên của thiết bị ở chế độ dọc và cuộc gọi setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT ) để định cấu hình lại bố cục ứng dụng. Sau khi ứng dụng khởi động lại (ở chế độ ngang hướng), nó có thể kiểm tra lại chế độ xoay màn hình, nhận giá trị ROTATION_0, gọi setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT) và tiếp tục vòng lặp vô hạn.

Tối ưu hoá

Ứng dụng không nên làm những việc sau:

  • Đặt hướng mặc định bằng Activity#setRequestedOrientation() trong phần hoạt động onCreate() vì yêu cầu về hướng có thể là được kích hoạt bất ngờ bởi các thay đổi về cấu hình chưa được xử lý
  • Giả sử hướng tự nhiên (ROTATION_0) của thiết bị là hướng dọc
  • Đặt hướng dựa trên các tín hiệu không liên quan đến kích thước cửa sổ hiện tại, chẳng hạn như với tên Display#getRotation(), nghĩa là sự hiện diện của FoldingFeature hoặc API không dùng nữa.

Giải pháp về khả năng tương thích

Android bỏ qua các lệnh gọi đến Activity#setRequestedOrientation() trong các lệnh sau trường hợp:

  • Hoạt động đã chạy lại từ một lệnh gọi phương thức trước đó hoặc đã bật chế độ buộc xoay tương thích với máy ảnh (xem bài viết Máy ảnh bản xem trước bên dưới).

    Nhà sản xuất thiết bị có thể áp dụng hành vi này cho một ứng dụng có OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION.

  • Hoạt động này đã thực hiện hơn 2 yêu cầu liên quan đến hướng trong một giây, điều này cho biết đã xảy ra một vòng lặp. Trong hai yêu cầu trong vòng lặp này, Android sử dụng quảng cáo giúp tối đa hoá khu vực hiển thị ứng dụng.

    Nhà sản xuất thiết bị có thể áp dụng hành vi này cho một ứng dụng có OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED.

Bản xem trước của máy ảnh

Bản xem trước của máy ảnh (hoặc kính ngắm) của các ứng dụng máy ảnh có thể bị lệch hoặc méo trên máy tính bảng, máy tính xách tay và màn hình có thể gập lại.

Vấn đề

Tài liệu định nghĩa về khả năng tương thích với Android nêu rõ rằng cảm biến hình ảnh của máy ảnh "PHẢI định hướng để chiều dài của máy ảnh phù hợp với chiều dài của màn hình".

Các ứng dụng thường giả định rằng hướng thiết bị và hướng cảm biến của máy ảnh dọc – một giả định hợp lý trên điện thoại di động tiêu chuẩn. Tuy nhiên, hướng tự nhiên của máy tính bảng, máy tính xách tay và cảm biến của máy ảnh có thể là ngang. Ngoài ra, các kiểu dáng mới như thiết bị có thể gập lại có thể có nhiều kiểu dáng và nhiều cảm biến của máy ảnh ở các hướng khác nhau.

Bắt đầu một hoạt động theo hướng máy ảnh mà ứng dụng không mong đợi hoặc việc chuyển đổi giữa các máy ảnh hoặc màn hình của thiết bị (đối với thiết bị có thể gập lại) có thể khiến bản xem trước của máy ảnh bị lệch hoặc méo.

Tối ưu hoá

Ứng dụng máy ảnh phải xác định và quản lý chính xác hướng và máy ảnh của thiết bị hướng cảm biến để hiển thị bản xem trước của máy ảnh được căn chỉnh và điều chỉnh theo tỷ lệ một cách chính xác. Ứng dụng phải tính toán hướng xoay thiết bị, hướng xoay cảm biến và màn hình hoặc cửa sổ tỷ lệ khung hình, rồi áp dụng kết quả cho bản xem trước của máy ảnh. Để biết thông tin chi tiết hướng dẫn, hãy xem phần Bản xem trước của máy ảnhGiới thiệu về máy ảnh Kính ngắm.

Giải pháp về khả năng tương thích

Một thiết bị ở hướng tự nhiên khi Display#getRotation() sẽ trả về Surface.ROTATION_0. Hệ thống sẽ tính toán CameraCharacteristics.SENSOR_ORIENTATION so với hướng tự nhiên của thiết bị. Android căn chỉnh cửa sổ dọc của các ứng dụng bị hạn chế để chỉ hiển thị theo hướng dọc theo hướng tự nhiên của thiết bị, là điều mà hầu hết các ứng dụng đều mong đợi. Android cũng cắt hình ảnh cảm biến của máy ảnh khi hướng cảm biến ở chế độ ngang và bản xem trước của máy ảnh ở chế độ dọc. Trường hợp cụ thể bao gồm:

  • Buộc xoay bản xem trước của máy ảnh cho các ứng dụng bị hạn chế để chỉ hiển thị theo hướng dọc: Ứng dụng bị hạn chế ở hướng dọc nên mong đợi hướng tự nhiên của thiết bị và hướng cảm biến của máy ảnh theo hướng dọc. Tuy nhiên, trên Android 12 (API cấp 31) trở lên, ứng dụng có thể chạy ở nhiều hướng thiết bị nếu nhà sản xuất thiết bị bỏ qua thông số kỹ thuật về hướng.

    Khi một ứng dụng bị hạn chế để chỉ hiển thị theo hướng dọc được kết nối với máy ảnh, Android sẽ buộc xoay ứng dụng để căn chỉnh cửa sổ dọc của ứng dụng với môi trường tự nhiên của thiết bị.

    Trên một số máy tính bảng (xem thiết bị tham chiếu), ứng dụng cửa sổ dọc được xoay sang chế độ dọc toàn màn hình để căn chỉnh với hướng tự nhiên của thiết bị. Ứng dụng sẽ chiếm toàn màn hình sau khi bắt buộc xoay.

    Trên màn hình ngang bên trong của thiết bị có thể gập lại (xem tài liệu tham khảo) thiết bị), các hoạt động chỉ hiển thị theo hướng dọc sẽ được xoay thành ngang để phù hợp với hướng tự nhiên khi mở. Ứng dụng này hòm thư sau khi buộc xoay.

  • Cắt trường nhìn bên trong của camera trước: Cảm biến camera trong phía trước trên một số có thể gập lại theo hướng ngang. Ngoài việc buộc xoay bản xem trước camera trên màn hình bên trong có thể gập lại, Android cắt mặt trong phía trước trường nhìn của máy ảnh (ngang) để cảm biến chụp một góc nhìn đối diện hướng của thiết bị.

  • Buộc làm mới bản xem trước của máy ảnh: Hệ thống sẽ xoay vòng theo hoạt động phương thức onStop()onStart() (theo mặc định) hoặc onPause()onResume() (được áp dụng theo OVERRIDE_CAMERA_COMPAT_ENABLE_refRESH_VIA_PAUSE ghi đè cho mỗi ứng dụng) sau khi buộc xoay để đảm bảo bản xem trước của máy ảnh được hiển thị đúng cách.

  • Điều chỉnh tỷ lệ khung hình: Hệ thống tự động thay đổi tỷ lệ khung hình của bản xem trước của máy ảnh bị buộc xoay thành tỷ lệ khung hình tối thiểu cao hơn, đảm bảo bản xem trước của máy ảnh được điều chỉnh theo tỷ lệ chính xác.

Nhà phát triển ứng dụng có thể ghi đè các giải pháp này nếu ứng dụng xử lý bản xem trước của máy ảnh chính xác. Hãy xem phần Ghi đè cho mỗi ứng dụng.

Những API thường bị sử dụng sai mục đích

Vì Android đã thêm hỗ trợ cho các tính năng như chế độ nhiều cửa sổ và các thiết bị như thiết bị có thể gập lại, API cũ đã ngừng hoạt động và được thay thế bằng các API mới nhất hoạt động được với mọi kích thước màn hình và dạng thiết bị yếu tố khác. Tuy nhiên, các API không dùng nữa vẫn có sẵn để quay lại sử dụng khả năng tương thích.

Một số API View được thiết kế cho các mục đích đặc biệt, nhưng không phải lúc nào cũng hoạt động tốt được nhà phát triển hiểu.

Vấn đề

Nhà phát triển tiếp tục sử dụng các API Display không dùng nữa và giả định không chính xác API trả về giới hạn đối với ứng dụng thay vì giới hạn đối với khu vực hiển thị của thiết bị. Hoặc nhà phát triển sử dụng nhầm API khung hiển thị chuyên biệt để lấy chỉ số hiển thị chung. Kết quả là tính toán nhầm khi định vị lại các phần tử trên giao diện người dùng sau cửa sổ ứng dụng các sự kiện đổi kích thước, gây ra vấn đề về bố cục.

Những API Hiển thị không dùng nữa và thường bị sử dụng sai mục đích:

Để biết thêm thông tin, hãy xem Hỗ trợ nhiều cửa sổ.

Những API Khung hiển thị bị sử dụng sai mục đích:

Tối ưu hoá

Tuyệt đối không dựa vào kích thước màn hình thực tế để định vị các phần tử trên giao diện người dùng. Di chuyển từ ứng dụng sang các API dựa trên WindowMetrics, bao gồm cả các Các API WindowManager:

Giải pháp về khả năng tương thích

2 chế độ ghi đè sẽ điều chỉnh các API Display không dùng nữa và API View bị sử dụng sai mục đích để trả về giới hạn đối với ứng dụng: ALWAYS_SANDBOX_DISPLAY_APIS cho Display API; OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS cho các API View. Theo mặc định, ALWAYS_SANDBOX_DISPLAY_APIS cũng được áp dụng cho những ứng dụng đủ điều kiện cho chế độ tương thích với kích thước.

Hoạt động rõ

Hoạt động rõ là kết quả của các kiểu nền trong suốt, đối với ví dụ:

<style name="Transparent" parent="AppTheme">
    <item name="android:windowIsTranslucent">true</item>
    <item name="android:windowBackground">@android:color/transparent</item>
</style>

Các giao diện liên quan đến hộp thoại (chẳng hạn như Theme.MaterialComponents.Dialog) có thể bao gồm các kiểu giúp hoạt động trở nên rõ ràng.

Các hoạt động rõ không bao gồm mọi không gian hiển thị có sẵn, khiến khó quản lý vì khu vực hiển thị có sẵn có thể thay đổi dựa trên các thay đổi về cấu hình như xoay thiết bị, gập và mở thiết bị cũng như chế độ nhiều cửa sổ.

Vấn đề

Hoạt động rõ cần tuân theo các giới hạn của hoạt động mờ đầu tiên bên dưới hoạt động rõ trong ngăn xếp hoạt động của tác vụ. Tuy nhiên, một phiên bản không rõ ràng hoạt động chạy hộp thoại cấp quyền có thể là đàn hồi (một hoạt động chạy một hoạt động khác rồi biến mất); và do đó, hệ thống không thể xác định các giới hạn của hoạt động đàn hồi khởi chạy hoạt động của hộp thoại cấp quyền minh bạch.

Tối ưu hoá

Hoạt động rõ kế thừa các hạn chế từ lớp mờ trên cùng nhất bên dưới chúng trong ngăn xếp hoạt động của tác vụ. Hoạt động mờ phải có sẵn cho toàn bộ vòng đời của hoạt động minh bạch, từ hoạt động sự sáng tạo đến huỷ diệt. Vì lý do này, không chạy các yêu cầu quyền từ hoạt động đàn hồi.

Nếu một hoạt động đàn hồi chạy một yêu cầu quyền, thì người dùng có thể không xem hộp thoại cấp quyền vì hoạt động đàn hồi sẽ bị huỷ trước khi người dùng có cơ hội phản hồi hộp thoại và kích thước và vị trí của hoạt động hộp thoại có thể đã được tính toán không chính xác.

Ứng dụng nên luôn chạy các yêu cầu quyền từ những hoạt động còn lại hiển thị cho đến khi người dùng đưa ra quyết định cấp quyền.

Góc bo tròn

Một hoạt động có thể có màu trong suốt do một kiểu chỉ định nền độ trong suốt hoặc do nội dung của hoạt động không lấp đầy khoảng trống không gian hiển thị. Nếu một hoạt động rõ lấp đầy không gian hiển thị có sẵn, hệ thống tự động áp dụng các góc bo tròn cho hoạt động khi được định cấu hình thành do nhà sản xuất thiết bị cung cấp. Tuy nhiên, nếu một hoạt động minh bạch (chẳng hạn như hộp thoại cấp quyền) không lấp đầy không gian có sẵn thì bạn có quyền quyết định có áp dụng góc tròn hay không.

Hộp thoại cấp quyền không lấp đầy không gian hiển thị có sẵn vì hộp thoại bố cục thường sử dụng LayoutParams.WRAP_CONTENT thay vì LayoutParams.MATCH_PARENT.

Giải pháp về khả năng tương thích

Duy trì hiển thị các hoạt động chạy hoạt động của hộp thoại cho đến khi người dùng hoàn tất đã phản hồi hộp thoại.

Hệ thống đảm bảo rằng một hoạt động rõ kế thừa tất cả các quy tắc ràng buộc từ hoạt động mờ đầu tiên bên dưới hoạt động rõ trong ngăn xếp hoạt động, bao gồm các hạn chế liên quan đến:

  • Chế độ tương thích với kích thước
  • Hướng
  • Tỷ lệ khung hình

Trò chơi viết bằng Unity

Các trò chơi viết bằng Unity chạy trên toàn màn hình Android hoặc ở chế độ nhiều cửa sổ. Tuy nhiên, nhiều trò chơi viết bằng Unity bị mất tiêu điểm và ngừng vẽ nội dung khi ứng dụng được đặt trong chế độ nhiều cửa sổ.

Vấn đề

Unity đã thêm một Resizable Window trong Unity 2019.4 để hỗ trợ chế độ nhiều cửa sổ trên Android. Tuy nhiên, cách triển khai ban đầu không phản ứng với vòng đời hoạt động trong chế độ nhiều cửa sổ đúng cách, khiến UnityPlayer để tạm ngưng phát lại khi ứng dụng mất tiêu điểm. Người chơi đã kết xuất một màn hình đen hoặc khung hình cuối cùng của trò chơi bị treo. Trò chơi chỉ được tiếp tục khi người dùng đã nhấn vào màn hình. Nhiều ứng dụng dùng công cụ Unity gặp phải vấn đề này và hiển thị dưới dạng một cửa sổ màu đen ở chế độ nhiều cửa sổ.

Tối ưu hoá

Nâng cấp Unity lên 2019.4.40 trở lên rồi xuất lại trò chơi của bạn. Giữ nguyên Đã đánh dấu vào Resizable Window lựa chọn Cài đặt Android Player, nếu không trò chơi tạm dừng khi không được đặt tiêu điểm mặc dù trò chơi hoàn toàn hiển thị trong chế độ nhiều cửa sổ.

Giải pháp về khả năng tương thích

Nhà sản xuất thiết bị có thể áp dụng OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS ghi đè cho mỗi ứng dụng để cung cấp sự kiện lấy tiêu điểm giả cho một ứng dụng trong chế độ nhiều cửa sổ. Tính năng ghi đè này cho phép hoạt động vẽ lại nội dung và không bị bôi đen.

Kiểm thử ứng dụng để tìm vấn đề về khả năng tương thích

Để thử nghiệm ứng dụng của bạn và hiểu cách ứng dụng hoạt động trên nhiều kiểu dáng, hãy thực hiện các tài nguyên sau:

Ở dạng hòm thư

Hãy xác minh rằng mỗi hoạt động có thể sử dụng tất cả không gian hiển thị có sẵn cho ứng dụng. Trước tiên, hãy khai báo mã sau trong thư mục kiểm thử:

Kotlin

fun Activity.isLetterboxed() : Boolean {
    if (isInMultiWindowMode) return false

    val wmc = WindowMetricsCalculator.getOrCreate()
    val currentBounds = wmc.computeCurrentWindowMetrics(this).bounds
    val maxBounds = wmc.computeMaximumWindowMetrics(this).bounds

    val isScreenPortrait = maxBounds.height() > maxBounds.width()

    return if (isScreenPortrait) {
        currentBounds.height() < maxBounds.height()
    } else {
        currentBounds.width() < maxBounds.width()
    }
}

Java

public boolean isLetterboxed(Activity activity) {
    if (activity.isInMultiWindowMode()) {
        return false;
    }

    WindowMetricsCalculator wmc = WindowMetricsCalculator.getOrCreate();
    Rect currentBounds = wmc.computeCurrentWindowMetrics(activity).getBounds()
    Rect maxBounds = wmc.computeMaximumWindowMetrics(activity).getBounds();

    boolean isScreenPortrait = maxBounds.height() > maxBounds.width();

    return (isScreenPortrait)
        ? currentBounds.height() < maxBounds.height()
        : currentBounds.width() < maxBounds.width();
}

Sau đó, hãy chạy kiểm thử để xác nhận hành vi và đảm bảo hoạt động mục tiêu không ở dạng hòm thư:

Kotlin

@get:Rule
val activityRule = ActivityScenarioRule(MainActivity::class.java)

@Test
fun activity_launched_notLetterBoxed() {
    activityRule.scenario.onActivity {
        assertThat(it.isLetterboxed()).isFalse()
    }
}

Java

@Rule
public ActivityScenarioRule<MainActivity> rule = new ActivityScenarioRule<>(MainActivity.class);

public void activity_launched_notLetterBoxed() {
    try (ActivityScenario<MainActivity> scenario = ActivityScenario.launch(MainActivity.class)) {
        scenario.onActivity(activity -> {
            assertThat(isLetterboxed(activity)).isFalse();
        });
    }
}

Tốt nhất là chỉ chạy loại kiểm thử này cho đến khi vượt qua và xác nhận rằng ứng dụng của bạn các hoạt động chiếm toàn bộ không gian hiển thị có sẵn cho ứng dụng. Kiểm thử ứng dụng trên mọi loại thiết bị để đảm bảo hoạt động nhất quán.

Ghi đè cho mỗi ứng dụng

Android cung cấp chế độ ghi đè để thay đổi hành vi được định cấu hình của các ứng dụng. Để Ví dụ: chế độ ghi đè FORCE_RESIZE_APP sẽ hướng dẫn hệ thống bỏ qua chế độ tương thích với kích thước và đổi kích thước ứng dụng cho vừa với màn hình ngay cả khi resizeableActivity="false" là được chỉ định trong tệp kê khai ứng dụng.

Nhà sản xuất thiết bị sẽ áp dụng chế độ ghi đè cho một số ứng dụng hoặc tất cả ứng dụng trên các thiết bị có màn hình lớn cụ thể. Trên Android 14 (API cấp 34) trở lên, người dùng có thể áp dụng chế độ ghi đè cho các ứng dụng thông qua phần cài đặt thiết bị.

Ghi đè người dùng cho mỗi ứng dụng

Trên Android 14 trở lên, trình đơn cài đặt sẽ cho phép người dùng thay đổi khía cạnh giữa các ứng dụng. Các thiết bị có màn hình lớn như tệp tham chiếu thiết bị sẽ triển khai trình đơn này.

Trình đơn chứa danh sách tất cả các ứng dụng đã cài đặt trên thiết bị. Người dùng chọn một ứng dụng, sau đó đặt tỷ lệ khung hình của ứng dụng thành 3:4, 1:1, toàn màn hình hoặc giá trị khác do nhà sản xuất thiết bị định cấu hình. Người dùng cũng có thể đặt lại tỷ lệ khung hình thành giá trị mặc định của ứng dụng, được chỉ định trong tệp kê khai ứng dụng.

Ứng dụng có thể chọn không sử dụng chế độ ghi đè khả năng tương thích bằng cách đặt các thẻ PackageManager.Property sau:

  • PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE

    Để chọn không sử dụng tính năng ghi đè khả năng tương thích với tỷ lệ khung hình của người dùng, hãy thêm thuộc tính này vào tệp kê khai ứng dụng của bạn rồi đặt giá trị thành false:

    <application>
        <property
            android:name="android.window.
            PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_OVERRIDE"
            android:value="false" />
    </application>
    

    Ứng dụng của bạn sẽ được loại trừ khỏi danh sách ứng dụng trong phần cài đặt thiết bị. Số người dùng sẽ không thể ghi đè tỷ lệ khung hình của ứng dụng.

    Việc đặt thuộc tính này thành true không có hiệu lực.

  • PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE

    Cách chọn không sử dụng chế độ toàn màn hình về khả năng tương thích với tỷ lệ khung hình của người dùng ghi đè, hãy thêm thuộc tính vào tệp kê khai ứng dụng và đặt giá trị thành false:

    <application>
        <property
            android:name="android.window.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE"
            android:value="false" />
    </application>
    

    Tuỳ chọn toàn màn hình sẽ bị xoá khỏi danh sách các tuỳ chọn tỷ lệ khung hình trong cài đặt thiết bị. Người dùng sẽ không thể áp dụng chế độ ghi đè toàn màn hình cho ứng dụng của bạn.

    Việc đặt thuộc tính này thành true sẽ không có hiệu lực.

Tối ưu hoá ứng dụng cho mọi màn hình: Đừng đặt quy tắc hạn chế tỷ lệ khung hình trong ứng dụng của bạn. Sử dụng các lớp kích thước cửa sổ để hỗ trợ nhiều loại kích thước cửa sổ bố cục dựa trên lượng không gian hiển thị có sẵn.

Ghi đè cho mỗi ứng dụng của nhà sản xuất thiết bị

Nhà sản xuất thiết bị sẽ áp dụng chế độ ghi đè cho mỗi ứng dụng trên một số thiết bị. Thiết bị tham chiếu có thể áp dụng một số chế độ ghi đè cho một nhiều ứng dụng khác nhau theo mặc định.

Ứng dụng có thể chọn không sử dụng hầu hết các chế độ ghi đè (xem phần Cho mỗi ứng dụng ghi đè ở bên dưới).

Bạn có thể kiểm thử ứng dụng với các chế độ ghi đè được bật hoặc tắt bằng cách sử dụng khả năng tương thích khung (xem Công cụ khung tương thích). Khi được bật, các chế độ ghi đè sẽ áp dụng cho toàn bộ ứng dụng.

Bạn cũng có thể sử dụng Cầu gỡ lỗi Android (adb) để bật hoặc tắt các chế độ ghi đè và xác định chế độ ghi đè nào áp dụng cho ứng dụng của bạn.

Bạn có thể bật hoặc tắt các chế độ ghi đè như sau:

adb shell am compat enable/disable <override name/id> <package>

Đối với thiết bị tham chiếu, hãy kiểm tra xem chế độ ghi đè nào áp dụng cho ứng dụng của bạn:

adb shell dumpsys platform_compat | grep <package name>

Bảng sau đây liệt kê các cơ chế ghi đè có sẵn cùng với hướng dẫn về cách tối ưu hoá ứng dụng của bạn để ứng dụng không cần dựa vào chế độ ghi đè. Bạn có thể thêm gắn cờ thuộc tính vào tệp kê khai ứng dụng để chọn không sử dụng một số chế độ ghi đè.

Ghi đè cho mỗi ứng dụng
Loại Tên Mã nhận dạng Nội dung mô tả
Khả năng đổi kích thước FORCE_RESIZE_APP 174042936 Bỏ qua chế độ tương thích với kích thước của ứng dụng khi thay đổi cấu hình.
FORCE_NON_RESIZE_APP 181136395 Buộc ứng dụng chuyển vào chế độ tương thích với kích thước khi thay đổi cấu hình.
Tỷ lệ khung hình OVERRIDE_MIN_ASPECT_RATIO 174042980 Chế độ ghi đè yếu tố giám sát phải được bật để áp dụng mọi chế độ ghi đè khác cho tỷ lệ khung hình.
OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY 203647190 Nếu tuỳ chọn này được bật (mặc định), thì phạm vi ghi đè sẽ chỉ diễn ra đối với các hoạt động chỉ hiển thị theo hướng dọc.
OVERRIDE_MIN_ASPECT_RATIO_MEDIUM 180326845 Thay đổi tỷ lệ khung hình tối thiểu thành 3:2.
OVERRIDE_MIN_ASPECT_RATIO_LARGE 180326787 Thay đổi tỷ lệ khung hình tối thiểu thành 16:9.
OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN 208648326 Thay đổi tỷ lệ khung hình tối thiểu cho vừa 50% kích thước màn hình (hoặc tỷ lệ khung hình chia đôi màn hình).
OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN 218959984 Tắt chế độ ghi đè tỷ lệ khung hình tối thiểu để các ứng dụng hiển thị ở chế độ toàn màn hình khi thiết bị xoay dọc.
Hướng OVERRIDE_ANY_ORIENTATION 265464455 Cho phép ghi đè mọi hướng.
OVERRIDE_ANY_ORIENTATION_TO_USER 310816437 Thay thế các quy định hạn chế về hướng, khả năng đổi kích thước và tỷ lệ khung hình.
OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT 265452344 Ghi đè hướng thành hướng dọc khi một hoạt động có hướng không xác định.
OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR 265451093 Ghi đè hướng thành nosensor (sử dụng hướng tự nhiên của thiết bị) khi một hoạt động có hướng không xác định.
OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE 266124927 Xoay 180 độ các ứng dụng chỉ hiển thị theo hướng ngang.
OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA 265456536 Giới hạn phạm vi ghi đè hướng ở thời điểm ứng dụng được kết nối với máy ảnh.
OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION 255940284 Đặt màn hình thành hướng ngang tự nhiên cố định khi một nhiệm vụ ở chế độ toàn màn hình (kể cả khi ở dạng hòm thư).
OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION 254631730 Bỏ qua các yêu cầu về hướng của ứng dụng để tránh xoay vòng lặp vô hạn.
OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED 273509367 Bỏ qua các yêu cầu về hướng lặp lại trong khi một hoạt động đang chạy lại. Nếu Android phát hiện thấy một ứng dụng đang yêu cầu ít nhất 2 hướng mới trong vòng 1 giây, thì hệ thống sẽ coi đây là một vòng lặp xoay vô hạn và áp dụng chế độ ghi đè.
OVERRIDE_RESPECT_REQUESTED_ORIENTATION 236283604 Ngăn hiệu ứng hòm thư bằng cách tắt chế độ cài đặt bỏ qua yêu cầu về hướng của nhà sản xuất thiết bị.
Sandbox API NEVER_SANDBOX_DISPLAY_APIS 184838306 Ngăn chặn sự thay đổi về hành vi của mọi API hiển thị.
ALWAYS_SANDBOX_DISPLAY_APIS 185004937 Buộc các API Display trong ứng dụng trả về giới hạn đối với ứng dụng. API Display trả về giới hạn đối với khu vực hiển thị logic, nhưng đôi khi ứng dụng giả định rằng API Display trả về giới hạn đối với ứng dụng, dẫn đến các vấn đề liên quan đến giao diện người dùng.
OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS 237531167 Buộc dùng các API View trong ứng dụng để trả về giới hạn đối với ứng dụng. API View trả về giới hạn đối với khu vực hiển thị logic, nhưng đôi khi ứng dụng giả định rằng API View trả về giới hạn đối với ứng dụng, dẫn đến các vấn đề liên quan đến giao diện người dùng.
Khả năng tương thích với máy ảnh OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION 263959004 Tắt tính năng buộc xoay. Theo mặc định, tất cả các ứng dụng máy ảnh có hướng cố định sẽ bị buộc xoay khi bản xem trước của máy ảnh đang mở.
OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH 264304459 Xoá chế độ làm mới hoàn toàn mặc định được áp dụng khi bản xem trước của máy ảnh bị buộc xoay.
OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE 264301586 Chuyển quy trình làm mới hoàn toàn sang làm mới một phần khi bản xem trước của máy ảnh bị buộc xoay, giúp duy trì trạng thái trong khi buộc xoay. Theo mặc định, Android áp dụng một quy trình làm mới hoàn toàn khi bản xem trước của máy ảnh bị buộc xoay. Quá trình làm mới hoàn toàn có thể gây ra vấn đề khiến ứng dụng mất trạng thái hoặc bôi đen, tuỳ thuộc vào cách ứng dụng lưu trạng thái trước đó vào bộ nhớ đệm.
OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT 250678880 Cắt vùng đệm hình ảnh của trường nhìn bên trong của camera trước. Nếu chế độ ghi đè bị tắt, thì tính năng cắt của trường nhìn bên trong của camera trước sẽ bị xoá và trường nhìn của bản xem trước của camera sẽ tăng lên. Theo mặc định trên một số thiết bị có thể gập lại (xem các thiết bị tham chiếu), hệ thống sẽ cắt bản xem trước của tất cả ứng dụng camera khi dùng trường nhìn bên trong của camera trước.
Khác OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS 263259275 Ngăn ứng dụng bị bôi đen khi ứng dụng bị mất tiêu điểm ở chế độ chia đôi màn hình. Ứng dụng sẽ chờ để có tiêu điểm trước khi vẽ nội dung ứng dụng. Điều này có thể khiến ứng dụng bị treo hoặc bị bôi đen. Chế độ ghi đè này cho phép Android gửi một sự kiện tiêu điểm giả cho ứng dụng. Sự kiện này sẽ báo hiệu cho ứng dụng để bắt đầu vẽ lại nội dung.

FORCE_RESIZE_APP

Buộc các gói được áp dụng chế độ ghi đè phải có thể đổi kích thước. Không thay đổi việc có thể đặt ứng dụng ở chế độ nhiều cửa sổ hay không, nhưng cho phép để đổi kích thước mà không cần chuyển sang chế độ tương thích với kích thước khi màn hình đổi kích thước.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Trong tệp kê khai ứng dụng, hãy đặt giá trị android:resizeableActivity cho true hoặc thành hỗ trợ đổi kích thước trong khi tắt chế độ nhiều cửa sổ bằng android:resizeableActivity=false, hãy thiết lập android.supports_size_changes cờ siêu dữ liệu thành true.

Cách tối ưu hoá ứng dụng

Sử dụng các bố cục thích ứng để cho phép ứng dụng thích ứng với mọi kích thước hiển thị và tỷ lệ khung hình. Xem Hỗ trợ nhiều kích thước màn hình.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Đặt cờ thuộc tính PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES thành false.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
  android:value="true|false"/>

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè và làm cho ứng dụng có thể đổi kích thước:

adb shell am compat enable FORCE_RESIZE_APP <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable FORCE_RESIZE_APP <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

FORCE_NON_RESIZE_APP

Buộc các gói được áp dụng chế độ ghi đè phải có thể đổi kích thước và không được vào chế độ tương thích với kích thước khi thay đổi cấu hình.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Đặt cả thuộc tính android:resizeableActivity và Cờ siêu dữ liệu android.supports_size_changes thành false trong tệp kê khai ứng dụng, và khai báo quy tắc hạn chế hướng hoặc tỷ lệ khung hình.

Cách tối ưu hoá ứng dụng

Tất cả các ứng dụng hoạt động tốt nếu được đổi kích thước phải có Đã đặt android:resizeableActivity hoặc android.supports_size_changes thành true. Bạn phải cải thiện các ứng dụng khác để chúng hoạt động tốt khi được đổi kích thước. Xem android:resizeableActivity.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Đặt cờ thuộc tính PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES thành false.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_RESIZEABLE_ACTIVITY_OVERRIDES"
  android:value="true|false"/>

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè và làm cho ứng dụng không thể đổi kích thước:

adb shell am compat enable FORCE_NON_RESIZE_APP <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable FORCE_NON_RESIZE_APP <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_MIN_ASPECT_RATIO

Yếu tố giám sát tất cả chế độ ghi đè buộc có một tỷ lệ khung hình tối thiểu nhất định.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Đặt android:minAspectRatio ở cấp hoạt động hoặc cấp ứng dụng.

Cách tối ưu hoá ứng dụng

Không đặt các quy tắc hạn chế tỷ lệ khung hình trong ứng dụng. Đảm bảo rằng ứng dụng của bạn hỗ trợ kích thước màn hình khác nhau. Sử dụng các lớp kích thước cửa sổ để hỗ trợ nhiều bố cục dựa trên lượng không gian mà ứng dụng của bạn có trên màn hình. Xem API Compose WindowSizeClassXem API WindowSizeClass.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Hãy chỉ định quy định hạn chế về tỷ lệ khung hình hoặc đặt cờ cho thuộc tính PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE thành false.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_MIN_ASPECT_RATIO_OVERRIDE"
  android:value="false"/>

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY

Hạn chế các chế độ cài đặt ứng dụng buộc sử dụng một tỷ lệ khung hình tối thiểu nhất định cho các hoạt động chỉ theo hướng dọc. Được bật theo mặc định và chỉ có hiệu lực nếu bạn cũng bật OVERRIDE_MIN_ASPECT_RATIO.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cách tối ưu hoá ứng dụng

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_PORTRAIT_ONLY <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_MIN_ASPECT_RATIO_MEDIUM

Đặt tỷ lệ khung hình tối thiểu của hoạt động thành một giá trị trung bình (3:2)

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cách tối ưu hoá ứng dụng

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_MEDIUM <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_MIN_ASPECT_RATIO_LARGE

Đặt tỷ lệ khung hình tối thiểu của hoạt động thành một giá trị lớn (16:9)

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cách tối ưu hoá ứng dụng

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_LARGE <package>`

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN

Cho phép sử dụng tỷ lệ khung hình chia đôi màn hình. Cho phép ứng dụng dùng tất cả không gian còn trống ở chế độ chia đôi màn hình, tránh hiệu ứng hòm thư.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cách tối ưu hoá ứng dụng

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_TO_ALIGN_WITH_SPLIT_SCREEN <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN

Tắt chế độ ghi đè tỷ lệ khung hình tối thiểu ở chế độ toàn màn hình dọc để sử dụng tất cả chế độ cài đặt không gian màn hình còn trống.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cách tối ưu hoá ứng dụng

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Xem OVERRIDE_MIN_ASPECT_RATIO.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_MIN_ASPECT_RATIO_EXCLUDE_PORTRAIT_FULLSCREEN <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_ANY_ORIENTATION

Bật các cơ chế ghi đè sau để ghi đè mọi hướng:

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Đặt thuộc tính tệp kê khai activity:screenOrientation, hoặc dùng API Activity#setRequestedOrientation().

Cách tối ưu hoá ứng dụng

Ứng dụng của bạn phải hỗ trợ tất cả các hướng. Thay đổi hướng là thay đổi cấu hình, có thể được xử lý bằng một trong hai cách: cho phép huỷ bỏ và tạo lại ứng dụng, hoặc quản lý các thay đổi về cấu hình chính bạn. Nếu bạn tự quản lý các thay đổi về cấu hình, trạng thái ứng dụng có thể là được giữ lại bằng cách sử dụng ViewModel. Trong rất ít trường hợp, bạn có thể quyết định khoá chỉ hướng trên màn hình nhỏ, mặc dù làm như vậy có thể không điều chỉnh được theo tỷ lệ cho phép người dùng xoay ứng dụng khi cần. Trên Android 12L trở lên, hướng cố định có thể bị cấu hình thiết bị ghi đè. Để biết thêm thông tin về cách xử lý các thay đổi về cấu hình và hỗ trợ tất cả hướng, hãy xem Xử lý các thay đổi về cấu hình, Tổng quan về ViewModelHướng ứng dụng bị hạn chế đang bật nhưng không phải trên các thiết bị màn hình lớn.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Đặt cờ thuộc tính PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE đến false.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_ORIENTATION_OVERRIDE"
  android:value="true|false"/>

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_ANY_ORIENTATION <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_ANY_ORIENTATION <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

Hàm OVERRIDE_ANY_ORIENTATION_TO_USER

Cho phép ứng dụng lấp đầy không gian hiển thị có sẵn. Ghi đè mọi hướng, các quy định hạn chế về khả năng đổi kích thước và tỷ lệ khung hình được chỉ định trong tệp kê khai ứng dụng. Ngoài ra bỏ qua mọi lệnh gọi đến Activity#setRequestedOrientation().

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

  • Không đặt tệp kê khai android:screenOrientation hoặc đặt thuộc tính thành "user".

  • Đặt tệp kê khai android:resizeableActivity cho true.

  • Trên màn hình nhỏ, để hỗ trợ việc đổi kích thước ứng dụng trong khi tắt chế độ nhiều cửa sổ bằng android:resizeableActivity=false, hãy đặt Cờ siêu dữ liệu android.supports_size_changes thành true. Không đặt minAspectRatiomaxAspectRatio.

Cách tối ưu hoá ứng dụng

Cho phép ứng dụng của bạn hỗ trợ tất cả các hướng; đừng đặt screenOrientation trong tệp kê khai của ứng dụng. Hỗ trợ khả năng đổi kích thước ứng dụng, chế độ nhiều cửa sổ cũng như tất cả tỷ lệ khung hình của màn hình bằng cách đặt Thuộc tính android:resizeableActivity trong tệp kê khai của ứng dụng vào true. Xem Hỗ trợ nhiều kích thước màn hình.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_ANY_ORIENTATION_TO_USER <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_ANY_ORIENTATION_TO_USER <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT

Bật hướng dọc cho tất cả các hoạt động trong gói. Trừ phi Đã bật OVERRIDE_ANY_ORIENTATION, chế độ ghi đè chỉ được dùng khi hoạt động không chỉ định hướng cố định nào khác.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cách tối ưu hoá ứng dụng

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR

Bật hướng nosensor cho tất cả các hoạt động trong . Trừ phi OVERRIDE_ANY_ORIENTATION là đã bật, chế độ ghi đè chỉ được dùng khi không có hướng cố định nào khác do hoạt động chỉ định.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cách tối ưu hoá ứng dụng

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE

Bật hướng reverseLandscape cho tất cả các hoạt động trong gói. Trừ phi OVERRIDE_ANY_ORIENTATION là đã bật, chế độ ghi đè chỉ được dùng khi không có hướng cố định nào khác do hoạt động chỉ định.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cách tối ưu hoá ứng dụng

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA

Giới hạn OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT, OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR, và OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE chế độ ghi đè để chỉ có hiệu lực khi kết nối máy ảnh đang hoạt động.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cách tối ưu hoá ứng dụng

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Hãy xem OVERRIDE_ANY_ORIENTATION.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_ORIENTATION_ONLY_FOR_CAMERA <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION

Hạn chế hướng hiển thị theo hướng ngang tự nhiên khi các điều kiện sau:

  • Hoạt động ở chế độ toàn màn hình
  • Chọn không sử dụng thuộc tính thành phần Chưa bật PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE
  • Chế độ cài đặt bỏ qua yêu cầu về hướng của nhà sản xuất thiết bị được bật cho màn hình
  • Hướng tự nhiên của màn hình là hướng ngang

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Không có. Sự cố sẽ được giải quyết trong logic ứng dụng.

Cách tối ưu hoá ứng dụng

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Đặt cờ thuộc tính PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE đến false.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE"
  android:value="true|false"/>

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_USE_DISPLAY_LANDSCAPE_NATURAL_ORIENTATION <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION

Bật chính sách về khả năng tương thích để bỏ qua bước cập nhật hướng ứng dụng để phản hồi ứng dụng gọi Activity#setRequestedOrientation() khi ứng dụng đang chạy lại hoặc có một chế độ xử lý khả năng tương thích với máy ảnh đang hoạt động.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Đặt cờ thuộc tính PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION đến true.

Cách tối ưu hoá ứng dụng

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Đặt cờ thuộc tính PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION đến false.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

<property android:name="android.window.PROPERTY_COMPAT_IGNORE_REQUESTED_ORIENTATION"
  android:value="true|false"/>

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_REQUESTED_ORIENTATION <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED

Bật chính sách về khả năng tương thích nhưng bỏ qua hướng được yêu cầu của một ứng dụng trong phản hồi khi ứng dụng gọi Activity#setRequestedOrientation() hơn 2 lần trong một giây nếu một hoạt động không được tạo hiệu ứng hòm thư cho hướng cố định.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Không có. Sự cố sẽ được giải quyết trong logic ứng dụng.

Cách tối ưu hoá ứng dụng

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Đặt cờ thuộc tính PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED thành false.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_IGNORING_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED"
  android:value="false"/>

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_IGNORE_ORIENTATION_REQUEST_WHEN_LOOP_DETECTED <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_RESPECT_REQUESTED_ORIENTATION

Loại trừ các gói khỏi hành vi bỏ qua yêu cầu về hướng có thể được bật theo nhà sản xuất thiết bị cho một khu vực hiển thị hoặc toàn bộ màn hình.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Không có. Sự cố sẽ được giải quyết trong logic ứng dụng.

Cách tối ưu hoá ứng dụng

Hãy xem OVERRIDE_ANY_ORIENTATION.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Không chọn không sử dụng. Việc tắt chế độ ghi đè có thể nguy hiểm nếu ứng dụng không tương thích với một thiết bị có nhà sản xuất thiết bị bỏ qua yêu cầu về hướng bật chế độ cài đặt. Liên hệ với Nhà phát triển Android Quan hệ để tắt chế độ ghi đè.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Không có cờ thuộc tính nào cho chế độ ghi đè này.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_RESPECT_REQUESTED_ORIENTATION <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

NEVER_SANDBOX_DISPLAY_APIS

Buộc các gói không bao giờ áp dụng hộp cát API Display cho một hoạt động ở chế độ hòm thư hoặc tương thích với kích thước. Các API Display tiếp tục cung cấp các giới hạn về khu vực hiển thị.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Khai báo các hoạt động có thể đổi kích thước bằng cách đặt thuộc tính Thuộc tính tệp kê khai android:resizeableActivity cho true hoặc cờ siêu dữ liệu android.supports_size_changes đến true.

Cách tối ưu hoá ứng dụng

Những ứng dụng tuyên bố là hoàn toàn có thể đổi kích thước phải tuyệt đối không dựa vào kích thước màn hình để định vị các phần tử trên giao diện người dùng. Di chuyển ứng dụng của bạn sang các API mới nhất cung cấp WindowMetrics. Nếu bạn đang dùng Jetpack Compose, hãy tận dụng WindowSizeClass API để vẽ giao diện người dùng dựa trên kích thước màn hình khu vực mà ứng dụng có trên màn hình hiện tại. Xem Các lớp kích thước cửa sổ.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Không chọn không sử dụng. Di chuyển từ các API không dùng nữa.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Không có cờ thuộc tính nào cho chế độ ghi đè này.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable NEVER_SANDBOX_DISPLAY_APIS <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable NEVER_SANDBOX_DISPLAY_APIS <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

ALWAYS_SANDBOX_DISPLAY_APIS

Buộc các gói luôn áp dụng hộp cát API Display bất kể chế độ kết xuất cửa sổ hiện tại. Các API Display luôn cung cấp các giới hạn đối với ứng dụng.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Khai báo các hoạt động không thể đổi kích thước bằng cách đặt thuộc tính android:resizeableActivity cho false hoặc Cờ siêu dữ liệu android.supports_size_changes thành false.

Cách tối ưu hoá ứng dụng

Những ứng dụng tuyên bố là hoàn toàn có thể đổi kích thước phải tuyệt đối không dựa vào kích thước màn hình để xác định vị trí các phần tử trên giao diện người dùng. Di chuyển ứng dụng của bạn từ các API không dùng nữa sang các API mới nhất cung cấp WindowMetrics. Xem WindowMetricsCalculator.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Không chọn không sử dụng. Di chuyển từ các API không dùng nữa.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Không có cờ thuộc tính nào cho chế độ ghi đè này.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable ALWAYS_SANDBOX_DISPLAY_APIS <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable ALWAYS_SANDBOX_DISPLAY_APIS <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS

Buộc các gói tạo hộp cát cho các API View sau đây đối với giới hạn hoạt động:

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Giải quyết vấn đề trong mã xử lý ứng dụng bằng cách sử dụng các API cung cấp các giới hạn của cửa sổ ứng dụng và độ lệch tương ứng với cửa sổ ứng dụng thay vì các giới hạn của màn hình thiết bị và độ lệch tương ứng với màn hình thiết bị.

Cách tối ưu hoá ứng dụng

Ứng dụng phải dùng các API View, có tính đến khả năng tạo hiệu ứng hòm thư và chế độ nhiều cửa sổ được áp dụng cho ứng dụng. Xem WindowMetricsCalculator.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Đặt cờ thuộc tính PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS đến false.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

<property android:name="android.window.PROPERTY_COMPAT_ALLOW_SANDBOXING_VIEW_BOUNDS_APIS"
  android:value="false"/>

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION

Tắt tính năng buộc xoay. Cải thiện trải nghiệm người dùng trên một số ứng dụng.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Đặt cờ thuộc tính PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION đến false.

Cách tối ưu hoá ứng dụng

Đừng dựa vào hướng cảm biến của máy ảnh được lưu vào bộ nhớ đệm hoặc thông tin thiết bị. Để hướng dẫn về khả năng tương thích với máy ảnh, hãy xem Giới thiệu về Kính ngắm của máy ảnhHỗ trợ giao diện có thể đổi kích thước trong camera .

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Đặt cờ thuộc tính PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION đến true.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_FORCE_ROTATION"
  android:value="true|false"/>

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè để loại bỏ tính năng buộc xoay:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>

Cách loại bỏ chế độ ghi đè để cho phép thực hiện buộc xoay:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH

Tắt chế độ làm mới hoạt động sau khi buộc xoay. Cải thiện trải nghiệm người dùng khi quá trình làm mới làm mất trạng thái trong ứng dụng.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Đặt cờ thuộc tính PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH đến false.

Cách tối ưu hoá ứng dụng

Xem OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Đặt cờ thuộc tính PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH đến true.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ALLOW_REFRESH"
  android:value="true|false"/>

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè để xoá chế độ làm mới hoạt động:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>

Cách xoá chế độ ghi đè để cho phép chế độ làm mới hoạt động:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_DISABLE_REFRESH <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE

Tạo các gói được áp dụng để làm mới hoạt động bằng onResume()onPause()onResume() chu kỳ thay vì onResume()onStop()onResume() sau khi buộc xoay để tương thích với máy ảnh.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Đặt cờ thuộc tính PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE đến true.

Cách tối ưu hoá ứng dụng

Xem OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Đặt cờ thuộc tính PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE đến false.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

<property android:name="android.window.PROPERTY_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE"
  android:value="true|false"/>

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT

Buộc cắt đầu ra của máy ảnh theo hướng đối diện khi chụp dọc hướng của máy ảnh không phù hợp với hướng tự nhiên của thiết bị. Nhiều ứng dụng không xử lý trường hợp này và hiển thị hình ảnh bị kéo giãn.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Đặt cờ thuộc tính PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT đến true.

Cách tối ưu hoá ứng dụng

Xem OVERRIDE_CAMERA_COMPAT_DISABLE_FORCE_ROTATION.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Đặt cờ thuộc tính PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT đến false.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

<property android:name="android.camera.PROPERTY_COMPAT_OVERRIDE_LANDSCAPE_TO_PORTRAIT"
  android:value="true|false"/>

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè để áp dụng tính năng cắt trường nhìn bên trong của camera trước:

adb shell am compat enable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>

Cách xoá chế độ ghi đè để xoá tính năng cắt trường nhìn bên trong của camera trước:

adb shell am compat disable OVERRIDE_CAMERA_LANDSCAPE_TO_PORTRAIT <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION

Ngăn các ứng dụng chọn không chia sẻ màn hình ứng dụng (xem Chiếu nội dung nghe nhìn). Được triển khai khi ứng dụng sử dụng sai mục đích createConfigForDefaultDisplay() API bắt buộc chụp toàn màn hình và gây nguy hiểm cho quyền riêng tư của người dùng do tiết lộ nội dung thông báo được chụp ở chế độ toàn màn hình nhưng không chụp bằng màn hình ứng dụng chia sẻ và tất cả ứng dụng bất kể chế độ cửa sổ.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Cho phép hành vi chiếu nội dung đa phương tiện mặc định (triển khai trong Android 14, API cấp 34, với createScreenCaptureIntent()), tính năng này cho phép người dùng quyết định xem nên chia sẻ toàn màn hình hay chia sẻ một ứng dụng bất kể chế độ kết xuất cửa sổ hiện tại. Hoặc gọi createScreenCaptureIntent(MediaProjectionConfig) có đối số MediaProjectionConfig được trả về từ một cuộc gọi đến createConfigForUserChoice().

Cách tối ưu hoá ứng dụng

Cho phép người dùng chọn chia sẻ toàn bộ màn hình thiết bị hoặc chia sẻ một ứng dụng cửa sổ trong khi chiếu nội dung đa phương tiện. Kể từ Android 14 là hành vi mặc định.

Làm cho ứng dụng có thể đổi kích thước (resizeableActivity="true") để hỗ trợ chế độ nhiều cửa sổ.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Do tính nghiêm trọng của quyền riêng tư của người dùng, nên ứng dụng của bạn không thể tắt hoặc chọn không sử dụng của chế độ ghi đè này.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

Không có.

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè để huỷ chế độ chọn không chia sẻ một phần màn hình của ứng dụng (nghĩa là bật tính năng chia sẻ màn hình một phần):

adb shell am compat enable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>

Cách xoá chế độ ghi đè để cho phép ứng dụng chọn không sử dụng một phần màn hình đang chia sẻ:

adb shell am compat disable OVERRIDE_DISABLE_MEDIA_PROJECTION_SINGLE_APP_OPTION <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS

Cho phép gửi tiêu điểm giả cho các ứng dụng không có tiêu điểm ở chế độ chia đôi màn hình. Hơi nhiều công cụ phát triển trò chơi chờ lấy tiêu điểm rồi mới vẽ nội dung của ứng dụng; và do đó, tiêu điểm giả giúp ứng dụng tránh bị bôi đen khi chúng được tiếp tục và không nhưng cần tập trung.

Cách ứng dụng có thể đạt được kết quả tương tự như ghi đè

Đặt cờ thuộc tính PROPERTY_COMPAT_ENABLE_FAKE_FOCUS đến true.

Cách tối ưu hoá ứng dụng

Bạn có thể tránh vấn đề này nếu ứng dụng của bạn xử lý nhiều hướng và cấu hình thay đổi tốt. Hãy làm cho màn hình lớn của ứng dụng sẵn sàng hoạt động bằng cách làm theo Nguyên tắc về chất lượng ứng dụng có màn hình lớn.

Nếu bạn chạy công cụ phát triển trò chơi Unity, hãy nâng cấp lên phiên bản 2019.4.40 trở lên và xuất lại trò chơi của bạn. Giữ nguyên lựa chọn Resizable Window đã đăng ký trong Android Player phần cài đặt.

Cách tắt hoặc chọn không sử dụng chế độ ghi đè

Đặt cờ thuộc tính PROPERTY_COMPAT_ENABLE_FAKE_FOCUS đến false.

Cờ thuộc tính để điều chỉnh chế độ ghi đè

<property android:name="android.window.PROPERTY_COMPAT_ENABLE_FAKE_FOCUS"
  android:value="true|false"/>

Lệnh adb để kiểm thử chế độ ghi đè

Cách áp dụng chế độ ghi đè:

adb shell am compat enable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>

Cách xoá chế độ ghi đè:

adb shell am compat disable OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS <package>

Lưu ý: Các lệnh chỉ tạm thời áp dụng hoặc xoá chế độ ghi đè.

Tài nguyên khác