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

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

Nhìn 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 thấy gập, xác định xem có thích hợp để thực hiện hành động hay không và sau đó khởi chạy hoạt động mục tiêu và chỉ định mã hiển thị bên ngoài làm mục tiêu khởi chạy. Ứng dụng không nên 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 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. Nói ngắn gọn là dành riêng cho từng thiết bị, làm tăng sự 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ư. Việc này sẽ hạn chế tất cả trừ 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 có quyền sở hữu màn hình, hệ thống có thể thêm cửa sổ và khởi chạy các 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 chạy một hoạt động trên một màn hình, thì hoạt động đó có thể chạy hoạt động 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 áp dụng cho màn hình ảo vì bất kỳ ứng dụng nào cũng có thể tạo bản ghi 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 các chế độ cài đặt hiển thị cửa sổ 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. Một 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ột 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 vật lý cho phần cứng màn hình (xem DisplayInfo#address).

Ví dụ: ví dụ về cấu hình màn hình 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 bài viết Mã nhận dạng hiển thị tĩnh.

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