Các phương pháp đề xuất

Ứng dụng cho thiết bị có thể gập lại và thiết bị nhiều màn hình

Nói chung, ứng dụng không nên dựa vào giá trị nhận dạng hoặc logic tĩnh phụ thuộc vào một số mã hiển thị. Trong hầu hết các trường hợp, ứng dụng cần đổi kích thước và hoạt động trên nhiều màn hình và hệ thống sẽ kiểm soát nơi xác định vị trí ứng dụng. Ví dụ: để tạo một trải nghiệm mới và độc đáo dành cho thiết bị có thể gập lại, cũng như ra mắt một ứng dụng đặc biệt trên màn hình bên ngoài khi thiết bị gập.

Trong trường hợp này, SystemUI (hoặc một thành phần hệ thống khác) sẽ phát hiện màn hình gập, xác định xem có thích hợp để thực hiện một hành động hay không, sau đó khởi chạy hoạt động mục tiêu và chỉ định mã màn hình ngoài làm mục tiêu khởi chạy. Ứng dụng không được phát hiện hành động này hoặc thực hiện bất kỳ hành động nào để phản hồi, sau đó thực hiện việc khởi chạy trên một màn hình cụ thể. Nói cách khác, đừng cho rằng dịch vụ nào hoạt động trên một thiết bị sẽ hoạt động trên các thiết bị khác. Tóm lại, mã dành riêng cho thiết bị làm tăng mức độ phân mảnh.

Giới hạn quyền truy cập vào các màn hình

Nếu cấu hình thiết bị yêu cầu giới hạn quyền truy cập vào một hoặc nhiều hiển thị, thì bạn nên sử dụng cờ Display#FLAG_PRIVATE để chỉ định các màn hình đó là riêng tư. Thao tác này sẽ hạn chế tất cả người dùng, ngoại trừ chủ sở hữu, thêm nội dung vào màn hình. Bất kỳ nỗ lực nào để khởi chạy một hoạt động hoặc để thêm cửa sổ bởi bất kỳ ai trừ chủ sở hữu dẫn đến SecurityException. Nếu sở hữu màn hình, hệ thống có thể thêm cửa sổ và khởi chạy hoạt động.

Ngoài ra, các thực thể được đặt trên một màn hình luôn có thể truy cập vào màn hình đó. Nếu chủ sở hữu khởi chạy một hoạt động trên màn hình, thì hoạt động đó có thể khởi chạy các hoạt động khác trên màn hình này. Do đó, chủ sở hữu có trách nhiệm hạn chế chỉ cho phép các ứng dụng đáng tin cậy.

Ngoài ra, các hạn chế khác được thêm vào màn hình ảo vì mọi ứng dụng đều có thể tạo màn hình ảo mà không hiển thị cho người dùng. Nếu màn hình ảo không do hệ thống sở hữu, thì chỉ những hoạt động có allowEmbedded được phép và phương thức gọi phải có ACTIVITY_EMBEDDING quyền.

Để biết thêm thông tin, hãy xem:

  • ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay()
  • ActivityDisplay#isUidPresent()
  • DisplayManagerService#isUidPresentOnDisplay()

Để kiểm soát các hoạt động khởi chạy theo điều kiện, hãy sử dụng LaunchParamsController, chặn tất cả các hoạt động khởi chạy và cho phép một thành phần hệ thống sửa đổi các tham số dùng để khởi chạy. Tính năng này có trong system_server.

Định cấu hình chế độ cài đặt cửa sổ hiển thị và trang trí hệ thống

Phần trang trí hệ thống có thể được định cấu hình cho mỗi màn hình trong DisplayWindowSettings. Việc triển khai thiết bị có thể cung cấp cấu hình mặc định trong /data/system/display_settings.xml.

Giá trị này xác định liệu trang trí hệ thống (trình chạy, hình nền, thanh điều hướng và các cửa sổ trang trí khác) và IME xuất hiện trên màn hình. Để biết thông tin chi tiết, hãy xem DisplayWindowSettings#shouldShowSystemDecorsLocked()DisplayWindowSettings#shouldShowImeLocked().

Để xác định màn hình, hãy sử dụng mã nhận dạng duy nhất (mặc định này sử dụng DisplayInfo#uniqueId) hoặc mã nhận dạng cổng thực cho phần cứng màn hình (xem DisplayInfo#address).

Ví dụ: ví dụ về cấu hình hiển thị sau đây bật tính năng trang trí hệ thống và IME trên màn hình mô phỏng:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<display-settings>
<config identifier="0" />
<display
  name="overlay:1"
  shouldShowSystemDecors="true"
  shouldShowIme="true" />
</display-settings>

Trong ví dụ trên, uniqueId được dùng để nhận dạng màn hình trong thuộc tính name (tên), overlay:1 dùng cho màn hình mô phỏng. Đối với màn hình tích hợp, giá trị mẫu có thể là "local:45354385242535243453". Một lựa chọn khác là sử dụng thông tin cổng phần cứng và đặt identifier="1" để tương ứng với DisplayWindowSettings#IDENTIFIER_PORT, sau đó cập nhật để sử dụng định dạng "port:<port_id>":

<?xmlversion='1.0' encoding='utf-8' standalone='yes' ?>
<display-settings>
<config identifier="1" />
<display
  name="port:12345"
  shouldShowSystemDecors="true"
  shouldShowIme="true" />
</display-settings>

Để biết thông tin chi tiết, hãy xem phần Mã nhận dạng màn hình tĩnh.

Để biết thêm thông tin, hãy xem: