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

রচনা পদ্ধতিটি চেষ্টা করে দেখুন
জেটপ্যাক কম্পোজ হল অ্যান্ড্রয়েডের জন্য প্রস্তাবিত UI টুলকিট। কম্পোজ-স্টাইল 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);

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

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

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

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

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

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

আপনি ব্যবহারকারীদের একটি কনফিগারেশনে আপডেটের ফ্রিকোয়েন্সি সামঞ্জস্য করতে দিতে পারেন। উদাহরণস্বরূপ, তারা প্রতি 15 মিনিটে অথবা দিনে মাত্র চারবার একটি স্টক টিকার আপডেট করতে চাইতে পারেন। এই ক্ষেত্রে, 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 এ পাস করা IntentIntent.FLAG_RECEIVER_FOREGROUND ফ্ল্যাগটি যোগ করুন।