Khai báo hỗ trợ màn hình ở mức hạn chế

Mặc dù bạn nên thiết kế ứng dụng để ứng dụng có thể thích ứng với mọi kích thước và mật độ màn hình, nhưng có thể bạn vẫn không muốn ứng dụng hỗ trợ một số cấu hình màn hình nhất định. Nếu vậy, bạn có thể giới hạn mức độ mà Android có thể đổi kích thước ứng dụng hoặc thậm chí là hạn chế thiết bị nào có thể cài đặt ứng dụng đó, như mô tả trên trang này.

Trước khi hạn chế ứng dụng ở một số màn hình nhất định, bạn nên hiểu rõ tất cả các kỹ thuật hỗ trợ nhiều màn hình và tận dụng hết khả năng để triển khai các kỹ thuật đó.

Phát hành các cấu phần phần mềm riêng biệt cho nhiều màn hình

Trong trường hợp không hợp lý khi bạn phải xây dựng một ứng dụng hỗ trợ tất cả các cấu hình màn hình, Google Play cho phép bạn phát hành nhiều phiên bản cho cùng một trang thông tin ứng dụng. Bạn có thể sử dụng tính năng này để cung cấp các cấu phần phần mềm riêng biệt mà mỗi cấu phần phần mềm hỗ trợ một nhóm cấu hình màn hình khác nhau (như được khai báo trong tệp kê khai) mà không cần tạo các trang thông tin riêng trong Cửa hàng Google Play.

Ví dụ: nếu bạn muốn phát hành cả phiên bản ứng dụng cho điện thoại di động và máy tính bảng, nhưng không thể tạo một APK hoạt động cho cả hai kích thước màn hình, thì bạn có thể phát hành 2 APK cho cùng một trang thông tin ứng dụng. Tuỳ thuộc vào cấu hình màn hình của từng thiết bị, Google Play sẽ tải tệp APK phù hợp với kích thước màn hình của từng thiết bị xuống. Xin lưu ý rằng khi phát hành bằng Android App Bundle, các tệp APK đã phân phối sẽ tự động được tối ưu hoá cho mật độ màn hình. Tuy nhiên, bạn phải sử dụng cùng một phương pháp đó trong trường hợp nhắm mục tiêu theo kích thước màn hình.

Để biết thêm thông tin, hãy xem phần Tạo nhiều APK cho các kích thước màn hình khác nhau.

Khai báo tỷ lệ khung hình tối đa

Để hỗ trợ nhiều thiết bị nhất có thể, ứng dụng phải điều chỉnh bố cục một cách linh động để đảm bảo nội dung cũng như các chế độ điều khiển được hiển thị và sắp xếp hợp lý.

Hầu hết các ứng dụng cũng phải đổi kích thước để người dùng có thể chạy các ứng dụng đó ở chế độ nhiều cửa sổ. Người dùng có thể chạy một hoạt động có thể đổi kích thước ở chế độ chia đôi màn hình và chế độ hình dạng tuỳ ý, cũng như thay đổi kích thước của hoạt động bằng cách kéo các cạnh hoặc góc của hoạt động đó.

Chế độ nhiều cửa sổ có sẵn cho mọi ứng dụng chạy trong Android 7.0 (API cấp 24) trở lên và các ứng dụng có thể đổi kích thước theo mặc định. Bạn cũng có thể đặt thuộc tính android:resizeableActivity=true một cách rõ ràng cho toàn bộ ứng dụng hoặc các hoạt động cụ thể.

Android 12 (API cấp độ 31) mặc định ở chế độ nhiều cửa sổ. Trên các màn hình lớn (sw >= 600 dp), tất cả ứng dụng đều chạy ở chế độ nhiều cửa sổ bất kể cấu hình ứng dụng là gì. Nếu là resizeableActivity="false", ứng dụng sẽ được đưa vào chế độ tương thích khi cần thiết để phù hợp với kích thước màn hình. Trên màn hình nhỏ (sw < 600dp), hệ thống sẽ kiểm tra chế độ cài đặt minWidth, minHeightresizeableActivity của hoạt động để xác định xem hoạt động đó có thể chạy ở chế độ nhiều cửa sổ hay không. Nếu là resizeableActivity="false", hoạt động sẽ không hỗ trợ chế độ nhiều cửa sổ bất kể chiều rộng và chiều cao tối thiểu của hoạt động là như thế nào.

Trên API cấp 30 trở xuống, nếu bạn không muốn ứng dụng hoặc hoạt động của mình chạy ở chế độ nhiều cửa sổ, hãy đặt resizeableActivity=false. Trong trường hợp này, ứng dụng luôn xuất hiện ở chế độ toàn màn hình. Hệ thống sẽ kiểm soát cách thực hiện việc này, tuỳ thuộc vào cấp độ hệ điều hành Android:

  • Nếu ứng dụng của bạn nhắm đến Android 8.0 (API cấp 26) đến Android 11 (API cấp 30), thì ứng dụng sẽ lấp đầy toàn bộ màn hình theo bố cục của ứng dụng.
  • Nếu ứng dụng của bạn nhắm đến Android 7.1 (API cấp 25) trở xuống, thì hệ thống sẽ giới hạn kích thước giao diện của ứng dụng ở một cửa sổ có tỷ lệ khung hình là 16:9 (khoảng 1,86). Nếu ứng dụng chạy trên một thiết bị có tỷ lệ khung hình màn hình lớn hơn, thì ứng dụng sẽ xuất hiện trong khung viền 16:9 và không sử dụng được một phần màn hình.

Nếu bố cục ứng dụng không thể thích ứng với các tỷ lệ khung hình lớn tuỳ ý, thì bạn có thể thực thi hiệu ứng hòm thư một cách rõ ràng ở mọi cấp độ hệ điều hành Android bằng cách đặt tỷ lệ khung hình tối đa. Bạn nên dùng tỷ lệ 2,4 (12:5). Ứng dụng của bạn sẽ ở dạng hòm thư khi chạy trên một thiết bị có tỷ lệ khung hình lớn hơn tỷ lệ khung hình mà bạn chỉ định. Giá trị bạn chọn phải tối thiểu là 1,0 cho các thiết bị Wear OS và ít nhất là 1,33 cho các thiết bị khác. Nếu bạn chỉ định một tỷ lệ nhỏ hơn các giới hạn này, hệ thống sẽ ràng buộc tỷ lệ khung hình của ứng dụng tuỳ thuộc vào cấp hệ điều hành như mô tả ở trên.

Để thiết lập tỷ lệ khung hình tối đa cho Android 8.0 (API cấp 26) trở lên, hãy khai báo tỷ lệ tối đa bằng cách sử dụng android:maxAspectRatio trong thẻ <activity>. Ví dụ sau đây cho thấy cách khai báo tỷ lệ khung hình tối đa là 2,4:

<!-- Render on full screen up to screen aspect ratio of 2.4 -->
<!-- Use a letterbox on screens larger than 2.4 -->
<activity android:maxAspectRatio="2.4">
 ...
</activity>

Đối với Android 7.1 trở xuống, hãy thêm một phần tử <meta-data> có tên là android.max_aspect trong phần tử <application> như sau:

<!-- Render on full screen up to screen aspect ratio of 2.4 -->
<!-- Use a letterbox on screens larger than 2.4 -->
<meta-data android:name="android.max_aspect" android:value="2.4" />

Nếu bạn đặt tỷ lệ khung hình tối đa, hãy nhớ đặt cả android:resizeableActivity false. Nếu không, tỷ lệ khung hình tối đa sẽ không có hiệu lực.

Khai báo kích thước màn hình tối đa

Ngay cả khi không tối ưu hoá hoàn toàn ứng dụng để hỗ trợ nhiều kích thước màn hình, Android vẫn có thể kéo giãn hầu hết ứng dụng cho vừa với màn hình lớn hơn. Vì vậy, hầu như không bao giờ cần phải khai báo kích thước màn hình tối đa.

