Ekran główny Androida, dostępny na większości urządzeń z Androidem, pozwala użytkownikom umieszczać widżety aplikacji (lub widżety) w celu szybkiego dostępu do treści. Jeśli tworzysz zamiennik ekranu głównego lub podobną aplikację, możesz także pozwolić użytkownikom na umieszczanie widżetów, stosując metodę AppWidgetHost
. Większość aplikacji nie musi tego zrobić, ale jeśli tworzysz własnego hosta, ważne jest, by poznać zobowiązania umowne, które host domyślnie akceptuje.
Ta strona zawiera informacje o obowiązkach związanych z wdrażaniem niestandardowych elementów zamówienia AppWidgetHost
. Konkretny przykład implementacji AppWidgetHost
znajdziesz w kodzie źródłowym ekranu głównego Androida LauncherAppWidgetHost
.
Oto przegląd najważniejszych klas i koncepcji związanych z implementacją niestandardowego elementu AppWidgetHost
:
Host widżetów aplikacji:
AppWidgetHost
umożliwia interakcję z usługą AppWidget w przypadku aplikacji, które umieszczają widżety w swoim interfejsie.AppWidgetHost
musi mieć unikalny identyfikator w ramach pakietu hosta. Ten identyfikator występuje we wszystkich zastosowaniach hosta. Jest to zwykle zakodowana na stałe wartość, którą przypisujesz w aplikacji.Identyfikator widżetu aplikacji: w momencie tworzenia powiązania do każdej instancji widżetu jest przypisywany unikalny identyfikator. Więcej informacji znajdziesz w sekcji
bindAppWidgetIdIfAllowed()
oraz w kolejnej sekcji Wiązanie widżetów. Host uzyskuje unikalny identyfikator za pomocąallocateAppWidgetId()
. Ten identyfikator będzie obowiązywał przez cały okres istnienia widżetu, aż zostanie usunięty z hosta. Każdy stan związany z hostem, taki jak rozmiar i lokalizacja widżetu, musi być utrwalony przez pakiet hostujący i powiązany z identyfikatorem widżetu aplikacji.Widok hosta widżetu aplikacji:
AppWidgetHostView
można traktować jako ramkę, w którą widżet jest pakowany za każdym razem, gdy trzeba go wyświetlić. Widżet jest powiązany zAppWidgetHostView
za każdym razem, gdy widżet jest zwiększany przez hosta.- Domyślnie system tworzy klasę
AppWidgetHostView
, ale po jej rozszerzeniu host może utworzyć własną podklasę klasyAppWidgetHostView
. - Począwszy od Androida 12 (poziom interfejsu API 31)
AppWidgetHostView
wprowadza metodysetColorResources()
iresetColorResources()
do obsługi dynamicznie przeciążonych kolorów. Za umieszczenie kolorów tych metod odpowiada gospodarz.
- Domyślnie system tworzy klasę
Pakiet opcji:
AppWidgetHost
używa pakietu opcji, aby przekazywać doAppWidgetProvider
informacje o sposobie wyświetlania widżetu (np. liście zakresów rozmiarów) oraz o tym, czy widżet znajduje się na ekranie blokady czy na ekranie głównym. Dzięki tym informacjomAppWidgetProvider
może dostosowywać 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 zwrotne metodyonAppWidgetOptionsChanged()
w metodzieAppWidgetProvider
.
Wiązanie widżetów
Gdy użytkownik dodaje widżet do hosta, zachodzi proces o nazwie powiązanie. Powiązanie odnosi się do wiązania konkretnego identyfikatora widżetu aplikacji z konkretnym hostem i konkretnym zasobem AppWidgetProvider
.
Interfejsy API powiązań umożliwiają też hostowi udostępnienie niestandardowego interfejsu do tworzenia 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 aplikacji użytkownik musi jawnie przyznać jej uprawnienia, aby mogła ona dodawać widżety do hosta. Aby sprawdzić, czy aplikacja ma uprawnienia do dodawania widżetu, użyj metody bindAppWidgetIdIfAllowed()
. Jeśli bindAppWidgetIdIfAllowed()
zwraca wartość false
, aplikacja musi wyświetlić okno z prośbą o przyznanie uprawnień: „zezwól” w przypadku bieżącego dodania widżetu lub „zawsze zezwalaj” w przypadku wszystkich przyszłych dodatków do widżetu.
Ten fragment kodu pokazuje, jak wyświetlić to okno:
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);
Host musi sprawdzić, czy widżet, który dodaje użytkownik, wymaga konfiguracji. Więcej informacji znajdziesz w artykule Zezwalanie użytkownikom na konfigurowanie widżetów aplikacji.
Obowiązki gospodarza
Możesz określić różne ustawienia konfiguracji widżetów, używając metadanych AppWidgetProviderInfo
.
Te opcje konfiguracji, które zostały szczegółowo omówione w kolejnych sekcjach, możesz pobrać z obiektu AppWidgetProviderInfo
powiązanego z dostawcą widżetu.
Bez względu na wersję Androida, na którą kierujesz reklamy, wszyscy hosty są odpowiedzialni za:
Podczas dodawania widżetu przydziel go w sposób opisany wcześniej. Po usunięciu widżetu z hosta wywołaj
deleteAppWidgetId()
, aby zwolnić identyfikator widżetu.Podczas dodawania widżetu sprawdź, czy trzeba uruchomić działanie konfiguracji. Zwykle host musi uruchomić działanie konfiguracji widżetu, jeśli istnieje i nie jest oznaczone jako opcjonalne przez podanie zarówno flagi
configuration_optional
, jak ireconfigurable
. Więcej informacji znajdziesz w sekcji Aktualizowanie widżetu z poziomu działania konfiguracji. W przypadku wielu widżetów jest to konieczne, aby mogły się wyświetlać.Widżety określają domyślną szerokość i wysokość w metadanych
AppWidgetProviderInfo
. Wartości te są definiowane w komórkach (począwszy od Androida 12, jeśli określonotargetCellWidth
itargetCellHeight
), lub dps, jeśli określono tylkominWidth
iminHeight
. Przeczytaj sekcję Atrybuty rozmiaru widżetów.Upewnij się, że układ widżetu ma co najmniej taką liczbę dps. Na przykład wiele hostów wyrównuje ikony i widżety w siatce. W tym scenariuszu domyślnie host dodaje widżet z użyciem minimalnej liczby komórek spełniających ograniczenia
minWidth
iminHeight
.
Oprócz wymagań wymienionych w poprzedniej sekcji konkretne wersje platformy wprowadzają funkcje, które nakładają nowe obowiązki na gospodarza.
Określ swoje podejście na podstawie docelowej wersji Androida.
Android 12
Android 12 (poziom interfejsu API 31) zawiera dodatkowy element List<SizeF>
zawierający listę możliwych rozmiarów w dps, które instancja widżetu może przyjąć w pakiecie opcji.
Liczba podanych rozmiarów zależy od implementacji hosta. Hosty są zwykle dostępne w 2 rozmiarach dla telefonów – pionowym i poziomym – oraz 4 rozmiarach dla urządzeń składanych.
Obowiązuje limit MAX_INIT_VIEW_COUNT
(16) liczby różnych wartości RemoteViews
, które AppWidgetProvider
może przekazać w RemoteViews
.
Obiekty AppWidgetProvider
mapują obiekt RemoteViews
na każdy rozmiar w List<SizeF>
, dlatego nie podawaj więcej niż MAX_INIT_VIEW_COUNT
rozmiarów.
Android 12 wprowadza również atrybuty maxResizeWidth
i maxResizeHeight
w dps. Zalecamy, aby widżet, który używa co najmniej jednego z tych atrybutów, nie przekraczał rozmiaru określonego przez te atrybuty.
Dodatkowe materiały
- Zobacz dokumentację
Glance
.