Widget: apa itu, widget di iOS WidgetKit dan Android

Penulis: IT Sectr Diterbitkan: 2026-02-15 Waktu membaca: 10 mnt

Widget — elemen antarmuka pengguna ringkas di layar utama iOS atau Android yang menampilkan informasi terkini tanpa membuka aplikasi. Widget muncul di iOS 14 (2020) dengan framework WidgetKit di SwiftUI dan ada di Android sejak versi 1.5 melalui AppWidgetProvider di Kotlin atau Java. Widget memungkinkan pengguna melihat cuaca, nilai tukar, kalender, catatan, atau status tugas langsung di home screen, menghemat waktu dan menyederhanakan interaksi. Menurut data Apple, pengguna berinteraksi dengan widget rata-rata 4–6 kali sehari, dan memasang widget di home screen meningkatkan keterlibatan dengan aplikasi sebesar 20–30%. Untuk Android, angka-angka ini sebanding. Mari kita bahas bagaimana widget bekerja di kedua platform, dengan contoh kode.

Poin utama

  • Widget — aplikasi mini di layar utama untuk melihat informasi dengan cepat tanpa menjalankan aplikasi utama
  • iOS WidgetKit (iOS 14+) dibangun di atas SwiftUI dengan tiga ukuran dan pembaruan melalui TimelineProvider
  • Android AppWidgetProvider sudah ada sejak API level 3 dan menggunakan RemoteViews — kumpulan View terbatas dalam proses terpisah
  • Pembaruan data di iOS — melalui timeline dengan penentuan tanggal, di Android — melalui updateIntervalMillis atau WorkManager
  • Smart Stack di iOS dan tumpukan widget di Android memungkinkan pengelompokan beberapa widget dalam satu slot

Apa itu Widget

Widget — adalah elemen antarmuka pengguna ringkas yang ditempatkan di layar utama perangkat seluler untuk menampilkan informasi terkini dari aplikasi. Tidak seperti aplikasi lengkap, widget tidak perlu diluncurkan — pengguna melihat data segera setelah membuka kunci layar. Konsep ini berasal dari OS desktop (macOS Dashboard, Windows Sidebar), dan di lingkungan seluler, Android memperkenalkan dukungan widget sejak rilis pertamanya (Android 1.5 Cupcake, 2009), sementara Apple baru menambahkannya di iOS 14.

Implementasi teknis berbeda di setiap platform. Widget iOS — target terpisah di Xcode, dikompilasi sebagai Widget Extension, berjalan dalam prosesnya sendiri. Widget Android — BroadcastReceiver yang memperluas AppWidgetProvider, merender tata letak melalui RemoteViews. Kedua platform memberlakukan batasan ketat pada kinerja dan memori: sistem dapat menghapus widget jika melampaui batas. iOS membatasi widget hingga 30–50 MB dan waktu pembuatan timeline hingga 10 detik. Android — interval pembaruan tidak lebih sering dari 30 menit melalui updatePeriodMillis dan penghentian paksa saat onUpdate macet.

Smart Stack di iOS dan tumpukan di Android memungkinkan pengguna mengelompokkan beberapa widget dalam satu slot di home screen. Perangkat secara otomatis mengganti widget yang ditampilkan tergantung pada waktu, lokasi, atau aktivitas pengguna. Misalnya, pagi hari menampilkan kalender, siang hari — cuaca, malam hari — catatan. Bagi pengembang, ini berarti widget harus berfungsi dengan benar dalam tumpukan dan tidak bergantung pada tampilan yang konstan.

iOS WidgetKit: SwiftUI dan TimelineProvider

WidgetKit — framework Apple untuk membuat widget di iOS 14+, iPadOS 14+ dan macOS 11+. Widget ditulis dalam Swift menggunakan SwiftUI dan mekanisme TimelineProvider untuk memperbarui konten. Arsitektur WidgetKit mencakup tiga komponen: TimelineProvider — sumber data yang membentuk garis waktu dengan catatan; Widget Entry View — SwiftUI View yang menampilkan konten berdasarkan catatan; Widget Configuration — deskripsi tipe, ukuran, dan keluarga widget.

