Widget: এটি কী, iOS WidgetKit এবং Android-এ উইজেট

লেখক: IT Sectr প্রকাশিত: 2026-02-15 পড়ার সময়: 10 মিনিট

Widget হল iOS বা Android হোম স্ক্রিনে একটি কম্প্যাক্ট ইউজার ইন্টারফেস উপাদান যা অ্যাপ না খুলেই প্রাসঙ্গিক তথ্য প্রদর্শন করে। উইজেটগুলি iOS 14 (2020) এ SwiftUI-তে WidgetKit ফ্রেমওয়ার্কের সাথে আবির্ভূত হয় এবং Android-এ সংস্করণ 1.5 থেকে Kotlin বা Java-তে AppWidgetProvider-এর মাধ্যমে বিদ্যমান। এগুলি ব্যবহারকারীকে সরাসরি হোম স্ক্রিনে আবহাওয়া, মুদ্রা বিনিময় হার, ক্যালেন্ডার, নোট বা কাজের অবস্থা দেখতে দেয়, সময় বাঁচায় এবং মিথস্ক্রিয়াকে সহজ করে। Apple-এর মতে, ব্যবহারকারীরা গড়ে দিনে 4–6 বার উইজেটের সাথে ইন্টারঅ্যাক্ট করে এবং হোম স্ক্রিনে একটি উইজেট রাখা অ্যাপের ব্যস্ততা 20–30% বাড়িয়ে দেয়। Android-এর জন্য এই পরিসংখ্যান তুলনাযোগ্য। কোড উদাহরণ সহ উভয় প্ল্যাটফর্মে উইজেটগুলি কীভাবে কাজ করে তা দেখি।

মূল পয়েন্ট

  • Widget — মূল অ্যাপ চালু না করেই দ্রুত তথ্য দেখার জন্য হোম স্ক্রিনে একটি মিনি-অ্যাপ্লিকেশন
  • iOS WidgetKit (iOS 14+) SwiftUI-তে তিনটি আকার এবং TimelineProvider-এর মাধ্যমে আপডেট সহ নির্মিত
  • Android AppWidgetProvider API level 3 থেকে বিদ্যমান এবং RemoteViews ব্যবহার করে — একটি পৃথক প্রক্রিয়ায় Views-এর সীমিত সেট
  • ডেটা আপডেট iOS-এ — তারিখ সহ timeline-এর মাধ্যমে, Android-এ — updateIntervalMillis বা WorkManager-এর মাধ্যমে
  • Smart Stack iOS-এ এবং Android-এ উইজেট স্ট্যাক একাধিক উইজেটকে একটি স্লটে গ্রুপ করার অনুমতি দেয়

Widget কী

Widget হল একটি কম্প্যাক্ট ইউজার ইন্টারফেস উপাদান যা একটি মোবাইল ডিভাইসের হোম স্ক্রিনে রাখা হয় কোনো অ্যাপ থেকে প্রাসঙ্গিক তথ্য প্রদর্শনের জন্য। পূর্ণ অ্যাপ্লিকেশনের বিপরীতে, একটি উইজেট চালু করার প্রয়োজন হয় না — ব্যবহারকারী স্ক্রিন আনলক করার সাথে সাথেই ডেটা দেখে। ধারণাটি ডেস্কটপ OS (macOS Dashboard, Windows Sidebar) থেকে এসেছে এবং মোবাইল পরিবেশে, Android তার প্রথম রিলিজ (Android 1.5 Cupcake, 2009) থেকেই উইজেট সমর্থন চালু করে, যেখানে Apple শুধুমাত্র iOS 14-এ এগুলি যোগ করে।

প্রযুক্তিগত বাস্তবায়ন প্ল্যাটফর্ম অনুসারে ভিন্ন। iOS উইজেট হল Xcode-এ একটি পৃথক target, যা Widget Extension হিসাবে কম্পাইল হয় এবং নিজস্ব প্রক্রিয়ায় চলে। Android উইজেট হল একটি BroadcastReceiver যা AppWidgetProvider-কে প্রসারিত করে এবং RemoteViews-এর মাধ্যমে লেআউট রেন্ডার করে। উভয় প্ল্যাটফর্মই কঠোর কর্মক্ষমতা এবং মেমরি সীমাবদ্ধতা আরোপ করে: সীমা অতিক্রম করলে সিস্টেম উইজেটটি সরিয়ে ফেলতে পারে। iOS উইজেটকে 30–50 MB এবং টাইমলাইন তৈরির সময় 10 সেকেন্ডে সীমাবদ্ধ করে। Android — updatePeriodMillis-এর মাধ্যমে 30 মিনিটের বেশি না হওয়া ব্যবধান এবং onUpdate হ্যাং হলে জোরপূর্বক সমাপ্তি।

