Màn hình chính của Android (có trên hầu hết các thiết bị chạy Android) cho phép người dùng nhúng tiện ích ứng dụng (hoặc tiện ích) để truy cập nhanh vào nội dung. Nếu đang tạo một ứng dụng thay thế màn hình chính hoặc một ứng dụng tương tự, bạn cũng có thể cho phép người dùng nhúng tiện ích bằng cách triển khai AppWidgetHost
. Đây không phải là điều mà hầu hết các ứng dụng cần làm, nhưng nếu bạn đang tạo máy chủ lưu trữ của riêng mình, thì điều quan trọng là bạn phải hiểu các nghĩa vụ theo hợp đồng mà máy chủ lưu trữ ngầm đồng ý.
Trang này tập trung vào các trách nhiệm liên quan đến việc triển khai một AppWidgetHost
tuỳ chỉnh. Để xem ví dụ cụ thể về cách triển khai AppWidgetHost
, hãy xem mã nguồn cho màn hình chính của Android LauncherAppWidgetHost
.
Sau đây là thông tin tổng quan về các lớp và khái niệm chính liên quan đến việc triển khai một AppWidgetHost
tuỳ chỉnh:
Máy chủ tiện ích ứng dụng:
AppWidgetHost
cung cấp hoạt động tương tác với dịch vụ AppWidget cho những ứng dụng nhúng tiện ích vào giao diện người dùng.AppWidgetHost
phải có một mã nhận dạng duy nhất trong gói của chính máy chủ lưu trữ. Mã nhận dạng này vẫn tồn tại trong mọi lần sử dụng máy chủ lưu trữ. Mã nhận dạng thường là một giá trị được mã hoá cứng mà bạn chỉ định trong ứng dụng của mình.Mã nhận dạng tiện ích ứng dụng: mỗi thực thể tiện ích được chỉ định một mã nhận dạng duy nhất tại thời điểm liên kết. Xem
bindAppWidgetIdIfAllowed()
và để biết thêm thông tin chi tiết, hãy xem phần Liên kết các tiện ích sau đây. Máy chủ lưu trữ lấy mã nhận dạng duy nhất bằng cách sử dụngallocateAppWidgetId()
. Mã nhận dạng này sẽ tồn tại trong suốt thời gian tồn tại của tiện ích cho đến khi tiện ích bị xoá khỏi máy chủ lưu trữ. Mọi trạng thái dành riêng cho máy chủ lưu trữ (chẳng hạn như kích thước và vị trí của tiện ích) đều phải được duy trì bởi gói lưu trữ và được liên kết với mã nhận dạng tiện ích ứng dụng.Khung hiển thị máy chủ tiện ích ứng dụng: hãy coi
AppWidgetHostView
là một khung mà tiện ích được bao bọc trong đó bất cứ khi nào cần hiển thị. Một tiện ích được liên kết với mộtAppWidgetHostView
mỗi khi tiện ích đó được máy chủ tăng kích thước.- Theo mặc định, hệ thống sẽ tạo một
AppWidgetHostView
, nhưng máy chủ có thể tạo lớp con riêng củaAppWidgetHostView
bằng cách mở rộng lớp này. - Kể từ Android 12 (API cấp 31),
AppWidgetHostView
giới thiệu các phương thứcsetColorResources()
vàresetColorResources()
để xử lý các màu được nạp chồng động. Máy chủ lưu trữ chịu trách nhiệm cung cấp màu sắc cho các phương thức này.
- Theo mặc định, hệ thống sẽ tạo một
Gói tuỳ chọn:
AppWidgetHost
sử dụng gói tuỳ chọn để truyền đạt thông tin đếnAppWidgetProvider
về cách hiển thị tiện ích (ví dụ: danh sách các dải kích thước) và liệu tiện ích có nằm trên màn hình khoá hay màn hình chính hay không. Thông tin này cho phépAppWidgetProvider
điều chỉnh nội dung và giao diện của tiện ích dựa trên cách thức và vị trí hiển thị. Bạn có thể sử dụngupdateAppWidgetOptions()
vàupdateAppWidgetSize()
để sửa đổi gói của một tiện ích. Cả hai phương thức này đều kích hoạt lệnh gọi lạionAppWidgetOptionsChanged()
choAppWidgetProvider
.
Liên kết tiện ích
Khi người dùng thêm một tiện ích vào một máy chủ lưu trữ, một quy trình gọi là liên kết sẽ diễn ra. Liên kết là việc liên kết một mã nhận dạng tiện ích ứng dụng cụ thể với một máy chủ cụ thể và một AppWidgetProvider
cụ thể.
API liên kết cũng giúp máy chủ lưu trữ cung cấp giao diện người dùng tuỳ chỉnh để liên kết. Để sử dụng quy trình này, ứng dụng của bạn phải khai báo quyền BIND_APPWIDGET
trong tệp kê khai của máy chủ lưu trữ:
<uses-permission android:name="android.permission.BIND_APPWIDGET" />
Nhưng đây mới chỉ là bước đầu tiên. Khi bắt đầu chạy, người dùng phải cấp quyền một cách rõ ràng cho ứng dụng của bạn để ứng dụng có thể thêm một tiện ích vào máy chủ lưu trữ. Để kiểm tra xem ứng dụng của bạn có quyền thêm tiện ích hay không, hãy sử dụng phương thức bindAppWidgetIdIfAllowed()
. Nếu bindAppWidgetIdIfAllowed()
trả về false
, ứng dụng của bạn phải hiển thị một hộp thoại nhắc người dùng cấp quyền: "cho phép" đối với lần thêm tiện ích hiện tại hoặc "luôn cho phép" đối với tất cả các lần thêm tiện ích trong tương lai.
Đoạn mã này đưa ra một ví dụ về cách hiển thị hộp thoại:
Kotlin
val intent = Intent(AppWidgetManager.ACTION_APPWIDGET_BIND).apply { putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, info.componentName) // This is the options bundle described in the preceding section. putExtra(AppWidgetManager.EXTRA_APPWIDGET_OPTIONS, options) } startActivityForResult(intent, REQUEST_BIND_APPWIDGET)
Java
Intent intent = new Intent(AppWidgetManager.ACTION_APPWIDGET_BIND); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId); intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, info.componentName); // This is the options bundle described in the preceding section. intent.putExtra(AppWidgetManager.EXTRA_APPWIDGET_OPTIONS, options); startActivityForResult(intent, REQUEST_BIND_APPWIDGET);
Máy chủ lưu trữ phải kiểm tra xem tiện ích mà người dùng thêm có cần được định cấu hình hay không. Để biết thêm thông tin, hãy xem phần Cho phép người dùng định cấu hình các tiện ích ứng dụng.
Trách nhiệm của người tổ chức
Bạn có thể chỉ định một số chế độ cài đặt cấu hình cho các tiện ích bằng cách sử dụng siêu dữ liệu AppWidgetProviderInfo
.
Bạn có thể truy xuất các lựa chọn cấu hình này (được đề cập chi tiết hơn trong các phần sau) từ đối tượng AppWidgetProviderInfo
được liên kết với một trình cung cấp tiện ích.
Bất kể phiên bản Android mà bạn đang nhắm đến, tất cả các máy chủ lưu trữ đều có những trách nhiệm sau:
Khi thêm tiện ích, hãy phân bổ mã nhận dạng tiện ích như mô tả ở trên. Khi một tiện ích bị xoá khỏi máy chủ lưu trữ, hãy gọi
deleteAppWidgetId()
để huỷ phân bổ mã nhận dạng tiện ích.Khi thêm một tiện ích, hãy kiểm tra xem có cần khởi chạy hoạt động cấu hình hay không. Thông thường, máy chủ cần khởi chạy hoạt động định cấu hình của tiện ích nếu hoạt động đó tồn tại và không được đánh dấu là không bắt buộc bằng cách chỉ định cả cờ
configuration_optional
vàreconfigurable
. Hãy xem phần Cập nhật tiện ích từ hoạt động cấu hình để biết thông tin chi tiết. Đây là một bước cần thiết đối với nhiều tiện ích trước khi chúng có thể hiển thị.Các tiện ích chỉ định chiều rộng và chiều cao mặc định trong siêu dữ liệu
AppWidgetProviderInfo
. Các giá trị này được xác định trong các ô – bắt đầu từ Android 12, nếutargetCellWidth
vàtargetCellHeight
được chỉ định – hoặc dp nếu chỉminWidth
vàminHeight
được chỉ định. Xem Các thuộc tính định cỡ tiện ích.Đảm bảo rằng tiện ích được bố trí với ít nhất số lượng dps này. Ví dụ: nhiều máy chủ lưu trữ căn chỉnh các biểu tượng và tiện ích trong một lưới. Trong trường hợp này, theo mặc định, máy chủ sẽ thêm một tiện ích bằng số ô tối thiểu đáp ứng các quy tắc ràng buộc
minWidth
vàminHeight
.
Ngoài các yêu cầu được liệt kê trong phần trước, các phiên bản nền tảng cụ thể còn giới thiệu những tính năng đặt ra trách nhiệm mới cho máy chủ lưu trữ.
Xác định phương pháp dựa trên phiên bản Android mục tiêu
Android 12
Android 12 (API cấp 31) đi kèm một List<SizeF>
bổ sung chứa danh sách các kích thước có thể có theo đơn vị dp mà một thực thể tiện ích có thể nhận trong gói tuỳ chọn.
Số lượng kích thước được cung cấp phụ thuộc vào việc triển khai máy chủ lưu trữ. Thông thường, các máy chủ cung cấp 2 kích thước cho điện thoại (dọc và ngang) và 4 kích thước cho thiết bị có thể gập lại.
Có giới hạn là MAX_INIT_VIEW_COUNT
(16) đối với số lượng RemoteViews
khác nhau mà AppWidgetProvider
có thể cung cấp cho RemoteViews
.
Vì các đối tượng AppWidgetProvider
liên kết một đối tượng RemoteViews
với từng kích thước trong List<SizeF>
, nên đừng cung cấp nhiều hơn MAX_INIT_VIEW_COUNT
kích thước.
Android 12 cũng giới thiệu các thuộc tính maxResizeWidth
và maxResizeHeight
trong dps. Bạn nên đảm bảo rằng một tiện ích sử dụng ít nhất một trong các thuộc tính này không vượt quá kích thước mà các thuộc tính chỉ định.
Tài nguyên khác
- Hãy xem tài liệu tham khảo về
Glance
.