WidgetKit mengelola pembaruan sendiri — pengembang tidak dapat memaksa widget untuk diperbarui lebih sering dari yang diizinkan sistem. Apple menggunakan anggaran pembaruan yang didistribusikan ke semua widget di perangkat. Interval minimum — 15–30 menit. Untuk data kritis (misalnya, status pengiriman) digunakan push-to-refresh — mengirim pemberitahuan push dengan tanggal relevan di masa depan, setelah itu WidgetKit meminta timeline baru. Mulai iOS 17, widget mendukung interaktivitas melalui App Intents — pengguna dapat menekan tombol di dalam widget tanpa membuka aplikasi.

UkuraniOS (pt)Konten
Small170 × 1701–2 indikator: suhu, nilai tukar
Medium360 × 1702–4 indikator: prakiraan 5 hari, daftar
Large360 × 3805–10 indikator: kalender, umpan berita

Android AppWidgetProvider: RemoteViews

AppWidgetProvider — kelas dasar untuk membuat widget di Android, bagian dari Android SDK sejak API level 3. Widget Android — adalah BroadcastReceiver yang menerima peristiwa pembaruan, pengaktifan, dan penonaktifan dari sistem. Tidak seperti iOS, di mana widget digambar oleh SwiftUI pada mesinnya sendiri, Android menggunakan RemoteViews — kumpulan komponen View terbatas yang dirender dalam proses sistem (launcher). View kustom, animasi kompleks, atau pustaka UI tidak dapat digunakan.

Skema kerja widget Android mencakup empat tahap. Konfigurasi — saat menambahkan widget ke layar, sistem dapat meluncurkan Activity konfigurasi tempat pengguna memilih pengaturan. Pembaruan — sistem memanggil onUpdate() pada interval yang ditentukan (minimal 30 menit) atau atas sinyal dari aplikasi melalui WorkManager. Rendering — penyedia membuat RemoteViews dengan data terkini dan mengirimkannya melalui AppWidgetManager. Penanganan klik — widget mendukung PendingIntent untuk tombol: saat diklik, Activity terbuka atau tindakan dijalankan. Mulai Android 12, widget mendapatkan dukungan untuk sudut membulat, warna adaptif Material You, dan perubahan ukuran dinamis.

Membuat widget di iOS dengan WidgetKit

Mari buat widget cuaca dalam Swift menggunakan WidgetKit dan SwiftUI. Proyek harus berisi Widget Extension target, ditambahkan di Xcode melalui File → New → Target → Widget Extension.

swift
import WidgetKit
import SwiftUI

// 1. Model data untuk widget
struct WeatherEntry: TimelineEntry {
    let date: Date
    let temperature: Int
    let condition: String
}

// 2. TimelineProvider — penyedia data
struct Provider: TimelineProvider {
    func placeholder(in context: Context) -> WeatherEntry {
        WeatherEntry(date: Date(), temperature: 22, condition: "Cerah")
    }

    func getSnapshot(in context: Context, completion: @escaping (WeatherEntry) -> Void) {
        let entry = WeatherEntry(date: Date(), temperature: 22, condition: "Cerah")
        completion(entry)
    }

    func getTimeline(in context: Context, completion: @escaping (Timeline<WeatherEntry>) -> Void) {
        let now = Date()
        let entry = WeatherEntry(date: now, temperature: 20, condition: "Berawan")
        let nextUpdate = Calendar.current.date(byAdding: .hour, value: 3, to: now)!
        let timeline = Timeline(entries: [entry], policy: .after(nextUpdate))
        completion(timeline)
    }
}

// 3. SwiftUI View untuk ditampilkan
struct WeatherWidgetEntryView: View {
    var entry: WeatherEntry

    var body: some View {
        VStack(alignment: .leading) {
            Text("Cuaca").font(.caption).foregroundColor(.secondary)
            HStack {
                Text("\(entry.temperature)°").font(.largeTitle).fontWeight(.bold)
                Spacer()
                Text(entry.condition).font(.body)
            }
        }.padding()
    }
}

