Ứng dụng cho các thiết bị có thể gập lại và nhiều màn hình
Nói chung, các ứng dụng không nên dựa vào số 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 và hệ thống sẽ kiểm soát vị trí đặt ứ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 nếp gấp, xác định xem nó 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. Các ứ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 và 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 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ị 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, khuyến nghị là sử dụng cờ Display#FLAG_PRIVATE
để chỉ định các màn hình đó là riêng tư . Làm như vậy hạn chế tất cả, 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 một cửa sổ của bất kỳ ai trừ chủ sở hữu đều dẫn đến một SecurityException
. Nếu hệ thống sở hữu màn hình hiển thị, 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 chịu 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 ứng dụng mà không làm cho người dùng hiển thị. Nếu màn hình ảo không thuộc sở hữu của hệ thống thì chỉ các hoạt động với allowEmbedded
được phép và người gọi phải có quyền ACTIVITY_EMBEDDING
.
Để biết thêm thông tin, hãy xem:
-
ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay()
-
ActivityDisplay#isUidPresent()
-
DisplayManagerService#isUidPresentOnDisplay()
Để kiểm soát có điều kiện khởi chạy hoạt động, hãy sử dụng LaunchParamsController
, ngăn 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ố đượ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 đị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 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()
và 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ụ cấu hình hiển thị sau 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 được 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
và 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 Số nhận dạng màn hình tĩnh .
Để biết thêm thông tin, hãy xem: