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

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

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

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ó phù 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 ID hiển thị bên 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 rồi 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 những gì 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 tóm lại, mã dành riêng cho thiết bị sẽ làm tăng sự phân mảnh.

Hạn chế quyền truy cập vào màn hình

Nếu cấu hình thiết bị yêu cầu hạn chế quyền truy cập vào một hoặc nhiều màn hình thì khuyến nghị là sử dụng cờ Display#FLAG_PRIVATE để chỉ định những màn hình đó là riêng tư . Làm như vậy sẽ hạn chế tất cả trừ chủ sở hữu thêm nội dung vào màn hình. Mọi nỗ lực khởi chạy một hoạt động hoặc thêm cửa sổ của bất kỳ ai ngoại trừ chủ sở hữu đều dẫn đến SecurityException . Nếu hệ thống 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àn hình luôn có thể truy cập 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ế quyền truy cập và chỉ cho phép các ứng dụng đáng tin cậy.

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

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

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

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

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

Trang trí hệ thống có thể được 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 xem các trang trí hệ thống (trình khởi chạy, hình nền, thanh điều hướng và các cửa sổ trang trí khác) và IME có xuất hiện trên màn hình hay không. Để biết chi tiết, hãy xem DisplayWindowSettings#shouldShowSystemDecorsLocked()DisplayWindowSettings#shouldShowImeLocked() .

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

Ví dụ: ví dụ về cấu hình hiển thị sau đây cho phép 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 sử dụng để nhận dạng hiển thị trong thuộc tính name, thuộc tính này đối với màn hình mô phỏng là overlay:1 . Đối với màn hình tích hợp, giá trị mẫu có thể là "local:45354385242535243453" . Một tùy 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 tên để 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 chi tiết, hãy xem Mã nhận dạng hiển thị tĩnh .

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