Hành vi khởi chạy hoạt động được xác định bằng các chế độ khởi chạy trong tệp AndroidManifest.xml
của ứng dụng, cờ ý định và ActivityOptions do phương thức gọi cung cấp. Sử dụng ActivityOption#setLaunchDisplayId(int)
để nhắm đến một màn hình cụ thể để khởi chạy hoạt động.
- Theo mặc định, hoạt động sẽ chạy trên cùng một màn hình với phương thức gọi. Ví dụ: một thực thể mới của hoạt động bắt đầu từ trình chạy phải được đặt trên cùng một màn hình mà không cần thêm cờ hoặc tuỳ chọn nào. Hãy nhớ sử dụng đúng ngữ cảnh (Hoạt động so với Ứng dụng) để khởi chạy.
- Nếu quá trình khởi chạy được thực hiện từ một nguồn không liên kết với một màn hình cụ thể (chẳng hạn như từ một màn hình shell hoặc ngữ cảnh Ứng dụng), thì hoạt động sẽ được đặt trên màn hình trên cùng mà người dùng đã tương tác gần đây nhất với thiết bị hoặc từ đó hoạt động gần đây nhất đã được khởi chạy.
- Bạn có thể phân giải ý định khởi chạy một hoạt động thành một thực thể hoạt động hiện có trong hệ thống. Trong trường hợp đó, nếu không có cờ bổ sung nào được cung cấp, thì một hoạt động sẽ xuất hiện trên cùng một màn hình mà hoạt động đó được sử dụng gần đây nhất. Nếu màn hình đích được chỉ định bằng
ActivityOptions#setTargetDisplayId()
, thì hoạt động sẽ được chuyển sang màn hình đó (nếu được các quy định bảo mật và các quy định hạn chế khác cho phép).
Hạn chế về bảo mật
Để ngăn ứng dụng độc hại sử dụng sai thông tin nhạy cảm của người dùng bằng cách đọc thông tin đó từ giao diện của màn hình ảo mà ứng dụng đã tạo, các ứng dụng chỉ có thể khởi chạy hoạt động của riêng mình trên màn hình ảo mà ứng dụng đã tạo trong Android 10. Tuy nhiên:
- Các thành phần hệ thống có quyền
INTERNAL_SYSTEM_WINDOW
có thể khởi chạy trên bất kỳ màn hình nào. - Phương thức gọi có quyền
ACTIVITY_EMBEDDING
có thể khởi chạy hoạt động từ các ứng dụng khác có cờActivityInfo.FLAG_ALLOW_EMBEDDED
. - Chỉ chủ sở hữu hoặc các hoạt động hiện diện trên màn hình riêng tư mới được phép chạy hoạt động trên màn hình đó.
Các hạn chế tương tự áp dụng cho việc thêm cửa sổ vào màn hình.
Android 10 bao gồm phương thức ActivityManager#isActivityStartAllowedOnDisplay(Context context, int
displayId, Intent intent)
để kiểm tra các quy định hạn chế về bảo mật cho ứng dụng trước khi cố gắng chạy trên màn hình. Trong Android 9 (và thấp hơn), kết quả chạy bị hạn chế sẽ gửi SecurityException
.
Hầu hết các quy định hạn chế về bảo mật đều được áp dụng trong phương thức ActivityStackSupervisor#isCallerAllowedToLaunchOnDisplay()
.