Smart Stack iOS-এ এবং Android-এ স্ট্যাক ব্যবহারকারীকে হোম স্ক্রিন স্লটে একাধিক উইজেট গ্রুপ করতে দেয়। ডিভাইসটি দিনের সময়, অবস্থান বা ব্যবহারকারীর কার্যকলাপের উপর ভিত্তি করে প্রদর্শিত উইজেটটি স্বয়ংক্রিয়ভাবে পরিবর্তন করে। উদাহরণস্বরূপ, সকালে ক্যালেন্ডার দেখানো হয়, দিনের বেলা — আবহাওয়া, সন্ধ্যায় — নোট। ডেভেলপারদের জন্য, এর অর্থ হল উইজেটটিকে স্ট্যাকের অংশ হিসাবে সঠিকভাবে কাজ করতে হবে এবং ধারাবাহিক প্রদর্শনের উপর নির্ভর করতে হবে না।

iOS WidgetKit: SwiftUI এবং TimelineProvider

WidgetKit হল iOS 14+, iPadOS 14+ এবং macOS 11+-এ উইজেট তৈরির জন্য Apple-এর ফ্রেমওয়ার্ক। উইজেটগুলি SwiftUI এবং বিষয়বস্তু আপডেটের জন্য TimelineProvider মেকানিজম ব্যবহার করে Swift-এ লেখা হয়। WidgetKit আর্কিটেকচারে তিনটি উপাদান রয়েছে: TimelineProvider — একটি ডেটা উৎস যা এন্ট্রি সহ একটি টাইমলাইন গঠন করে; Widget Entry View — একটি SwiftUI View যা একটি এন্ট্রির উপর ভিত্তি করে বিষয়বস্তু প্রদর্শন করে; Widget Configuration — উইজেটের ধরন, আকার এবং পরিবারের বিবরণ।

WidgetKit স্বয়ংক্রিয়ভাবে আপডেট পরিচালনা করে — ডেভেলপার সিস্টেমের অনুমতির চেয়ে বেশি বার উইজেট আপডেট করতে বাধ্য করতে পারে না। Apple ডিভাইসের সমস্ত উইজেটের মধ্যে বিতরণ করা একটি আপডেট বাজেট ব্যবহার করে। ন্যূনতম ব্যবধান 15–30 মিনিট। গুরুত্বপূর্ণ ডেটার (যেমন ডেলিভারি অবস্থা) জন্য, push-to-refresh ব্যবহার করা হয় — একটি প্রাসঙ্গিক ভবিষ্যত তারিখ সহ একটি push বিজ্ঞপ্তি পাঠানো, যার পরে WidgetKit একটি নতুন টাইমলাইন অনুরোধ করে। iOS 17 থেকে, উইজেটগুলি App Intents-এর মাধ্যমে ইন্টারঅ্যাকটিভিটি সমর্থন করে — ব্যবহারকারীরা অ্যাপ না খুলেই উইজেটের ভিতরে বাটন চাপতে পারেন।

আকারiOS (pt)বিষয়বস্তু
Small170 × 1701–2 মেট্রিক: তাপমাত্রা, মুদ্রা বিনিময় হার
Medium360 × 1702–4 মেট্রিক: 5-দিনের পূর্বাভাস, তালিকা
Large360 × 3805–10 মেট্রিক: ক্যালেন্ডার, খবরের ফিড

Android AppWidgetProvider: RemoteViews

AppWidgetProvider হল Android-এ উইজেট তৈরির জন্য বেস ক্লাস, যা API level 3 থেকে Android SDK-এর অংশ। Android উইজেট হল একটি BroadcastReceiver যা সিস্টেম থেকে আপডেট, সক্ষম এবং নিষ্ক্রিয় ইভেন্ট গ্রহণ করে। iOS-এর বিপরীতে, যেখানে উইজেট তার নিজস্ব ইঞ্জিনে SwiftUI দিয়ে রেন্ডার করা হয়, Android RemoteViews ব্যবহার করে — সিস্টেম প্রক্রিয়ায় (launcher) রেন্ডার করা View উপাদানের সীমিত সেট। কাস্টম Views, জটিল অ্যানিমেশন বা UI লাইব্রেরি ব্যবহার করা যায় না।

Android উইজেটের কাজের পদ্ধতি চারটি ধাপে বিভক্ত। কনফিগারেশন — স্ক্রিনে উইজেট যোগ করার সময়, সিস্টেম একটি কনফিগারেশন Activity চালু করতে পারে যেখানে ব্যবহারকারী সেটিংস নির্বাচন করে। আপডেট — সিস্টেম নির্দিষ্ট ব্যবধানে (ন্যূনতম 30 মিনিট) বা WorkManager-এর মাধ্যমে অ্যাপ থেকে সংকেত পেলে onUpdate() কল করে। রেন্ডারিং — প্রদানকারী বর্তমান ডেটা সহ RemoteViews তৈরি করে এবং AppWidgetManager-এর মাধ্যমে পাঠায়। টাচ হ্যান্ডলিং — উইজেট বাটনের জন্য PendingIntent সমর্থন করে: ক্লিক করলে একটি Activity খোলে বা একটি কাজ সম্পাদিত হয়। Android 12 থেকে, উইজেটগুলি গোলাকার কোণ, অভিযোজিত Material You রঙ এবং গতিশীল আকার পরিবর্তনের সমর্থন পেয়েছে।

iOS-এ WidgetKit দিয়ে উইজেট তৈরি করা

WidgetKit এবং SwiftUI ব্যবহার করে Swift-এ একটি আবহাওয়া উইজেট তৈরি করি। প্রকল্পে একটি Widget Extension target অন্তর্ভুক্ত থাকতে হবে, যা Xcode-এ File → New → Target → Widget Extension-এর মাধ্যমে যোগ করা হয়।

swift
import WidgetKit
import SwiftUI

// 1. উইজেটের জন্য ডেটা মডেল
struct WeatherEntry: TimelineEntry {
    let date: Date
    let temperature: Int
    let condition: String
}

// 2. TimelineProvider — ডেটা প্রদানকারী
struct Provider: TimelineProvider {
    func placeholder(in context: Context) -> WeatherEntry {
        WeatherEntry(date: Date(), temperature: 22, condition: "রোদেলা")
    }

    func getSnapshot(in context: Context, completion: @escaping (WeatherEntry) -> Void) {
        let entry = WeatherEntry(date: Date(), temperature: 22, condition: "রোদেলা")
        completion(entry)
    }

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

// 3. প্রদর্শনের জন্য SwiftUI View
struct WeatherWidgetEntryView: View {
    var entry: WeatherEntry

    var body: some View {
        VStack(alignment: .leading) {
            Text("আবহাওয়া").font(.caption).foregroundColor(.secondary)
            HStack {
                Text("\(entry.temperature)°").font(.largeTitle).fontWeight(.bold)
                Spacer()
                Text(entry.condition).font(.body)
            }
        }.padding()
    }
}

// 4. উইজেট কনফিগারেশন
@main
struct WeatherWidget: Widget {
    var body: some WidgetConfiguration {
        StaticConfiguration(kind: "WeatherWidget", provider: Provider()) { entry in
            WeatherWidgetEntryView(entry: entry)
        }
        .configurationDisplayName("আবহাওয়া")
        .description("বর্তমান তাপমাত্রা দেখায়")
        .supportedFamilies([.systemSmall, .systemMedium])
    }
}

মূল পয়েন্ট: TimelineProvider নির্ধারণ করে কখন এবং কী ডেটা দেখাতে হবে; getTimeline .after(nextUpdate) আপডেট নীতি সহ একটি টাইমলাইন তৈরি করে; StaticConfiguration প্রদানকারীকে View-এর সাথে সংযুক্ত করে। গতিশীল ডেটার জন্য, কাস্টম প্যারামিটার সহ IntentConfiguration ব্যবহার করা হয়।

Android-এ AppWidgetProvider দিয়ে উইজেট তৈরি করা

AppWidgetProvider এবং RemoteViews-এর সাথে Kotlin-এ একই রকম আবহাওয়া উইজেট বাস্তবায়ন করি।

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 = "মেঘলা"
            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 — প্রদানকারী নিবন্ধন
<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>

widget_weather_info.xml ফাইল ন্যূনতম আকার, ব্যবধান এবং লেআউট সেট করে: minWidth 160dp, minHeight 80dp, updatePeriodMillis 3600000 (1 ঘন্টা)। RemoteViews শুধুমাত্র সমর্থিত উপাদান ব্যবহার করে: LinearLayout, TextView, ImageView। কাস্টম Views এবং ConstraintLayout Android 5.0 থেকে উপলব্ধ। GlanceLayout — RemoteViews-এর জন্য একটি পরীক্ষামূলক Compose-ভিত্তিক পদ্ধতি — Android 15-এ আবির্ভূত হয়েছে।

সচরাচর জিজ্ঞাসিত প্রশ্ন

iOS এবং Android-এ Widget-এর মধ্যে পার্থক্য কী?

iOS WidgetKit তিনটি নির্দিষ্ট আকার (small, medium, large) এবং সিস্টেম বাজেট সহ TimelineProvider-এর মাধ্যমে আপডেট অফার করে। Android AppWidgetProvider নমনীয় সেল-ভিত্তিক আকার, রেন্ডারিংয়ের জন্য RemoteViews এবং updatePeriodMillis বা WorkManager-এর মাধ্যমে আপডেট ব্যবহার করে।

Widget কতবার আপডেট হয়?

iOS-এ, সিস্টেম আপডেট নিয়ন্ত্রণ করে — ন্যূনতম ব্যবধান 15–30 মিনিট, গুরুত্বপূর্ণ ডেটার জন্য push-to-refresh ব্যবহার করা হয়। Android-এ, ব্যবধান updatePeriodMillis-এ (ন্যূনতম 30 মিনিট) বা পটভূমির কাজের জন্য WorkManager-এর মাধ্যমে সেট করা হয়।

Widget কী কী আকার সমর্থন করে?

iOS small (170x170pt), medium (360x170pt) এবং large (360x380pt) সমর্থন করে। Android একটি নমনীয় সেল গ্রিড ব্যবহার করে: 2x1 থেকে 5x5 পর্যন্ত, আকার লঞ্চার এবং OS সংস্করণের উপর নির্ভর করে।

Widget-এ অ্যানিমেশন যোগ করা যায়?

iOS-এ, উইজেটের ভিতরে অ্যানিমেশন উপলব্ধ নয় — এগুলি স্থির উপাদান। Android RemoteViews setFloat() এবং ViewPropertyAnimator-এর মাধ্যমে মৌলিক অ্যানিমেশন সমর্থন করে, কিন্তু জটিল অ্যানিমেশন উপলব্ধ নয়।

Widget কি ডিভাইসের কর্মক্ষমতা হ্রাস করে?

সঠিক বাস্তবায়নের সাথে — না। সিস্টেম উইজেট সংস্থান কঠোরভাবে সীমাবদ্ধ করে: iOS-এ — আপডেট এবং মেমরি বাজেট (30–50 MB), Android-এ — ন্যূনতম আপডেট ব্যবধান। সমস্যাযুক্ত উইজেটগুলি সিস্টেম দ্বারা জোরপূর্বক বন্ধ করা হয়।

সারসংক্ষেপ

  • Widget — অ্যাপ না খুলেই দ্রুত ডেটা অ্যাক্সেসের জন্য হোম স্ক্রিনের কম্প্যাক্ট উপাদান
  • iOS WidgetKit তিনটি নির্দিষ্ট আকার এবং SwiftUI সহ TimelineProvider-এর মাধ্যমে আপডেট সমর্থন করে
  • Android AppWidgetProvider BroadcastReceiver এবং RemoteViews-এর মাধ্যমে নমনীয় সেল আকার নিয়ে কাজ করে
  • ডেটা আপডেট উভয় প্ল্যাটফর্মে সিস্টেম-সীমিত: iOS — আপডেট বাজেট, Android — ন্যূনতম 30 মিনিট
  • ইন্টারঅ্যাকটিভিটি iOS 17 (App Intents) এবং Android 12 (গতিশীল রঙ, বাটন) এ আবির্ভূত হয়েছে
  • Smart Stack iOS-এ এবং Android-এ স্ট্যাক অটো-সুইচিং সহ একাধিক উইজেট গ্রুপ করার অনুমতি দেয়
  • কর্মক্ষমতা গুরুত্বপূর্ণ — সীমা অতিক্রম করলে সিস্টেম সমস্যাযুক্ত উইজেট জোরপূর্বক বন্ধ করে

আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব

IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।

প্রকল্প নিয়ে আলোচনা করুন

আরও পড়ুন