Android kích hoạt chế độ tương thích cho những ứng dụng khai báo các quy tắc hạn chế về hướng và khả năng đổi kích thước. Chế độ tương thích đảm bảo rằng ứng dụng có hành vi chấp nhận được trên các thiết bị màn hình lớn và điện thoại nắp gập có thể gập lại, nhưng lại có khả năng hữu dụng dưới mức tối ưu.
Tính năng 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 trên các thiết bị cụ thể.
Thiết bị tham chiếu
Các thiết bị sau đây có thể yêu cầu chế độ ghi đè cho mỗi ứng dụng do các cấu hình bất thường hoặc các cấu hình mà ứng dụng khô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ả vềSurface.ROTATION_0
. Nếu các ứng dụng giả địnhROTATION_0
là hướng dọc, thì 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 hướng ngang: Một số thiết bị có thể gập lại, chẳng hạn như Pixel Fold, ở hướng dọc khi gập lại, nhưng ở hướng ngang khi mở ra. Nếu các ứng dụng giả định hướng mở ra là hướng dọc, thì có thể sẽ xảy ra các vòng lặp nhấp nháy hoặc vấn đề về bố cục.
- Điện thoại nắp gập có thể gập lại: Điện thoại nắp gập chưa mở thường có hướng dọc. Tuy nhiên, khi gập lại, điện thoại thường có màn hình nhỏ theo hướng ngang. Ứng dụng phải xác định và điều chỉnh theo nhiều 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 các quy tắc hạn chế về hướng ứng dụng, các quy tắc hạn chế về khả năng đổi kích thước và tỷ lệ khung hình, việc xử lý không đúng cách hướng bản xem trước của máy ảnh cũng như các API bị sử dụng sai mục đích.
Hiệu ứng hòm thư
Hiệu ứng hòm thư (letterboxing) đặ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ờ (matte) – thanh có màu đồng nhất hoặc hình nền 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 và dưới ứng dụng.
Hiệu ứng hòm thư thường diễn ra trên 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 kích thước và tỷ lệ khung hình của điện thoại tiêu chuẩn mà hầu hết các ứng dụng nhắm đến.
Vấn đề
Do có hướng và tỷ lệ khung hình cố định hoặc không thể đổi kích thước, nên ứng dụng chỉ hỗ trợ một số cấu hình màn hình.
Dưới đây là 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:
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 dùngActivity#setRequestedOrientation()
.resizeableActivity
: Cho biết liệu hệ thống có thể đổi kích thước các ứng dụng cho vừa với nhiều kích thước cửa sổ hay không. Trên Android 11 (API cấp 30) trở xuống, hãy chỉ định xem ứng dụng có hỗ trợ chế độ nhiều cửa sổ hay không. Trên Android 12 (API cấp 31) trở lên, hãy chỉ định xem ứng dụng có hỗ trợ chế độ nhiều cửa sổ trên màn hình nhỏ (lớp kích thước cửa sổ nhỏ gọn) hay không. Trên Android 12 trở lên, các ứng dụng hỗ trợ chế độ nhiều cửa sổ trên màn hình lớn (lớp kích thước cửa sổ trung bình hoặc mở rộng) bất kể chế độ cài đặt này là gì.maxAspectRatio
: Chỉ định tỷ lệ khung hình tối đa mà ứng dụng hỗ trợ. Chỉ những ứng dụng córesizeableActivity
được đặt làfalse
mới có thể đặtmaxAspectRatio
.minAspectRatio
: Chỉ định tỷ lệ khung hình tối thiểu mà ứng dụng hỗ trợ. Chỉ những ứng dụng córesizeableActivity
được đặt làfalse
mới có thể đặtminAspectRatio
.
Tối ưu hoá
Ứng dụng phải hỗ trợ tất cả các hướng cũng như kích thước của thiết bị và màn hình có chế độ nhiều cửa sổ. Xoá mọi quy tắc hạn chế về hướng và tỷ lệ khung hình cố định khỏi bố cục ứng dụng cũng như 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ợ (hướng hoặc kích thước cửa sổ đó), thì Android sẽ tạo hiệu ứng hòm thư để duy trì sự hoạt động liên tục của ứng dụng đó.
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 sẽ áp dụng nhiều tính năng nâng cao cho các ứng dụng dạng hòm thư. Nhà sản xuất thiết bị sẽ triển khai các tính năng nâng cao cho giao diện người dùng. Bạn không cần phát triển thêm bất kỳ tính năng nào cho ứng dụng để hưởng lợi từ những điểm cải tiến này.
Android 12 (API cấp 31) ra mắt các tính năng nâng cao mang tính thẩm mỹ mà nhà sản xuất thiết bị có thể định cấu hình, đó là:
- 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ủ trên ứng dụng 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.
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, giúp quá trình 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ể mang đến diện mạo mới cho nút khởi động lại trong chế độ tương thích với kích thước để giúp 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 cách thêm hòm thư ở chế độ chia đôi màn hình:
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. Với nút điều khiển này, người dùng có thể khởi động lại ứng dụng và vẽ lại màn hình. Android gọi 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 chuyển sang một vùng chứa màn hình không tương thích với kích thước của hoạt động, 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ị theo ít nhất một kích thước.
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ế theo hướng hoặc tỷ lệ khung hình và được định cấu hình (hoặc do hệ thống xác đị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 ở chế độ tương thích với kích thước nếu đáp ứng bất kỳ tiêu chí nào sau đây:
- Có thể đổi kích thước bằng
resizeableActivity="true"
- Hỗ trợ chế độ hình trong hình (PIP)
- Được nhúng
- Có áp dụng chế độ ghi đè cho mỗi ứng dụng
FORCE_RESIZE_APP
do nhà sản xuất thiết bị đặt (các thuộc tính do ứng dụng đặt sẽ bị bỏ qua)
Nếu không đáp ứng điều kiện nào, thì ứng dụng của bạn sẽ được xem là không 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. Cho phép ứng dụng đổi kích thước bằng cách đặt thuộc tính android:resizeableActivity
của phần tử <activity>
hoặc <application>
thành true
trong tệp kê khai ứng dụng. Thiết kế bố cục thích ứng cho ứng dụng. Để biết thêm thông tin, hãy xem bài viết Hỗ trợ nhiều kích thước màn hình và Hỗ trợ chế độ 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 rằng màn hình của ứng dụng dạng hòm thư có thể cải thiện được bằng cách điều chỉnh kích thước của ứng dụng để lấp đầy cửa sổ hiển thị theo ít nhất một chiều. Hệ thống sẽ hiện một nút điều khiển khởi động lại để 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 không hỗ trợ tất cả hướng hiển thị, ứng dụng có thể liên tục yêu cầu hướng mới khi có thay đổi về cấu hình, 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ị để bỏ qua các quy tắ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ụ: một thiết bị có thể gập lại có thể bỏ qua chế độ cài đặt android:screenOrientation="portrait"
của một hoạt động khi hoạt động này xuất hiện trên màn hình bên trong xoay ngang, có kích thước máy tính bảng của thiết bị.
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ể đặt hướng bằng cách gọi Activity#setRequestedOrientation()
. Lệnh gọi này kích hoạt quá trình khởi động lại một ứng dụng nếu ứng dụng này hiện không xử lý các thay đổi về cấu hình (xem bài viết Xử lý các thay đổi về cấu hình). Sau khi 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 lặp lại lệnh gọi đến setRequestedOrientation()
. Lệnh gọi này kích hoạt quá trình khởi động lại ứng dụng, v.v. trong một vòng lặp tự duy trì.
Bạn có thể gặp phải vấn đề này theo cách khác, đó là khi hướng tự nhiên (hướng thông thường do Android xác định) của màn hình thiết bị là hướng ngang (tức là lệnh gọi Display#getRotation()
sẽ trả về Surface.ROTATION_0
trong khi thiết bị có tỷ lệ khung hình 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. Tuy nhiên, điều này không phải lúc nào cũng đúng, ví dụ như trên màn hình bên 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 chế độ xoay màn hình, nhận giá trị là ROTATION_0
, giả định hướng tự nhiên của thiết bị là dọc và gọi setRequestedOrientation(
ActivityInfo.SCREEN_ORIENTATION_PORTRAIT
)
để định cấu hình lại bố cục ứng dụng. Sau khi khởi động lại (ở hướng ngang), ứng dụng này có thể kiểm tra lại chế độ xoay màn hình, nhận giá trị là 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ương thứconCreate()
của hoạt động vì các thay đổi về cấu hình chưa được xử lý có thể kích hoạt đột ngột yêu cầu liên quan đến hướng - 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ư
Display#getRotation()
, sự hiện diện củaFoldingFeature
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 những trường hợp sau:
Hoạt động này đã chạy lại từ một lệnh gọi phương thức trước đó hoặc quá trình xử lý tính năng buộc xoay tương thích với máy ảnh đã được bật (xem phần Bản xem trước của máy ảnh ở 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 bằng
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 thấy một vòng lặp đã xảy ra. Trong 2 yêu cầu trong vòng lặp này, Android sử dụng một yêu cầu nhằm 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 bằng
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 được định hướng để kích thước dài của máy ảnh phù hợp với kích thước 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 là hướng 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à hướng 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 hướng tự nhiên và nhiều cảm biến của máy ảnh ở các hướng khác nhau.
Thao tác khởi động một hoạt động có hướng máy ảnh mà ứng dụng không mong đợi hoặc thao tác chuyển đổi giữa nhiều 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 thiết bị cũng như hướng cảm biến của máy ảnh để hiển thị đúng cách bản xem trước của máy ảnh được căn chỉnh và điều chỉnh theo tỷ lệ. Ứng dụng phải tính toán hướng xoay thiết bị, hướng xoay cảm biến và tỷ lệ khung hình của màn hình hoặc cửa sổ, sau đó áp dụng kết quả cho bản xem trước của máy ảnh. Để được hướng dẫn chi tiết, hãy xem bài viết Bản xem trước của máy ảnh và Giới thiệu về kính ngắm của máy ảnh.
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()
trả về Surface.ROTATION_0
. Hệ thống sẽ tính toán CameraCharacteristics.SENSOR_ORIENTATION
theo hướng tự nhiên của thiết bị. Android sẽ 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 với hướng tự nhiên của thiết bị này, đây 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. Dưới đây là các giải pháp cụ thể:
Buộc xoay bản xem trước của máy ảnh cho ứng dụng bị hạn chế để chỉ hiển thị theo hướng dọc: Ứng dụng bị hạn chế để chỉ hiển thị theo hướng dọc sẽ mong đợi hướng tự nhiên của thiết bị và hướng cảm biến của máy ảnh là 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 của 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 này để căn chỉnh cửa sổ dọc của ứng dụng với hướ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), cửa sổ dọc của ứng dụng được xoay sang chế độ dọc toàn màn hình cho phù hợp 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 buộc xoay.
Trên màn hình bên trong theo hướng ngang của thiết bị có thể gập lại (xem thiết bị tham chiếu), các hoạt động chỉ hiển thị theo hướng dọc sẽ được xoay thành hướng ngang cho phù hợp với hướng tự nhiên khi mở. Ứng dụng sẽ ở dạng 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ố thiết bị có thể gập lại ở hướng ngang. Ngoài việc buộc xoay bản xem trước của máy ảnh trên màn hình bên trong có thể gập lại, Android còn cắt trường nhìn của máy ảnh bên trong phía trước (hướng ngang) để cảm biến chụp một khung hình đối diện với hướng thiết bị.
Buộc làm mới bản xem trước của máy ảnh: Hệ thống quay vòng qua các phương thức hoạt động là
onStop()
vàonStart()
(theo mặc định) hoặconPause()
vàonResume()
(được áp dụng bằng chế độ ghi đè cho mỗi ứng dụng OVERRIDE_CAMERA_COMPAT_ENABLE_REFRESH_VIA_PAUSE) sau khi buộc xoay để đảm bảo bản xem trước của máy ảnh được hiện đú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 đã 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ệ một cách 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 đúng cách. 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 đã tăng cường 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, nên các API cũ không được dùng nữa và được thay thế bằng các API mới nhất, phù hợp với mọi kích thước màn hình và kiểu dáng thiết bị. Tuy nhiên, các API không dùng nữa vẫn hoạt động vì lý do tương thích ngược.
Một số API View
được thiết kế cho các mục đích đặc biệt mà không phải lúc nào nhà phát triển cũng hiểu rõ.
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 rằng các API này 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ị. Ngoài ra, nhà phát triển sử dụng nhầm API khung hiển thị dùng cho mục đích đặc 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 sự kiện đổi kích thước cửa sổ ứng dụng, 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 phần Hỗ trợ chế độ 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 ứng dụng của bạn sang các API dựa trên WindowMetrics
, bao gồm cả các API WindowManager
sau đây:
Nền tảng:
Jetpack:
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 API Display
; OVERRIDE_SANDBOX_VIEW_BOUNDS_APIS
cho API View
. Theo mặc định, ALWAYS_SANDBOX_DISPLAY_APIS
cũng được áp dụng cho các ứng dụng đủ điều kiện dùng 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, 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õ.
Các hoạt động rõ không bao gồm mọi không gian hiển thị có sẵn, khiến bạn khó quản lý vì khu vực hiển thị có sẵn có thể thay đổi theo 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 đề
Một 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 nhiệm vụ. Tuy nhiên, một hoạt động mờ chạy một hộp thoại cấp quyền có thể là hoạt động đàn hồi (chạy các hoạt động khác). Hoạt động mờ này sẽ biến mất sau khi chạy hộp thoại nên hệ thống không xác định được giới hạn của hoạt động đàn hồi đã chạy hoạt động hộp thoại cấp quyền rõ.
Tối ưu hoá
Các hoạt động rõ kế thừa những quy tắc hạn chế của chúng từ hoạt động mờ nhất trên cùng bên dưới chúng trong ngăn xếp hoạt động của một nhiệm vụ. Hoạt động mờ phải được cung cấp cho toàn bộ vòng đời của hoạt động rõ, từ quy trình tạo hoạt động cho đến huỷ bỏ. Vì lý do này, đừng chạy các yêu cầu cấp 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 cấp quyền, thì người dùng có thể không thấy hộp thoại cấp quyền vì hoạt động đàn hồi này đã bị huỷ bỏ trước khi người dùng có cơ hội phản hồi hộp thoại đó, đồng thời 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 vẫn 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ể trong suốt do kiểu chỉ định độ trong suốt của nền hoặc do nội dung của hoạt động không lấp đầy không gian hiển thị có sẵn. Nếu một hoạt động rõ lấp đầy không gian hiển thị có sẵn, thì hệ thống sẽ tự động áp dụng các góc bo tròn cho hoạt động này khi nhà sản xuất thiết bị định cấu hình làm như vậy. Tuy nhiên, nếu một hoạt động rõ (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 xem có áp dụng các góc bo 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ì bố cục hộp thoại thường 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 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 hạn chế 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, bao gồm cả các quy tắ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à dừng vẽ nội dung khi ứng dụng được đặt ở chế độ nhiều cửa sổ.
Vấn đề
Unity đã thêm một tuỳ chọn 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 đã phản ứng không đúng cách với vòng đời hoạt động ở chế độ nhiều cửa sổ, 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 nhìn thấy 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 lựa chọn Resizable Window
trong phần cài đặt Trình phát Android, nếu không trò chơi sẽ 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ị ở 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 chế độ ghi đè cho mỗi ứng dụng OVERRIDE_ENABLE_COMPAT_FAKE_FOCUS
để cung cấp sự kiện lấy tiêu điểm giả cho một ứng dụng ở 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
Để kiểm thử ứ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 tận dụng các tài nguyên sau đây:
- Phát trực tuyến trên thiết bị: Để kiểm thử ứng dụng của bạn trên các thiết bị phát hành chính thức (bao gồm cả thiết bị tham chiếu) được lưu trữ trong các trung tâm dữ liệu của Google, hãy xem bài viết Phát trực tuyến trên thiết bị Android, do Firebase cung cấp
- Trình mô phỏng trong Android Studio Hedgehog: Để biết thông tin về cách tạo trình mô phỏng cho thiết bị tham chiếu, hãy xem bài viết Tạo và quản lý thiết bị ảo
- Trình mô phỏng có thể đổi kích thước của Android Studio: Để biết thông tin về cách truy cập vào thiết bị ảo, hãy xem bài viết Chạy ứng dụng trên Trình mô phỏng Android
Ở 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 một quy trình kiểm thử để xác nhận hành vi và đảm bảo hoạt động mục tiêu không được tạo hiệu ứ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 hình kiểm thử này cho đến khi vượt qua và xác nhận rằng các hoạt động của ứng dụng chiếm toàn bộ không gian hiển thị có sẵn cho ứng dụng. Hãy kiểm thử ứng dụng của bạn trên tất cả các loại thiết bị để đảm bảo hành vi 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 phù hợp với kích thước màn hình ngay cả khi resizeableActivity="false"
được chỉ định trong tệp kê khai ứng dụng.
Nhà sản xuất thiết bị á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ụ thể có màn hình lớn. 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 đè cho mỗi ứng dụng của người dùng
Trên Android 14 trở lên, trình đơn cài đặt cho phép người dùng thay đổi tỷ lệ khung hình của ứng dụng. Các thiết bị màn hình lớn như thiết bị tham chiếu sẽ triển khai trình đơn.
Trình đơn này chứa danh sách tất cả ứng dụng đã cài đặt trên thiết bị. Người dùng chọn một ứng dụng rồi đặ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 về tỷ lệ 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 tính năng 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 và đặ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ẽ bị loại trừ khỏi danh sách ứng dụng trong phần cài đặt thiết bị. 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
sẽ không có hiệu lực.PROPERTY_COMPAT_ALLOW_USER_ASPECT_RATIO_FULLSCREEN_OVERRIDE
Để chọn không sử dụng chế độ toàn màn hình của tính năng ghi đè khả năng tương thích với tỷ lệ khung hình người dùng, hãy thêm thuộc tính này 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 bị xoá khỏi danh sách các tuỳ chọn tỷ lệ khung hình trong phần 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
không có hiệu lực.
Tối ưu hoá ứng dụng cho mọi màn hình: Không đặt các quy tắc hạn chế tỷ lệ khung hình trong ứng dụng. 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 không gian hiển thị có sẵn.
Chế độ 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ị áp dụng chế độ ghi đè cho mỗi ứng dụng trên một số thiết bị. Theo mặc định, thiết bị tham chiếu có thể áp dụng một số chế độ ghi đè cho nhiều ứng dụng.
Ứng dụng có thể chọn không sử dụng hầu hết các chế độ ghi đè (xem bảng Chế độ ghi đè cho mỗi ứng dụng ở 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 khung tương thích (xem bài viết 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ể dùng Cầu gỡ lỗi Android (adb) để bật hoặc tắt các chế độ ghi đè và xác định những chế độ ghi đè sẽ áp dụng cho ứng dụng của mình.
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 chế độ ghi đè có sẵn cùng với hướng dẫn về cách tối ưu hoá ứng dụng để ứng dụng không cần dựa vào chế độ ghi đè. Bạn có thể thêm 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 | Ghi đè 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 vòng lặp xoay 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à 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ề các giới hạn về khu vực hiển thị hợp lý, nhưng đôi khi ứng dụng giả định rằng API Display trả về các 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ề các 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ề các 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 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 máy ảnh khi dùng camera trước bên trong. | |
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 ứng dụng có thể được đặt ở chế độ nhiều cửa sổ hay không, nhưng cho phép ứng dụng đổi kích thước mà không phải 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 thuộc tính android:resizeableActivity
thành true
hoặc để hỗ trợ đổi kích thước 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
.
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. Hãy xem phần 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 không thể đổi kích thước và chuyển sang 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 rồi khai báo một 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, bạn phải đặ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ả các chế độ ghi đè buộc áp dụng 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
Đừng đặt các quy tắc hạn chế tỷ lệ khung hình trong ứng dụng. Hãy đảm bảo ứng dụng hỗ trợ nhiều kích thước màn hình. 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ó trên màn hình. Xem API WindowSizeClass
cho Compose và API WindowSizeClass
cho Khung hiển thị.
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ờ 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ỉ dùng 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ó sẵn ở 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 để dùng tất cả không gian màn hình có sẵn.
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 chế độ ghi đè sau để ghi đè mọi hướng:
- OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT
- OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR
- OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE
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 sử 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 về hướng là thay đổi về cấu hình, có thể được xử lý bằng một trong hai cách: cho phép hệ thống huỷ bỏ và tạo lại ứng dụng hoặc tự quản lý các thay đổi về cấu hình. Nếu tự quản lý các thay đổi về cấu hình, thì bạn có thể giữ lại trạng thái ứng dụng bằng cách sử dụng ViewModel
. Trong rất ít trường hợp, bạn có thể chọn chỉ khoá 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ệ cũng như không cho phép người dùng xoay ứng dụng khi cần. Trên Android 12L trở lên, bạn có thể ghi đè hướng cố định theo cấu hình thiết bị. Để 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ả các hướng, hãy xem các bài viết Xử lý các thay đổi về cấu hình, Tổng quan về ViewModel và Hướng ứng dụng bị hạn chế trên điện thoại nhưng không bị hạn chế trên các loại thiết bị có 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
thành 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 đè.
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 quy tắc hạn chế về hướng, 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 thuộc tính tệp kê khai
android:screenOrientation
hoặc đặt thuộc tính thành"user"
.Đặt thuộc tính tệp kê khai
android:resizeableActivity
thànhtrue
.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ệuandroid.supports_size_changes
thànhtrue
. Không đặtminAspectRatio
vàmaxAspectRatio
.
Cách tối ưu hoá ứng dụng
Cho phép ứng dụng hỗ trợ tất cả hướng; không đặt thông số kỹ thuậ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ổ và tất cả tỷ lệ khung hình 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 thành true
. Hãy xem phần 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ạn 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 gói. Trừ phi bạn 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_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 bạn 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_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 các chế độ ghi đè OVERRIDE_UNDEFINED_ORIENTATION_TO_PORTRAIT, OVERRIDE_UNDEFINED_ORIENTATION_TO_NOSENSOR và OVERRIDE_LANDSCAPE_ORIENTATION_TO_REVERSE_LANDSCAPE để chúng chỉ có hiệu lực khi kết nối tớ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ế để chỉ hiển thị theo hướng ngang tự nhiên khi các điều kiện sau được đáp ứng:
- Hoạt động ở chế độ toàn màn hình
- Thuộc tính thành phần chọn không sử dụng
PROPERTY_COMPAT_ALLOW_DISPLAY_ORIENTATION_OVERRIDE
chưa được bật - Nhà sản xuất thiết bị đã bật chế độ cài đặt bỏ qua yêu cầu về hướng 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
thành 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 quá trình cập nhật hướng ứng dụng nhằm 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
thành 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
thành 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 để phản hồi ứng dụng gọi Activity#setRequestedOrientation()
nhiều hơn hai 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 mà nhà sản xuất thiết bị có thể bật 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. Thao tá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 bật chế độ cài đặt bỏ qua yêu cầu về hướng của nhà sản xuất thiết bị. Hãy liên hệ với nhóm Quan hệ với nhà phát triển Android để 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 tệp kê khai android:resizeableActivity
thành true
hoặc cờ siêu dữ liệu android.supports_size_changes
thành true
.
Cách tối ưu hoá ứng dụng
Những ứng dụng khai báo 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 hiển thị để đị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 có cung cấp WindowMetrics
. Nếu bạn đang dùng Jetpack Compose, hãy tận dụng API WindowSizeClass
để vẽ giao diện người dùng dựa trên diện tích màn hình mà ứng dụng có trên màn hình hiện tại. Xem phần Sử dụng 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
thành 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 khai báo 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 hiển thị để đị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 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 dùng các API cung cấp những giới hạn của cửa sổ ứng dụng và độ lệch tương đối so 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. Hãy 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
thành 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
thành 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ị. Để biết hướng dẫn về khả năng tương thích với máy ảnh, hãy xem bài viết Giới thiệu về kính ngắm của máy ảnh và Hỗ trợ các nền tảng có thể đổi kích thước trong ứng dụng máy ảnh.
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
thành 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 chế độ làm mới khiến trạng thái bị mất trong các ứ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
thành 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
thành 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ệnh này để làm mới hoạt động bằng chu kỳ onResume()
→ onPause()
→ onResume()
thay vì chu kỳ 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
thành 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
thành 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 hướng dọc 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 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
thành 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
thành 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 ứng dụng chọn không chia sẻ màn hình ứng dụng (xem phần Chiếu nội dung nghe nhìn). Được triển khai khi các ứng dụng sử dụng sai API createConfigForDefaultDisplay()
để 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 bằng cách hiển thị nội dung của thông báo được chụp ở chế độ toàn màn hình nhưng không phải chế độ chia sẻ màn hình ứng dụng 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 (được triển khai trong Android 14, API cấp 34, với createScreenCaptureIntent()
), cho phép người dùng quyết định có chia sẻ toàn màn hình hay một cửa sổ ứng dụng hay không, bất kể chế độ cửa sổ. Hoặc gọi createScreenCaptureIntent(MediaProjectionConfig)
với đối số MediaProjectionConfig
được trả về từ lệnh 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 cửa sổ ứng dụng trong quá trình chiếu nội dung đa phương tiện. Đây là hành vi mặc định kể từ Android 14.
Điều chỉnh kích thước ứng dụng (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ầm quan trọng của quyền riêng tư của người dùng, ứng dụng của bạn không thể tắt hoặc chọn không sử dụng 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ỷ lựa chọn không chia sẻ một phần màn hình của ứng dụng (tức là bật tính năng chia sẻ một phần màn hình):
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 chia sẻ một phần màn hình:
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. Một số 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. Do đó, tiêu điểm giả giúp các ứng dụng tránh bị bôi đen khi chúng được tiếp tục và chưa có tiêu điểm.
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
thành 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ý tốt nhiều hướng và các thay đổi về cấu hình. Hãy tuân thủ nguyên tắc về Chất lượng ứng dụng có màn hình lớn để màn hình lớn của ứng dụng luôn sẵn sàng hoạt động.
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 rồi xuất lại trò chơi của bạn. Giữ nguyên lựa chọn Resizable Window
trong phần cài đặt Trình phát Android.
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
thành 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
- Nguyên tắc về chất lượng ứng dụng có màn hình lớn
- Nguyên tắc về chất lượng cốt lõi của ứng dụng.