Widget — egy kompakt felhasználói felület elem az iOS vagy Android kezdőképernyőjén, amely aktuális információkat jelenít meg az alkalmazás megnyitása nélkül. A widgetek az iOS 14-ben (2020) jelentek meg a WidgetKit keretrendszerrel SwiftUI-ben, és Androidon az 1.5-ös verzió óta léteznek az AppWidgetProvider segítségével Kotlin vagy Java nyelven. Lehetővé teszik a felhasználó számára, hogy az időjárást, árfolyamokat, naptárat, jegyzeteket vagy feladatállapotokat közvetlenül a home screen-en lássa, időt takarítva meg és egyszerűsítve az interakciót. Az Apple adatai szerint a felhasználók átlagosan napi 4–6 alkalommal interakcióba lépnek a widgetekkel, és egy widget elhelyezése a home screen-en 20–30%-kal növeli az alkalmazás iránti elköteleződést. Androidon ezek a mutatók összehasonlíthatók. Vizsgáljuk meg, hogyan működnek a widgetek mindkét platformon, kódpéldákkal.
Főbb pontok
Widget — egy kompakt felhasználói felület elem, amely a mobileszköz kezdőképernyőjére kerül az alkalmazás aktuális információinak megjelenítésére. Ellentétben egy teljes alkalmazással, a widget nem igényel indítást — a felhasználó közvetlenül a képernyő feloldása után látja az adatokat. A koncepció asztali operációs rendszerekből (macOS Dashboard, Windows Sidebar) származik, a mobil környezetben pedig az Android az első kiadásától (Android 1.5 Cupcake, 2009) támogatja a widgeteket, míg az Apple csak az iOS 14-ben adta hozzá őket.
Technikai megvalósítás platformonként eltér. iOS widget — külön target az Xcode-ban, Widget Extensionként lefordítva, saját folyamatban fut. Android widget — BroadcastReceiver, amely kiterjeszti az AppWidgetProvider-t, a layout-ot RemoteViews segítségével rendereli. Mindkét platform szigorú korlátozásokat ír elő a teljesítményre és memóriára: a rendszer eltávolíthatja a widgetet a határértékek túllépése esetén. Az iOS 30–50 MB-ra és a timeline kialakítási idejét 10 másodpercre korlátozza a widgetet. Android — frissítési intervallum legfeljebb 30 percenként az updatePeriodMillis segítségével, és kényszerített leállítás az onUpdate lefagyása esetén.
Smart Stack iOS-en és halmok Androidon lehetővé teszik a felhasználó számára, hogy több widgetet egy slotba csoportosítson a home screen-en. A készülék automatikusan vált a megjelenített widget között a napszaktól, helytől vagy a felhasználó tevékenységétől függően. Például reggel a naptár, délben az időjárás, este a jegyzetek jelennek meg. A fejlesztő számára ez azt jelenti, hogy a widgetnek megfelelően kell működnie egy halmon belül, és nem támaszkodhat az állandó megjelenítésre.
WidgetKit — az Apple keretrendszere widgetek létrehozásához iOS 14+, iPadOS 14+ és macOS 11+ rendszereken. A widgetek Swift nyelven íródnak a SwiftUI és a TimelineProvider mechanizmus használatával a tartalom frissítéséhez. A WidgetKit architektúra három összetevőből áll: TimelineProvider — adatforrás, amely idővonalat képez rekordokkal; Widget Entry View — SwiftUI View, amely a rekord alapján jeleníti meg a tartalmat; Widget Configuration — a widget típusának, méreteinek és családjainak leírása.
A WidgetKit maga kezeli a frissítést — a fejlesztő nem kényszerítheti ki a widget gyakoribb frissítését, mint amit a rendszer engedélyez. Az Apple frissítési költségvetést használ, amely eloszlik az eszköz összes widgetje között. Minimális időköz — 15–30 perc. Kritikus adatokhoz (pl. szállítási állapot) push-to-refresh használatos — egy push értesítés küldése releváns jövőbeli dátummal, amely után a WidgetKit új idővonalat kér. Az iOS 17-től kezdve a widgetek interaktivitást támogatnak az App Intenseken keresztül — a felhasználó megnyomhatja a widgeten belüli gombokat anélkül, hogy megnyitná az alkalmazást.
| Méret | iOS (pt) | Tartalom |
|---|---|---|
| Small | 170 × 170 | 1–2 mutató: hőmérséklet, árfolyam |
| Medium | 360 × 170 | 2–4 mutató: 5 napos előrejelzés, lista |
| Large | 360 × 380 | 5–10 mutató: naptár, hírfolyam |
AppWidgetProvider — a widgetek létrehozásának alaposztálya Androidon, az Android SDK része az API level 3 óta. Android widget — egy BroadcastReceiver, amely frissítési, aktiválási és deaktiválási eseményeket kap a rendszertől. Ellentétben az iOS-szel, ahol a widgetet a SwiftUI rajzolja a saját motorján, az Android RemoteViews-t — egy korlátozott View komponenskészletet használ, amely a rendszerfolyamatban (launcher) renderelődik. Egyéni View-k, összetett animációk vagy UI könyvtárak nem használhatók.
Az Android widget működési sémája négy szakaszból áll. Konfiguráció — a widget képernyőhöz adásakor a rendszer elindíthat egy konfigurációs Activity-t, ahol a felhasználó kiválasztja a beállításokat. Frissítés — a rendszer meghívja az onUpdate()-ot egy meghatározott időközönként (minimum 30 perc) vagy az alkalmazás jelzésére a WorkManageren keresztül. Renderelés — a szolgáltató RemoteViews-t hoz létre aktuális adatokkal, és továbbítja az AppWidgetManageren keresztül. Kattintások kezelése — a widget támogatja a PendingIntent-et a gombokhoz: kattintásra egy Activity nyílik meg, vagy művelet hajtódik végre. Az Android 12-től kezdve a widgetek támogatást kaptak a lekerekített sarkokhoz, az adaptív Material You színekhez és a dinamikus méretváltoztatáshoz.
Hozzunk létre egy időjárás widgetet Swift nyelven a WidgetKit és SwiftUI használatával. A projektnek tartalmaznia kell egy Widget Extension target-et, amely az Xcode-ban a File → New → Target → Widget Extension segítségével adható hozzá.
import WidgetKit
import SwiftUI
// 1. Adatmodell a widgethez
struct WeatherEntry: TimelineEntry {
let date: Date
let temperature: Int
let condition: String
}
// 2. TimelineProvider — adatszolgáltató
struct Provider: TimelineProvider {
func placeholder(in context: Context) -> WeatherEntry {
WeatherEntry(date: Date(), temperature: 22, condition: "Napos")
}
func getSnapshot(in context: Context, completion: @escaping (WeatherEntry) -> Void) {
let entry = WeatherEntry(date: Date(), temperature: 22, condition: "Napos")
completion(entry)
}
func getTimeline(in context: Context, completion: @escaping (Timeline<WeatherEntry>) -> Void) {
let now = Date()
let entry = WeatherEntry(date: now, temperature: 20, condition: "Felhős")
let nextUpdate = Calendar.current.date(byAdding: .hour, value: 3, to: now)!
let timeline = Timeline(entries: [entry], policy: .after(nextUpdate))
completion(timeline)
}
}
// 3. SwiftUI View a megjelenítéshez
struct WeatherWidgetEntryView: View {
var entry: WeatherEntry
var body: some View {
VStack(alignment: .leading) {
Text("Időjárás").font(.caption).foregroundColor(.secondary)
HStack {
Text("\(entry.temperature)°").font(.largeTitle).fontWeight(.bold)
Spacer()
Text(entry.condition).font(.body)
}
}.padding()
}
}
// 4. Widget konfiguráció
@main
struct WeatherWidget: Widget {
var body: some WidgetConfiguration {
StaticConfiguration(kind: "WeatherWidget", provider: Provider()) { entry in
WeatherWidgetEntryView(entry: entry)
}
.configurationDisplayName("Időjárás")
.description("Aktuális hőmérsékletet mutat")
.supportedFamilies([.systemSmall, .systemMedium])
}
}
Kulcsfontosságú pontok: TimelineProvider meghatározza, hogy mikor és milyen adatokat jelenítsen meg; getTimeline idővonalat hoz létre .after(nextUpdate) frissítési irányelvvel; StaticConfiguration összeköti a szolgáltatót a View-val. Dinamikus adatokhoz az IntentConfiguration használatos felhasználói paraméterekkel.
Valósítsunk meg egy hasonló időjárás widgetet Kotlin nyelven az AppWidgetProvider és RemoteViews segítségével.
// WeatherWidgetProvider.kt
class WeatherWidgetProvider : AppWidgetProvider() {
override fun onUpdate(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetIds: IntArray
) {
for (appWidgetId in appWidgetIds) {
updateAppWidget(context, appWidgetManager, appWidgetId)
}
}
override fun onAppWidgetOptionsChanged(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetId: Int,
newOptions: Bundle
) {
updateAppWidget(context, appWidgetManager, appWidgetId)
}
companion object {
fun updateAppWidget(
context: Context,
appWidgetManager: AppWidgetManager,
appWidgetId: Int
) {
val temperature = 20
val condition = "Felhős"
val views = RemoteViews(
context.packageName, R.layout.widget_weather
).apply {
setTextViewText(R.id.tv_temperature, "$temperature°")
setTextViewText(R.id.tv_condition, condition)
setOnClickPendingIntent(
R.id.widget_root, PendingIntent.getActivity(
context, 0,
Intent(context, MainActivity::class.java),
PendingIntent.FLAG_UPDATE_CURRENT or PendingIntent.FLAG_IMMUTABLE
)
)
}
appWidgetManager.updateAppWidget(appWidgetId, views)
}
}
}
// AndroidManifest — szolgáltató regisztrációja
<receiver android:name=".WeatherWidgetProvider" android:exported="true">
<intent-filter>
<action android:name="android.appwidget.action.APPWIDGET_UPDATE" />
</intent-filter>
<meta-data
android:name="android.appwidget.provider"
android:resource="@xml/widget_weather_info" />
</receiver>
A widget_weather_info.xml fájl beállítja a minimális méreteket, időközt és layout-ot: minWidth 160dp, minHeight 80dp, updatePeriodMillis 3600000 (1 óra). A RemoteViews csak támogatott összetevőket használ: LinearLayout, TextView, ImageView. Az egyéni View és a ConstraintLayout Android 5.0 óta érhető el. A GlanceLayout — kísérleti Compose megközelítés a RemoteViews számára — az Android 15-ben jelent meg.
Gyakran ismételt kérdések
Az iOS WidgetKit három rögzített méretet (small, medium, large) és frissítést kínál a TimelineProvideren keresztül rendszerköltségvetéssel. Android AppWidgetProvider flexibilis cellaméreteket, RemoteViews-t a rendereléshez és frissítést az updatePeriodMillis vagy WorkManager segítségével használ.
iOS-en a frissítést a rendszer vezérli — minimális időköz 15–30 perc, kritikus adatokhoz push-to-refresh használatos. Androidon az időköz az updatePeriodMillis-ben van beállítva (minimum 30 perc) vagy a WorkManageren keresztül háttérfeladatokhoz.
Az iOS a small (170x170pt), medium (360x170pt) és large (360x380pt) méreteket támogatja. Az Android flexibilis cellarácsot használ: 2x1-től 5x5-ig, a méret a launcher-től és az OS verziójától függ.
iOS-en nincsenek animációk a widgeten belül — ezek statikus elemek. Android RemoteViews alapvető animációkat támogat a setFloat() és ViewPropertyAnimator segítségével, de összetett animációk nem érhetők el.
Helyes megvalósítás esetén — nem. A rendszer szigorúan korlátozza a widget erőforrásait: iOS-en frissítési és memória költségvetés (30–50 MB), Androidon — minimális frissítési időköz. A problémás widgeteket a rendszer kényszerítve leállítja.
Összefoglalás
Kulcsrakész mobilalkalmazást fejlesztünk
Az IT Sectr 2017 óta készít iOS és Android alkalmazásokat induló vállalkozásoknak és vállalkozásoknak. Tanácsot adunk, és a legjobb megoldást javasoljuk.
Olvassa el is