Ekran główny Androida, dostępny na większości urządzeń z tym systemem, umożliwia użytkownikowi umieszczanie widżetów aplikacji (lub widżetów) w celu szybkiego dostępu do treści. Jeśli tworzysz zamiennik ekranu głównego lub podobną aplikację, możesz też umożliwić użytkownikowi umieszczanie widżetów, implementując AppWidgetHost. Większość aplikacji nie musi tego robić, ale jeśli tworzysz własnego hosta, musisz zrozumieć zobowiązania umowne, które host akceptuje w sposób dorozumiany.
Na tej stronie omawiamy obowiązki związane z implementacją niestandardowego AppWidgetHost. Konkretny przykład implementacji AppWidgetHost znajdziesz w kodzie źródłowym ekranu głównego Androida LauncherAppWidgetHost.
Oto przegląd najważniejszych klas i pojęć związanych z implementacją niestandardowego elementu AppWidgetHost:
Host widżetu aplikacji:
AppWidgetHostzapewnia interakcję z usługą AppWidget w przypadku aplikacji, które umieszczają widżety w swoim interfejsie.AppWidgetHostmusi mieć identyfikator, który jest unikalny w pakiecie hosta. Ten identyfikator jest zachowywany we wszystkich przypadkach użycia hosta. Identyfikator jest zwykle wartością zakodowaną na stałe, którą przypisujesz w aplikacji.Identyfikator widżetu aplikacji: każda instancja widżetu otrzymuje unikalny identyfikator w momencie powiązania. Zobacz
bindAppWidgetIdIfAllowed()i sekcję Wiązanie widżetów poniżej, aby dowiedzieć się więcej. Host uzyskuje unikalny identyfikator za pomocąallocateAppWidgetId(). Ten identyfikator jest zachowywany przez cały okres ważności widżetu, dopóki nie zostanie on usunięty z hosta. Wszystkie stany związane z hostem, takie jak rozmiar i lokalizacja widżetu, muszą być przechowywane przez pakiet hostujący i powiązane z identyfikatorem widżetu aplikacji.Widok hosta widżetu aplikacji:
AppWidgetHostViewto ramka, w której widżet jest umieszczany, gdy ma zostać wyświetlony. Widżet jest powiązany zAppWidgetHostViewza każdym razem, gdy jest on rozwijany przez hosta.- Domyślnie system tworzy obiekt
AppWidgetHostView, ale host może utworzyć własną podklasęAppWidgetHostView, rozszerzając ją. - Od Androida 12 (poziom interfejsu API 31)
AppWidgetHostViewwprowadza metodysetColorResources()iresetColorResources()do obsługi dynamicznie przeciążonych kolorów. Host jest odpowiedzialny za dostarczanie kolorów do tych metod.
- Domyślnie system tworzy obiekt
Pakiet opcji:
AppWidgetHostużywa pakietu opcji do przekazywania informacji doAppWidgetProvidero tym, jak wyświetlany jest widżet, np. listy zakresów rozmiarów, oraz o tym, czy widżet znajduje się na ekranie blokady czy na ekranie głównym. Dzięki tym informacjomAppWidgetProvidermoże dostosować zawartość i wygląd widżetu do sposobu i miejsca jego wyświetlania. Aby zmodyfikować pakiet widżetu, możesz użyćupdateAppWidgetOptions()iupdateAppWidgetSize(). Obie te metody wywołują wywołanie zwrotneonAppWidgetOptionsChanged()doAppWidgetProvider.
Bindowanie widżetów
Gdy użytkownik dodaje widżet do hosta, następuje proces nazywany wiązaniem. Powiązanie odnosi się do powiązania konkretnego identyfikatora widżetu aplikacji z określonym hostem i określonym AppWidgetProvider.
Interfejsy API powiązań umożliwiają też hostowi udostępnianie niestandardowego interfejsu do powiązań. Aby korzystać z tego procesu, aplikacja musi zadeklarować uprawnienie BIND_APPWIDGET w pliku manifestu hosta:
<uses-permission android:name="android.permission.BIND_APPWIDGET" />
To jednak dopiero pierwszy krok. W czasie działania użytkownik musi wyraźnie przyznać aplikacji uprawnienia, aby mogła ona dodać widżet do hosta. Aby sprawdzić, czy aplikacja ma uprawnienia do dodawania widżetu, użyj metody bindAppWidgetIdIfAllowed(). Jeśli bindAppWidgetIdIfAllowed() zwraca false, aplikacja musi wyświetlić okno z prośbą o przyznanie uprawnień: „Zezwól” w przypadku bieżącego dodawania widżetu lub „Zawsze zezwalaj” w przypadku wszystkich przyszłych dodawań widżetów.
Ten fragment kodu pokazuje, jak wyświetlić okno:
val intent = Intent(AppWidgetManager.ACTION_APPWIDGET_BIND).apply { putExtra(AppWidgetManager.EXTRA_APPWIDGET_ID, appWidgetId) putExtra(AppWidgetManager.EXTRA_APPWIDGET_PROVIDER, info.provider) // This is the options bundle described in the preceding section. putExtra(AppWidgetManager.EXTRA_APPWIDGET_OPTIONS, options) } startActivityForResult(intent, REQUEST_BIND_APPWIDGET)
Host musi sprawdzić, czy widżet dodany przez użytkownika wymaga konfiguracji. Więcej informacji znajdziesz w artykule Zezwalanie użytkownikom na konfigurowanie widżetów aplikacji.
Obowiązki gospodarza
Możesz określić szereg ustawień konfiguracji widżetów, korzystając z metadanych AppWidgetProviderInfo.
Te opcje konfiguracji, które zostały szczegółowo opisane w kolejnych sekcjach, możesz pobrać z obiektu AppWidgetProviderInfo powiązanego z dostawcą widżetu.
Wszyscy gospodarze mają te obowiązki:
Podczas dodawania widżetu przydziel identyfikator widżetu zgodnie z opisem powyżej. Gdy widżet zostanie usunięty z hosta, wywołaj funkcję
deleteAppWidgetId(), aby wycofać przydział identyfikatora widżetu.Podczas dodawania widżetu sprawdź, czy trzeba uruchomić aktywność konfiguracji. Zwykle host musi uruchomić aktywność konfiguracji widżetu, jeśli istnieje i nie jest oznaczona jako opcjonalna przez określenie flag
configuration_optionalireconfigurable. Szczegółowe informacje znajdziesz w sekcji Aktualizowanie widżetu z poziomu aktywności konfiguracji. Jest to konieczny krok, aby wiele widżetów mogło się wyświetlać.Widżety określają domyślną szerokość i wysokość w metadanych
AppWidgetProviderInfo. Te wartości są definiowane w komórkach – począwszy od Androida 12, jeśli określonotargetCellWidthitargetCellHeight– lub w dp, jeśli określono tylkominWidthiminHeight. Zobacz Atrybuty rozmiaru widżetu.Upewnij się, że widżet ma co najmniej tyle dp. Na przykład wiele hostów wyrównuje ikony i widżety na siatce. W tym scenariuszu host domyślnie dodaje widżet, używając minimalnej liczby komórek, które spełniają ograniczenia
minWidthiminHeight.
Wskazówki dotyczące podejścia
Oprócz wymagań wymienionych w poprzedniej sekcji pamiętaj o tych wskazówkach:
Pakiet opcji może zawierać element List<SizeF>, który zawiera listę możliwych rozmiarów w dp, jakie może przyjąć instancja widżetu. Liczba podanych rozmiarów zależy od implementacji hosta. Hosty zwykle udostępniają 2 rozmiary dla telefonów (pionowy i poziomy) oraz 4 rozmiary dla urządzeń składanych.
Liczba różnych RemoteViews, które AppWidgetProvider może udostępniać RemoteViews, jest ograniczona do MAX_INIT_VIEW_COUNT (16).
Obiekty AppWidgetProvider mapują obiekt RemoteViews na każdy rozmiar w List<SizeF>, dlatego nie podawaj więcej niż MAX_INIT_VIEW_COUNT rozmiarów.
Jeśli widżety określają atrybuty maxResizeWidth i maxResizeHeight w dp, zalecamy, aby widżet, który używa co najmniej jednego z tych atrybutów, nie przekraczał rozmiaru określonego przez atrybuty.
Dodatkowe materiały
- Zapoznaj się z dokumentacją referencyjną
Glance.