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

Compose-এর মাধ্যমে চেষ্টা করুন
Jetpack Compose হল Android-এর জন্য সাজেস্ট করা UI টুলকিট। Compose-স্টাইল API ব্যবহার করে কীভাবে উইজেট তৈরি করতে হয় তা জানুন।

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

উইজেট কন্টেন্ট আপডেট করার জন্য অপ্টিমাইজেশন

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

উইজেট আপডেটের ধরন

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

নিম্নলিখিত বিবরণ থেকে প্রতিটি আপডেটের ধরন সম্পর্কে জানতে পারবেন এবং প্রতিটির জন্য কোড স্নিপেট পাবেন।

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

val appWidgetManager = AppWidgetManager.getInstance(context)
val remoteViews = RemoteViews(context.packageName, R.layout.widgetlayout).apply {
    setTextViewText(R.id.textview_widget_layout1, "Updated text1")
    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.packageName, R.layout.widgetlayout).apply {
    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)

আপনার অ্যাপের যেকোনও জায়গা থেকে আপনি এইসব পদ্ধতি কল করতে পারবেন, যতক্ষণ না অ্যাপের UID AppWidgetProvider ক্লাসের মতো একই হয়।

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

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

নির্দিষ্ট সময় অন্তর আপডেট করুন

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

updatePeriodMillis-এ ৩০ মিনিটের কম ভ্যালু কাজ করে না। তবে, আপনি যদি পর্যায়ক্রমিক আপডেট বন্ধ করতে চান, তাহলে আপনি 0 উল্লেখ করতে পারেন।

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

ব্যবহারকারীর ইন্টার‍্যাকশনের উত্তরে আপডেট করুন

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

  • অ্যাপের কোনও অ্যাক্টিভিটি থেকে: ব্যবহারকারীর ইন্টার‍্যাকশনের উত্তরে সরাসরি AppWidgetManager.updateAppWidget কল করা, যেমন ব্যবহারকারীর ট্যাপ।

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

ব্রডকাস্ট ইভেন্টের উত্তরে আপডেট করুন

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

আপনি WorkManager-এর সাহায্যে কাজ শিডিউল করতে এবং Constraints.Builder.addContentUriTrigger পদ্ধতি ব্যবহার করে কন্টেন্ট URI ট্রিগার নির্দিষ্ট করতে পারবেন।

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

BroadcastReceiver থেকে কোনও উইজেট আপডেট করার সময় যেসব বিষয় বিবেচনা করতে হবে

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 ফ্ল্যাগ যোগ করুন।