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

'কম্পোজ' ফিচার ব্যবহার করে দেখুন
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-এ ৩০ মিনিটের কম ভ্যালু কাজ করে না। তবে, আপনি যদি নির্দিষ্ট সময় অন্তর আপডেট বন্ধ করতে চান, তাহলে ০ উল্লেখ করতে পারেন।

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

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

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

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

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

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

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

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

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

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

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

আপডেটের সময়সীমা

নিয়ম অনুযায়ী, সিস্টেম ব্রডকাস্ট রিসিভারকে ১০ সেকেন্ড পর্যন্ত রান করতে দেয়। এটি সাধারণত অ্যাপের মূল থ্রেডে রান করে। এর পরে, এটি প্রতিক্রিয়া জানায় না বলে ধরে নেওয়া হয় এবং অ্যাপ্লিকেশন উত্তর দিচ্ছে না (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 ফ্ল্যাগ যোগ করুন।