// 4. Konfigurasi widget
@main
struct WeatherWidget: Widget {
    var body: some WidgetConfiguration {
        StaticConfiguration(kind: "WeatherWidget", provider: Provider()) { entry in
            WeatherWidgetEntryView(entry: entry)
        }
        .configurationDisplayName("Cuaca")
        .description("Menunjukkan suhu saat ini")
        .supportedFamilies([.systemSmall, .systemMedium])
    }
}

Poin penting: TimelineProvider menentukan kapan dan data apa yang ditampilkan; getTimeline membuat garis waktu dengan kebijakan pembaruan .after(nextUpdate); StaticConfiguration menghubungkan penyedia dengan View. Untuk data dinamis, IntentConfiguration dengan parameter pengguna digunakan.

Membuat widget di Android dengan AppWidgetProvider

Kami mengimplementasikan widget cuaca serupa di Kotlin dengan AppWidgetProvider dan RemoteViews.

kotlin
// 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 = "Berawan"
            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 — pendaftaran penyedia
<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>

File widget_weather_info.xml mengatur ukuran minimum, interval, dan tata letak: minWidth 160dp, minHeight 80dp, updatePeriodMillis 3600000 (1 jam). RemoteViews hanya menggunakan komponen yang didukung: LinearLayout, TextView, ImageView. View kustom dan ConstraintLayout tersedia sejak Android 5.0. GlanceLayout — pendekatan Compose eksperimental untuk RemoteViews — muncul di Android 15.

Pertanyaan yang sering diajukan

Apa perbedaan antara Widget di iOS dan Android?

iOS WidgetKit menawarkan tiga ukuran tetap (small, medium, large) dan pembaruan melalui TimelineProvider dengan anggaran sistem. Android AppWidgetProvider menggunakan ukuran fleksibel dalam sel, RemoteViews untuk rendering, dan pembaruan melalui updatePeriodMillis atau WorkManager.

Seberapa sering Widget diperbarui?

Di iOS, pembaruan dikendalikan sistem — interval minimum 15–30 menit, untuk data kritis digunakan push-to-refresh. Di Android, interval diatur dalam updatePeriodMillis (minimal 30 menit) atau melalui WorkManager untuk tugas latar belakang.

Ukuran apa yang didukung Widget?

iOS mendukung small (170x170pt), medium (360x170pt), dan large (360x380pt). Android menggunakan kisi sel fleksibel: dari 2x1 hingga 5x5, ukuran tergantung pada launcher dan versi OS.

Bisakah animasi ditambahkan ke Widget?

Di iOS, tidak ada animasi di dalam widget — ini adalah elemen statis. Android RemoteViews mendukung animasi dasar melalui setFloat() dan ViewPropertyAnimator, tetapi animasi kompleks tidak tersedia.

Apakah Widget mengurangi kinerja perangkat?

Dengan implementasi yang benar — tidak. Sistem membatasi sumber daya widget secara ketat: di iOS anggaran pembaruan dan memori (30–50 MB), di Android — interval pembaruan minimum. Widget bermasalah akan dihentikan paksa oleh sistem.

Kesimpulan

  • Widget — elemen ringkas home screen untuk akses cepat ke data aplikasi tanpa membukanya
  • iOS WidgetKit mendukung tiga ukuran tetap dan pembaruan melalui TimelineProvider dengan SwiftUI
  • Android AppWidgetProvider bekerja melalui BroadcastReceiver dan RemoteViews dengan ukuran sel fleksibel
  • Pembaruan data di kedua platform dibatasi oleh sistem: iOS — anggaran pembaruan, Android — minimal 30 menit
  • Interaktivitas muncul di iOS 17 (App Intents) dan Android 12 (warna dinamis, tombol)
  • Smart Stack di iOS dan tumpukan di Android memungkinkan pengelompokan beberapa widget dengan peralihan otomatis
  • Kinerja sangat penting — sistem menghentikan paksa widget bermasalah saat melampaui batas

Kami akan mengembangkan aplikasi seluler turnkey

IT Sectr membuat aplikasi iOS dan Android untuk startup dan bisnis sejak 2017. Kami akan memberi saran dan mengusulkan solusi terbaik.

Diskusikan proyek

Baca juga