Và nếu quyết định tạo nhiều APK cho các kích thước màn hình khác nhau, bạn không cần giới hạn APK chỉ ở màn hình nhỏ, vì APK được tối ưu hoá cho màn hình lớn phải có versionCode lớn hơn. Vì vậy, Google Play luôn cung cấp APK đó cho các thiết bị có màn hình lớn.

Tuy nhiên, nếu vẫn chưa hài lòng với cách Android đổi kích thước ứng dụng cho màn hình lớn, bạn có thể tắt tính năng đổi kích thước vượt quá một chiều rộng nhất định bằng cách chỉ định thuộc tính largestWidthLimitDp trong thẻ tệp kê khai <supports-screens>. Sau đó, thay vì đổi kích thước bố cục, Android sẽ bật chế độ tương thích màn hình. Chế độ này sẽ vẽ bố cục giống như trên kích thước lớn nhất mà ứng dụng của bạn hỗ trợ, sau đó tăng tỷ lệ tất cả các pixel để lấp đầy màn hình.

Hạn chế ứng dụng của bạn chỉ cho máy tính bảng hoặc TV

Bạn có thể ngăn các điện thoại di động tải ứng dụng xuống bằng cách sử dụng phần tử tệp kê khai <supports-screens>.

Ví dụ: nội dung sau đây khai báo rằng chỉ có màn hình lớn và rất lớn mới nên cài đặt ứng dụng của bạn:

<manifest ... >
    <supports-screens android:smallScreens="false"
                      android:normalScreens="false"
                      android:largeScreens="true"
                      android:xlargeScreens="true"/>
    ...
</manifest>

Chỉ hạn chế ứng dụng của bạn cho các kích thước và mật độ cụ thể

Bạn có thể xác định kích thước và mật độ màn hình chính xác mà ứng dụng của mình hỗ trợ bằng phần tử tệp kê khai <compatible-screens>. Tuy nhiên, bạn nên tránh sử dụng thuộc tính này vì mọi tổ hợp kích thước và mật độ mà bạn không chỉ định đều được coi là cấu hình màn hình mà ứng dụng không tương thích. Vì vậy, việc sử dụng phần tử này sẽ giúp bạn dễ dàng chặn ứng dụng khỏi nhiều thiết bị mà ứng dụng thực sự có thể hỗ trợ.

Phần tử <compatible-screens> phải chứa ít nhất một phần tử <screen>. Mỗi phần tử <screen> chỉ định một cấu hình màn hình tương thích với ứng dụng của bạn bằng cách sử dụng cả thuộc tính android:screenSizeandroid:screenDensity. Mỗi phần tử <screen> phải bao gồm cả hai thuộc tính để chỉ định một cấu hình màn hình riêng lẻ. Nếu thiếu một trong hai thuộc tính, thì phần tử đó sẽ không hợp lệ (các dịch vụ bên ngoài như Google Play sẽ bỏ qua thuộc tính đó).

Sau đây là ví dụ minh hoạ mục nhập tệp kê khai nếu ứng dụng của bạn chỉ tương thích với các kích thước màn hình nhỏ và bình thường (và một tập hợp con mật độ màn hình):

<manifest ... >
    <compatible-screens>
        <!-- all small size screens -->
        <screen android:screenSize="small" android:screenDensity="ldpi" />
        <screen android:screenSize="small" android:screenDensity="mdpi" />
        <screen android:screenSize="small" android:screenDensity="hdpi" />
        <screen android:screenSize="small" android:screenDensity="xhdpi" />
        <!-- all normal size screens -->
        <screen android:screenSize="normal" android:screenDensity="ldpi" />
        <screen android:screenSize="normal" android:screenDensity="mdpi" />
        <screen android:screenSize="normal" android:screenDensity="hdpi" />
        <screen android:screenSize="normal" android:screenDensity="xhdpi" />
    </compatible-screens>
    ...
    <application ... >
        ...
    <application>
</manifest>

Mọi tổ hợp kích thước và mật độ không được khai báo rõ ràng ở đây sẽ bị hạn chế cài đặt ứng dụng.