Ảnh chụp nhanh tác vụ là cơ sở hạ tầng được giới thiệu trong Android 8.0, kết hợp ảnh chụp màn hình cho Hình thu nhỏ của ứng dụng gần đây cũng như Các thành phần đã lưu từ Trình quản lý cửa sổ. Hình thu nhỏ của nội dung gần đây thể hiện trạng thái cuối cùng của một tác vụ trong chế độ xem Nội dung gần đây.
Khi một hoạt động chuyển sang trạng thái dừng, Trình quản lý cửa sổ sẽ không huỷ các thành phần của hoạt động đó miễn là hoạt động đó nằm ở đầu tác vụ. Nếu hoạt động này phải được hiển thị lại, Trình quản lý cửa sổ có thể bắt đầu ảnh động mà không cần đợi hoạt động hoàn tất việc vẽ khung hình đầu tiên, vì trình quản lý này có thể sử dụng Saved Surface.
Kiến trúc
Hai khái niệm Hình thu nhỏ gần đây và Nội dung đã lưu được hợp nhất với Ảnh chụp nhanh nhiệm vụ. Khi một tác vụ chuyển sang nền, Trình quản lý cửa sổ sẽ đặt ảnh chụp màn hình của tác vụ này vào GraphicBuffer. Miễn là ứng dụng của hoạt động hàng đầu của tác vụ vẫn còn trong bộ nhớ, GraphicBuffer này sẽ được giữ lại trong bộ nhớ. Giờ đây, khi hoạt động tương tự được đưa lên trước một lần nữa, Window Manager sẽ tạo một cửa sổ bắt đầu (TaskSnapshotSurface) và đính kèm GraphicBuffer mà không sao chép bất kỳ bộ nhớ nào vào hàng đợi bộ nhớ đệm của cửa sổ bắt đầu. Ngay khi hoạt động vẽ khung hình đầu tiên, cửa sổ bắt đầu Task Snapshot sẽ mờ dần một cách mượt mà như màn hình chờ thông thường.
Cùng một GraphicBuffer cũng được gửi qua Binder đến SystemUI để dùng vẽ trạng thái xem trước của một tác vụ ở chế độ xem Gần đây. Vì đây chỉ là một tham chiếu đến vùng đệm, nên việc gửi tham chiếu này qua liên kết sẽ tiêu tốn ít tài nguyên. Khi GraphicBuffer đến SystemUI, nó sẽ được bao bọc trong một Bitmap phần cứng rồi được vẽ lên màn hình mà không cần tải bất kỳ bộ nhớ nào lên bộ nhớ đồ hoạ.
Lợi ích
Kiến trúc mới này mang lại 3 lợi ích chính:
- Nếu ảnh chụp nhanh tác vụ được dùng làm cửa sổ bắt đầu, thì sẽ có hiệu ứng làm mờ chéo đẹp mắt giữa ảnh chụp nhanh và nội dung thực.
- Khi ảnh chụp nhanh tác vụ được vẽ trong SystemUI, bạn có thể thực hiện việc này mà không cần sao chép. Trước đây, bitmap phải được sao chép vào Ashmem, sau đó vào bộ nhớ đồ hoạ. Vì phương thức này lưu trữ ảnh chụp nhanh trực tiếp trong bộ nhớ đồ hoạ, nên không cần sao chép.
- Trạng thái bạn thấy trong phần Gần đây luôn khớp với trạng thái bạn sẽ thấy lần đầu tiên khi mở lại ứng dụng. Việc có cùng bộ nhớ đệm ở đây cũng giúp tiết kiệm nhiều bộ nhớ. Đó là lý do mà phần Ảnh gần đây hiện có thể hiển thị những hình ảnh này ở độ phân giải gốc. Trước đây, hình ảnh này được giảm mẫu xuống 64% để tiết kiệm bộ nhớ.
Triển khai
Tính năng này hoàn toàn nằm trong nền tảng Android. Bạn không cần tích hợp và không được phép tuỳ chỉnh. Tuy nhiên, các nhà sản xuất thiết bị có thể tắt hoàn toàn tính năng Ảnh chụp nhanh tác vụ.
Để tắt tính năng này, hãy sửa đổi hàm sau:
frameworks/base/services/core/java/com/android/server/wm/TaskSnapshotController.java#215
Xin lưu ý rằng nếu bạn tắt tính năng này, chế độ xem Gần đây sẽ không hiển thị bất kỳ hình thu nhỏ nào.
Ảnh chụp nhanh có độ phân giải cao và độ phân giải thấp
Ảnh chụp nhanh của tác vụ được ghi vào đĩa ở hai tỷ lệ. Khi khôi phục ảnh chụp nhanh tác vụ từ ổ đĩa, ảnh chụp nhanh có độ phân giải thấp sẽ được đọc trước, sau đó được thay thế bằng ảnh chụp nhanh có độ phân giải cao tương ứng. Việc tối ưu hoá này giúp cải thiện thời gian tải hình ảnh. Nếu không, có thể sẽ xảy ra một chút chậm trễ khi đọc tệp ảnh chụp nhanh từ đĩa và người dùng sẽ thấy thẻ tác vụ trống cho đến khi hình ảnh xuất hiện. Bạn có thể định cấu hình các tỷ lệ trong tệp cấu hình lớp phủ thiết bịoverlay/frameworks/base/core/res/res/values/config.xml
bằng cách đặt config_highResTaskSnapshotScale
và config_lowResTaskSnapshotScale
. Theo mặc định, các giá trị này được đặt lần lượt là 1.0 và 0.5. Tắt tính năng chụp ảnh nhanh ở độ phân giải thấp bằng cách đặt config_lowResTaskSnapshotScale
thành 0.0.
Ví dụ và nguồn
Tìm phần còn lại của mã cho tính năng này trong các tệp TaskSnapshot* trong:
frameworks/base/+/android16-release/services/core/java/com/android/server/wm/