Ứ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 phải đổi kích thước và hoạt động trên nhiều màn hình, đồng thời hệ thống phải kiểm soát vị trí đặt ứng dụng. Ví dụ: để tạo một trải nghiệm mới và độc đáo cho các thiết bị có thể gập lại và chạy một ứng dụng đặc biệt trên màn hình ngoài khi thiết bị đang 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ó 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. 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 rồi sau đó khởi chạy trên một màn hình cụ thể. Nói cách khác, đừng giả định rằng nội dung 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 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, 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ả nội dung, 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 chủ sở hữu đề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ế quyền truy cập và chỉ cho phép các ứng dụng đáng tin cậy.
Ngoài ra, các hạn chế khác cũng đượ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 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à phương thức 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á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
Bạn có thể định cấu hình Thành phần trang trí của hệ thống 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 các thành phần trang trí của 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 có xuất hiện trên màn hình hay không.
Để biết thông tin chi tiết, hãy xem DisplayWindowSettings#shouldShowSystemDecorsLocked()
và 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 màn hình phần cứng (xem DisplayInfo#address
).
Ví dụ: cấu hình màn hình sau đây cho phép các thành phần 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 để xác định màn hình trong thuộc tính tên, đố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 lựa chọn khác là sử dụng thông tin về 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 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: