একটি উন্নত উইজেট তৈরি করুন

কম্পোজ পদ্ধতিটি চেষ্টা করুন
অ্যান্ড্রয়েডের জন্য Jetpack Compose হলো প্রস্তাবিত UI টুলকিট। Compose-স্টাইলের API ব্যবহার করে কীভাবে উইজেট তৈরি করতে হয় তা শিখুন।

এই পৃষ্ঠায় উন্নততর ব্যবহারকারী অভিজ্ঞতার জন্য আরও আধুনিক উইজেট তৈরির প্রস্তাবিত পদ্ধতিগুলো ব্যাখ্যা করা হয়েছে।

উইজেটের বিষয়বস্তু হালনাগাদ করার জন্য অপ্টিমাইজেশন

উইজেটের বিষয়বস্তু আপডেট করা গণনাগতভাবে ব্যয়বহুল হতে পারে। ব্যাটারির ব্যবহার কমাতে, আপডেটের ধরন, পুনরাবৃত্তি এবং সময় অপ্টিমাইজ করুন।

উইজেট আপডেটের প্রকারভেদ

একটি উইজেট আপডেট করার তিনটি উপায় আছে: সম্পূর্ণ আপডেট, আংশিক আপডেট এবং কালেকশন উইজেটের ক্ষেত্রে ডেটা রিফ্রেশ। প্রত্যেকটির ভিন্ন ভিন্ন কম্পিউটেশনাল খরচ এবং ফলাফল রয়েছে।

নিম্নলিখিত অংশে প্রতিটি আপডেটের ধরণ বর্ণনা করা হয়েছে এবং প্রতিটির জন্য কোড স্নিপেট দেওয়া হয়েছে।

  • সম্পূর্ণ আপডেট: উইজেটটি সম্পূর্ণরূপে আপডেট করতে AppWidgetManager.updateAppWidget(int, android.widget.RemoteViews) কল করুন। এটি পূর্বে প্রদত্ত RemoteViews একটি নতুন RemoteViews দ্বারা প্রতিস্থাপন করে। এটি সবচেয়ে বেশি গণনা-ব্যয়বহুল আপডেট।

    কোটলিন

    val appWidgetManager = AppWidgetManager.getInstance(context)
    val remoteViews = RemoteViews(context.getPackageName(), R.layout.widgetlayout).also {
    setTextViewText(R.id.textview_widget_layout1, "Updated text1")
    setTextViewText(R.id.textview_widget_layout2, "Updated text2")
    }
    appWidgetManager.updateAppWidget(appWidgetId, remoteViews)

    জাভা

    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widgetlayout);
    remoteViews.setTextViewText(R.id.textview_widget_layout1, "Updated text1");
    remoteViews.setTextViewText(R.id.textview_widget_layout2, "Updated text2");
    appWidgetManager.updateAppWidget(appWidgetId, remoteViews);
  • আংশিক আপডেট: উইজেটের অংশবিশেষ আপডেট করতে AppWidgetManager.partiallyUpdateAppWidget কল করুন। এটি নতুন RemoteViews পূর্বে প্রদত্ত RemoteViews সাথে একীভূত করে। যদি কোনো উইজেট updateAppWidget(int[], RemoteViews) -এর মাধ্যমে অন্তত একটি সম্পূর্ণ আপডেট না পায়, তাহলে এই মেথডটি উপেক্ষা করা হয়।

    কোটলিন

    val appWidgetManager = AppWidgetManager.getInstance(context)
    val remoteViews = RemoteViews(context.getPackageName(), R.layout.widgetlayout).also {
    setTextViewText(R.id.textview_widget_layout, "Updated text")
    }
    appWidgetManager.partiallyUpdateAppWidget(appWidgetId, remoteViews)

    জাভা

    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    RemoteViews remoteViews = new RemoteViews(context.getPackageName(), R.layout.widgetlayout);
    remoteViews.setTextViewText(R.id.textview_widget_layout, "Updated text");
    appWidgetManager.partiallyUpdateAppWidget(appWidgetId, remoteViews);
  • কালেকশন ডেটা রিফ্রেশ: আপনার উইজেটের কোনো কালেকশন ভিউ-এর ডেটা বাতিল করতে AppWidgetManager.notifyAppWidgetViewDataChanged কল করুন। এটি RemoteViewsFactory.onDataSetChanged ট্রিগার করে। এই অন্তর্বর্তীকালীন সময়ে, উইজেটে পুরোনো ডেটা প্রদর্শিত হয়। এই পদ্ধতির মাধ্যমে আপনি নিরাপদে ব্যয়বহুল কাজগুলো সিনক্রোনাসভাবে সম্পাদন করতে পারেন।

    কোটলিন

    val appWidgetManager = AppWidgetManager.getInstance(context)
    appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.widget_listview)

    জাভা

    AppWidgetManager appWidgetManager = AppWidgetManager.getInstance(context);
    appWidgetManager.notifyAppWidgetViewDataChanged(appWidgetId, R.id.widget_listview);

আপনার অ্যাপের যেকোনো জায়গা থেকে এই মেথডগুলো কল করতে পারেন, তবে শর্ত হলো অ্যাপটির UID অবশ্যই সংশ্লিষ্ট AppWidgetProvider ক্লাসের UID-এর সমান হতে হবে।

একটি উইজেট কত ঘন ঘন আপডেট করতে হবে তা নির্ধারণ করুন

updatePeriodMillis অ্যাট্রিবিউটের প্রদত্ত মানের উপর নির্ভর করে উইজেটগুলো পর্যায়ক্রমে আপডেট হয়। উইজেটটি ব্যবহারকারীর ইন্টারঅ্যাকশনের প্রতিক্রিয়ায়, আপডেট ব্রডকাস্ট করে, অথবা উভয়ভাবেই আপডেট হতে পারে।

পর্যায়ক্রমে আপডেট করুন

আপনি appwidget-provider XML-এ AppWidgetProviderInfo.updatePeriodMillis এর জন্য একটি মান নির্দিষ্ট করে পর্যায়ক্রমিক আপডেটের ফ্রিকোয়েন্সি নিয়ন্ত্রণ করতে পারেন। প্রতিটি আপডেট AppWidgetProvider.onUpdate() মেথডটিকে ট্রিগার করে, যেখানে আপনি উইজেটটি আপডেট করার কোড রাখতে পারেন। তবে, যদি আপনার উইজেটকে অ্যাসিঙ্ক্রোনাসভাবে ডেটা লোড করতে হয় বা আপডেট হতে ১০ সেকেন্ডের বেশি সময় লাগে, তাহলে পরবর্তী একটি বিভাগে বর্ণিত ব্রডকাস্ট রিসিভার আপডেটের বিকল্পগুলো বিবেচনা করুন, কারণ ১০ সেকেন্ড পরে সিস্টেম একটি BroadcastReceiver প্রতিক্রিয়াহীন বলে মনে করে।

updatePeriodMillis ৩০ মিনিটের কম মান সমর্থন করে না। তবে, আপনি যদি পর্যায়ক্রমিক আপডেট নিষ্ক্রিয় করতে চান, তাহলে ০ উল্লেখ করতে পারেন।

আপনি কনফিগারেশনের মাধ্যমে ব্যবহারকারীদের আপডেটের ফ্রিকোয়েন্সি বা পুনরাবৃত্তি নিয়ন্ত্রণ করার সুযোগ দিতে পারেন। উদাহরণস্বরূপ, তারা হয়তো চাইতে পারেন যে একটি স্টক টিকার প্রতি ১৫ মিনিট পর পর অথবা দিনে মাত্র চারবার আপডেট হোক। এই ক্ষেত্রে, updatePeriodMillis কে 0-তে সেট করুন এবং এর পরিবর্তে WorkManager ব্যবহার করুন।

ব্যবহারকারীর প্রতিক্রিয়ার জবাবে আপডেট

ব্যবহারকারীর কার্যকলাপের উপর ভিত্তি করে উইজেট আপডেট করার কিছু প্রস্তাবিত উপায় নিচে দেওয়া হলো:

  • অ্যাপের কোনো অ্যাক্টিভিটি থেকে: ব্যবহারকারীর কোনো ইন্টারঅ্যাকশনের (যেমন ব্যবহারকারীর ট্যাপ) প্রতিক্রিয়ায় সরাসরি AppWidgetManager.updateAppWidget কল করুন।

  • রিমোট ইন্টারঅ্যাকশন, যেমন একটি নোটিফিকেশন বা একটি অ্যাপ উইজেট থেকে: একটি PendingIntent তৈরি করুন, তারপর কল করা Activity , Broadcast , বা Service থেকে উইজেটটি আপডেট করুন। আপনি আপনার নিজের অগ্রাধিকার বেছে নিতে পারেন। উদাহরণস্বরূপ, যদি আপনি PendingIntent জন্য একটি Broadcast নির্বাচন করেন, তাহলে BroadcastReceiver অগ্রাধিকার দেওয়ার জন্য আপনি একটি ফোরগ্রাউন্ড ব্রডকাস্ট বেছে নিতে পারেন।

একটি সম্প্রচার ইভেন্টের প্রতিক্রিয়ায় আপডেট

একটি ব্রডকাস্ট ইভেন্টের উদাহরণ যার জন্য উইজেট আপডেট করার প্রয়োজন হয়, তা হলো যখন ব্যবহারকারী একটি ছবি তোলেন। এক্ষেত্রে, একটি নতুন ছবি শনাক্ত হলে আপনি উইজেটটি আপডেট করতে চাইবেন।

আপনি JobScheduler ব্যবহার করে একটি জব শিডিউল করতে পারেন এবং JobInfo.Builder.addTriggerContentUri মেথডটির মাধ্যমে ট্রিগার হিসেবে একটি ব্রডকাস্ট নির্দিষ্ট করতে পারেন।

আপনি ব্রডকাস্টের জন্য একটি BroadcastReceiver রেজিস্টার করতে পারেন—উদাহরণস্বরূপ, ACTION_LOCALE_CHANGED এর জন্য লিসেন করা। তবে, যেহেতু এটি ডিভাইসের রিসোর্স ব্যবহার করে, তাই এটি সতর্কতার সাথে ব্যবহার করুন এবং শুধুমাত্র নির্দিষ্ট ব্রডকাস্টটিই শুনুন। Android 7.0 (API লেভেল 24) এবং Android 8.0 (API লেভেল 26)-এ ব্রডকাস্টের সীমাবদ্ধতা চালু হওয়ার ফলে, কিছু নির্দিষ্ট ব্যতিক্রম ছাড়া অ্যাপগুলো তাদের ম্যানিফেস্টে ইমপ্লিসিট ব্রডকাস্ট রেজিস্টার করতে পারে না।

ব্রডকাস্টরিসিভার থেকে উইজেট আপডেট করার সময় বিবেচ্য বিষয়সমূহ

যদি AppWidgetProvider সহ কোনো BroadcastReceiver থেকে উইজেটটি আপডেট করা হয়, তাহলে উইজেট আপডেটের সময়কাল এবং অগ্রাধিকারের বিষয়ে নিম্নলিখিত বিষয়গুলো সম্পর্কে সচেতন থাকুন।

আপডেটের সময়কাল

সাধারণত, সিস্টেম ব্রডকাস্ট রিসিভারগুলোকে (যেগুলো সাধারণত অ্যাপের প্রধান থ্রেডে চলে) ১০ সেকেন্ড পর্যন্ত চলতে দেয়, এরপর সেগুলোকে সাড়াহীন বলে গণ্য করে এবং একটি 'অ্যাপ্লিকেশন নট রেসপন্ডিং' (ANR) ত্রুটি দেখায়। ব্রডকাস্টটি পরিচালনা করার সময় প্রধান থ্রেডকে ব্লক হওয়া থেকে বাঁচাতে, goAsync মেথডটি ব্যবহার করুন। যদি উইজেটটি আপডেট হতে আরও বেশি সময় লাগে, তবে WorkManager ব্যবহার করে একটি টাস্ক শিডিউল করার কথা বিবেচনা করতে পারেন।

Caution: Any work you do here blocks further broadcasts until it completes,
so it can slow the receiving of later events.

আরও তথ্যের জন্য নিরাপত্তা সংক্রান্ত বিবেচ্য বিষয় ও সর্বোত্তম অনুশীলনসমূহ দেখুন।

আপডেটের অগ্রাধিকার

ডিফল্টরূপে, ব্রডকাস্টগুলো— AppWidgetProvider.onUpdate ব্যবহার করে করা ব্রডকাস্টসহ—ব্যাকগ্রাউন্ড প্রসেস হিসেবে চলে। এর মানে হলো, সিস্টেম রিসোর্সের ওপর অতিরিক্ত চাপ পড়লে ব্রডকাস্ট রিসিভার চালু হতে দেরি হতে পারে। ব্রডকাস্টকে অগ্রাধিকার দিতে, এটিকে একটি ফোরগ্রাউন্ড প্রসেস করুন।

উদাহরণস্বরূপ, যখন ব্যবহারকারী উইজেটের কোনো নির্দিষ্ট অংশে ট্যাপ করেন, তখন PendingIntent.getBroadcast এ পাঠানো Intent টিতে Intent.FLAG_RECEIVER_FOREGROUND ফ্ল্যাগটি যোগ করুন।