Widget হল iOS বা Android হোম স্ক্রিনে একটি কম্প্যাক্ট ইউজার ইন্টারফেস উপাদান যা অ্যাপ না খুলেই প্রাসঙ্গিক তথ্য প্রদর্শন করে। উইজেটগুলি iOS 14 (2020) এ SwiftUI-তে WidgetKit ফ্রেমওয়ার্কের সাথে আবির্ভূত হয় এবং Android-এ সংস্করণ 1.5 থেকে Kotlin বা Java-তে AppWidgetProvider-এর মাধ্যমে বিদ্যমান। এগুলি ব্যবহারকারীকে সরাসরি হোম স্ক্রিনে আবহাওয়া, মুদ্রা বিনিময় হার, ক্যালেন্ডার, নোট বা কাজের অবস্থা দেখতে দেয়, সময় বাঁচায় এবং মিথস্ক্রিয়াকে সহজ করে। Apple-এর মতে, ব্যবহারকারীরা গড়ে দিনে 4–6 বার উইজেটের সাথে ইন্টারঅ্যাক্ট করে এবং হোম স্ক্রিনে একটি উইজেট রাখা অ্যাপের ব্যস্ততা 20–30% বাড়িয়ে দেয়। Android-এর জন্য এই পরিসংখ্যান তুলনাযোগ্য। কোড উদাহরণ সহ উভয় প্ল্যাটফর্মে উইজেটগুলি কীভাবে কাজ করে তা দেখি।
মূল পয়েন্ট
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-এ স্ট্যাক ব্যবহারকারীকে হোম স্ক্রিন স্লটে একাধিক উইজেট গ্রুপ করতে দেয়। ডিভাইসটি দিনের সময়, অবস্থান বা ব্যবহারকারীর কার্যকলাপের উপর ভিত্তি করে প্রদর্শিত উইজেটটি স্বয়ংক্রিয়ভাবে পরিবর্তন করে। উদাহরণস্বরূপ, সকালে ক্যালেন্ডার দেখানো হয়, দিনের বেলা — আবহাওয়া, সন্ধ্যায় — নোট। ডেভেলপারদের জন্য, এর অর্থ হল উইজেটটিকে স্ট্যাকের অংশ হিসাবে সঠিকভাবে কাজ করতে হবে এবং ধারাবাহিক প্রদর্শনের উপর নির্ভর করতে হবে না।
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) | বিষয়বস্তু |
|---|---|---|
| Small | 170 × 170 | 1–2 মেট্রিক: তাপমাত্রা, মুদ্রা বিনিময় হার |
| Medium | 360 × 170 | 2–4 মেট্রিক: 5-দিনের পূর্বাভাস, তালিকা |
| Large | 360 × 380 | 5–10 মেট্রিক: ক্যালেন্ডার, খবরের ফিড |
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 রঙ এবং গতিশীল আকার পরিবর্তনের সমর্থন পেয়েছে।
WidgetKit এবং SwiftUI ব্যবহার করে Swift-এ একটি আবহাওয়া উইজেট তৈরি করি। প্রকল্পে একটি Widget Extension target অন্তর্ভুক্ত থাকতে হবে, যা Xcode-এ File → New → Target → Widget Extension-এর মাধ্যমে যোগ করা হয়।
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 ব্যবহার করা হয়।
AppWidgetProvider এবং 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 = "মেঘলা"
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 WidgetKit তিনটি নির্দিষ্ট আকার (small, medium, large) এবং সিস্টেম বাজেট সহ TimelineProvider-এর মাধ্যমে আপডেট অফার করে। Android AppWidgetProvider নমনীয় সেল-ভিত্তিক আকার, রেন্ডারিংয়ের জন্য RemoteViews এবং updatePeriodMillis বা WorkManager-এর মাধ্যমে আপডেট ব্যবহার করে।
iOS-এ, সিস্টেম আপডেট নিয়ন্ত্রণ করে — ন্যূনতম ব্যবধান 15–30 মিনিট, গুরুত্বপূর্ণ ডেটার জন্য push-to-refresh ব্যবহার করা হয়। Android-এ, ব্যবধান updatePeriodMillis-এ (ন্যূনতম 30 মিনিট) বা পটভূমির কাজের জন্য WorkManager-এর মাধ্যমে সেট করা হয়।
iOS small (170x170pt), medium (360x170pt) এবং large (360x380pt) সমর্থন করে। Android একটি নমনীয় সেল গ্রিড ব্যবহার করে: 2x1 থেকে 5x5 পর্যন্ত, আকার লঞ্চার এবং OS সংস্করণের উপর নির্ভর করে।
iOS-এ, উইজেটের ভিতরে অ্যানিমেশন উপলব্ধ নয় — এগুলি স্থির উপাদান। Android RemoteViews setFloat() এবং ViewPropertyAnimator-এর মাধ্যমে মৌলিক অ্যানিমেশন সমর্থন করে, কিন্তু জটিল অ্যানিমেশন উপলব্ধ নয়।
সঠিক বাস্তবায়নের সাথে — না। সিস্টেম উইজেট সংস্থান কঠোরভাবে সীমাবদ্ধ করে: iOS-এ — আপডেট এবং মেমরি বাজেট (30–50 MB), Android-এ — ন্যূনতম আপডেট ব্যবধান। সমস্যাযুক্ত উইজেটগুলি সিস্টেম দ্বারা জোরপূর্বক বন্ধ করা হয়।
সারসংক্ষেপ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন