অ্যান্ড্রয়েড বিজ্ঞপ্তি ব্যবহার করে

এই কোডল্যাবটি অ্যাডভান্সড অ্যান্ড্রয়েড ইন কোটলিন কোর্সের অংশ। আপনি যদি কোডল্যাবগুলি ক্রমানুসারে কাজ করেন তবে আপনি এই কোর্সের সর্বাধিক মূল্য পাবেন, তবে এটি বাধ্যতামূলক নয়৷ সমস্ত কোর্স কোডল্যাবগুলি কোটলিন কোডল্যাবস ল্যান্ডিং পৃষ্ঠায় অ্যাডভান্সড অ্যান্ড্রয়েডে তালিকাভুক্ত করা হয়েছে।

ভূমিকা

বিজ্ঞপ্তি হল এমন বার্তা যা আপনার অ্যাপের UI এর বাইরে ব্যবহারকারীকে দেখানো হয়। ডিভাইসটি আনলক থাকলে বা ডিভাইসটি লক থাকা অবস্থায় লক স্ক্রিনে নিরাপত্তা সেটিংসের উপর নির্ভর করে বিজ্ঞপ্তিগুলি স্ক্রিনের উপরে দেখানো হয়।

একটি সাধারণ বিজ্ঞপ্তিতে একটি শিরোনাম, একটি বিবরণ এবং একটি আইকন থাকে। একটি বিজ্ঞপ্তিতে ক্লিকযোগ্য ক্রিয়া, একটি দ্রুত উত্তর, প্রসারিত সামগ্রী এবং চিত্র থাকতে পারে।

বিজ্ঞপ্তিগুলি সময়মতো উপাদান সরবরাহ করতে পারে এবং ব্যবহারকারীকে দ্রুত ক্রিয়া সম্পাদন করার অনুমতি দেওয়ার জন্য তাদের বোতাম থাকতে পারে, যেমন একটি উত্তর পাঠানো বা একটি অ্যালার্ম স্নুজ করা। একটি বিজ্ঞপ্তিতে ক্লিক করা ব্যবহারকারীকে বিজ্ঞপ্তি বিষয়বস্তু সম্পর্কিত আপনার অ্যাপের একটি দৃশ্যে নিয়ে যায়।

নোটিফিকেশন হল ব্যবহারকারীদের একটি গুরুত্বপূর্ণ কাজ মনে করিয়ে দেওয়ার একটি সহায়ক উপায়, কিছু ঘটেছে তা তাদের জানাতে বা আপনার অ্যাপটি ব্যাকগ্রাউন্ডে থাকাকালীন তাদের প্রয়োজনীয় গুরুত্বপূর্ণ তথ্যের সাথে যোগাযোগ করতে। সংক্ষিপ্তভাবে বিজ্ঞপ্তি ব্যবহার করুন. এটি শুধুমাত্র ব্যবহারকারীদের সম্মান করে না, এটি আপনার অ্যাপের বিজ্ঞপ্তিটি প্রাপ্য মনোযোগ পাওয়ার সম্ভাবনাও বাড়িয়ে তোলে।

এই কোডল্যাবে, আপনি শিখবেন কীভাবে একটি অ্যান্ড্রয়েড অ্যাপে বিজ্ঞপ্তি তৈরি এবং ব্যবহার করতে হয়।

আপনি ইতিমধ্যে কি জানা উচিত

আপনার সাথে পরিচিত হওয়া উচিত:

  • কোটলিনে অ্যান্ড্রয়েড অ্যাপগুলি কীভাবে ক্রেট করবেন। বিশেষ করে, Android SDK এর সাথে কাজ করুন।
  • আর্কিটেকচার কম্পোনেন্ট এবং ডেটা বাইন্ডিং ব্যবহার করে কীভাবে অ্যাপস আর্কিটেক্ট করবেন।
  • BroadcastReceivers একটি মৌলিক বোঝার
  • AlarmManager-এর একটি প্রাথমিক ধারণা

আপনি কি শিখবেন

  • কিভাবে একটি বিজ্ঞপ্তি তৈরি, স্টাইল এবং পাঠাতে হয়।
  • কিভাবে বিজ্ঞপ্তি বাতিল করতে হয়।
  • কিভাবে নোটিফিকেশন চ্যানেল তৈরি করবেন।
  • কিভাবে বিজ্ঞপ্তিতে দ্রুত অ্যাকশন যোগ করবেন।
  • কিভাবে অ্যাপ আইকনে বিজ্ঞপ্তি ব্যাজ প্রদর্শন করবেন।

আপনি কি করবেন

  • স্টার্টার অ্যাপে একটি বিজ্ঞপ্তি যোগ করুন।
  • আপনার পূর্বে পাঠানো বিজ্ঞপ্তি বাতিল করুন।
  • বিভিন্ন ধরনের বিজ্ঞপ্তির জন্য চ্যানেল তৈরি করুন।
  • স্টার্টার অ্যাপে বিজ্ঞপ্তিগুলি কাস্টমাইজ করুন।
  • আপনার বিজ্ঞপ্তি ইন্টারেক্টিভ করতে দ্রুত অ্যাকশন যোগ করুন।
  • বিজ্ঞপ্তি ব্যাজ বন্ধ করুন.

ডিম রান্না করা সহজ, তবুও আপনি যদি সময় ট্র্যাক করতে ব্যর্থ হন তবে এটি একটি চ্যালেঞ্জিং কাজ হতে পারে। এই কোডল্যাবে, আপনি একটি ডিম টাইমার অ্যাপে কাজ করবেন এবং এটিকে আপনার ভবিষ্যতের ডিমের মতো নিখুঁত করে তুলবেন। আপনি একটি কার্যকরী ডিম টাইমার অ্যাপ দিয়ে শুরু করবেন যা ব্যবহারকারীকে বিভিন্ন ডিমের শৈলীর জন্য রান্নার সময় বিভিন্ন সেট করতে দেয়। টাইমারটি নির্বাচিত সময়ের ব্যবধান থেকে গণনা করে এবং ডিম প্রস্তুত হলে একটি টোস্ট বার্তা প্রদর্শন করে।

এটি কার্যকরী বলে মনে হতে পারে, তবে এটি নিখুঁত থেকে অনেক দূরে এবং সত্যিই ব্যবহারকারী বান্ধব নয়। শুরু করার জন্য, টোস্ট বার্তাটি শুধুমাত্র একটি সংক্ষিপ্ত সময়ের জন্য দেখানো হয়, এবং তাই মিস করা সহজ। এছাড়াও, অ্যাপটি ফোরগ্রাউন্ডে না থাকলে বা ডিভাইসটি লক করা থাকলে, টোস্ট বার্তাটি অদৃশ্য হয়ে গেলে টাইমারের অবস্থার জন্য কোনও ভিজ্যুয়াল সূচক নেই।

আদর্শভাবে, ডিমের টাইমার ব্যবহারকারীদের সময় শেষ হলে বিজ্ঞপ্তিগুলি ব্যবহার করা উচিত। ব্যবহারকারীর সত্যিই জানতে হবে ডিম অবিলম্বে প্রস্তুত, অন্যথায় ডিম অতিরিক্ত রান্না করা হবে! বিজ্ঞপ্তিগুলি দৃশ্যমান, শব্দগুলি অন্তর্ভুক্ত করতে পারে এবং ডিভাইসটিকে ভাইব্রেট করতে পারে—ব্যবহারকারীর দৃষ্টি আকর্ষণ করার সমস্ত উপায়! এইভাবে আপনি নিখুঁত ডিম এবং সুখী, ভাল খাওয়ানো ব্যবহারকারীদের অর্জন করতে পারেন।

নমুনা অ্যাপ্লিকেশন পেতে, আপনি হয় করতে পারেন:

GitHub থেকে সংগ্রহস্থল ক্লোন করুন এবং স্টার্টার শাখায় স্যুইচ করুন।

$  git clone https://github.com/googlecodelabs/android-kotlin-notifications


বিকল্পভাবে, আপনি একটি জিপ ফাইল হিসাবে সংগ্রহস্থলটি ডাউনলোড করতে পারেন, এটি আনজিপ করতে পারেন এবং এটি অ্যান্ড্রয়েড স্টুডিওতে খুলতে পারেন।

জিপ ডাউনলোড করুন

  1. অ্যান্ড্রয়েড স্টুডিওতে অ্যাপটি খুলুন এবং চালান।

আপনি ডিম রান্না করার পূর্বনির্ধারিত সময়ের ব্যবধানের একটি তালিকা সহ একটি ডিমের চিত্র এবং একটি ড্রপডাউন মেনু দেখতে পাবেন। নরম সেদ্ধ ড্রপ-ডাউন মেনুর জন্য ত্রিভুজটিতে ক্লিক করুন। তালিকার প্রথম বিকল্পটি পরীক্ষার উদ্দেশ্যে দেওয়া হয়েছে এবং শুধুমাত্র 10 সেকেন্ডে অ্যালার্ম সেট করে। তালিকার পাশে একটি সুইচ রয়েছে যা ডিম টাইমার শুরু করে। আপনি যে কোনো সময় ডিম টাইমার শুরু এবং বন্ধ করতে এই সুইচটি ব্যবহার করতে পারেন। স্টার্টার কোডটি সম্পূর্ণরূপে কার্যকরী, যার মানে আপনি ডিমের টাইমার সেট আপ করতে পারেন এবং এটি 0-তে গণনা করতে দেখতে পারেন। একবার টাইমার শেষ হলে, একটি টোস্ট বার্তা প্রদর্শিত হবে, যেমনটি নীচে দেখানো হয়েছে।

  1. সোর্স কোড পরিদর্শন করুন। স্টার্টার অ্যাপটিতে MainActivity নামে একটি একক কার্যকলাপ রয়েছে। receiver , ui এবং util নামে তিনটি সাব প্যাকেজ রয়েছে।

  • /রিসিভারreceiver প্যাকেজে দুটি সম্প্রচার রিসিভার রয়েছে যার নাম AlarmReceiver এবং SnoozeReceiver । ব্যবহারকারী-সংজ্ঞায়িত টাইমার আপ হলে বিজ্ঞপ্তি পাঠাতে AlarmReceiver দ্বারা ট্রিগার করা AlarmManagerSnoozeReceiver বিজ্ঞপ্তিটি স্নুজ করতে ব্যবহারকারীর ক্লিক পরিচালনা করে।
  • /ui — এতে EggTimerFragment রয়েছে যা অ্যাপের UI অংশের অংশ। EggTimerViewModel টাইমার শুরু এবং বাতিল করার জন্য এবং অন্যান্য জীবনচক্র-সম্পর্কিত অ্যাপ কার্যগুলির জন্য দায়ী৷
  • /util — এই প্যাকেজে দুটি ফাইল রয়েছে। BindingUtils.kt অ্যাপ UI এবং ViewModel এর মধ্যে ডেটা বাইন্ডিং সক্ষম করতে বাইন্ডিং অ্যাডাপ্টার রয়েছে৷ NotificationUtils.kt এর NotificationManager এ এক্সটেনশন পদ্ধতি রয়েছে।

বিজ্ঞপ্তিগুলি ব্যবহার করা আপনার অ্যাপে আপনার ব্যবহারকারীদের মনোযোগ আকর্ষণ করার একটি দুর্দান্ত উপায়। আপনার অ্যাপ চলমান না হোক বা অগ্রভাগে চলুক না কেন, একটি বিজ্ঞপ্তি পর্দার উপরে একটি পপআপ উইন্ডো দেখাবে এবং এতে শব্দ বা কম্পন অন্তর্ভুক্ত থাকতে পারে। একটি বিজ্ঞপ্তি তৈরি করতে, আপনাকে একটি বিজ্ঞপ্তি নির্মাতা ব্যবহার করতে হবে এবং একটি শিরোনাম পাঠ্য, একটি বিষয়বস্তু পাঠ্য এবং একটি আইকন প্রদান করতে হবে৷ নির্মাতার সমস্ত প্রয়োজনীয় ক্ষেত্র হয়ে গেলে, NotificationManager , যা একটি সিস্টেম পরিষেবা, আপনাকে এই বিষয়বস্তুটিকে একটি বিজ্ঞপ্তি হিসাবে প্রদর্শন করতে সাহায্য করে৷ NotificationManager ম্যানেজার একটি বিজ্ঞপ্তি পাঠানো, এর বিষয়বস্তু আপডেট করা এবং বিজ্ঞপ্তি বাতিল করার জন্য দায়ী। নিম্নলিখিত ধাপে, আপনি NotificationManager এ এক্সটেনশন পদ্ধতি যোগ করবেন। এইভাবে, যখনই আপনাকে NotificationManager ব্যবহার করতে হবে, আপনি এই এক্সটেনশন ফাংশনগুলি ব্যবহার করতে পারবেন আপনার যে কার্যকারিতা ব্যবহার করতে হবে তা অর্জন করতে।

ধাপ 1: একটি মৌলিক বিজ্ঞপ্তি তৈরি করুন

এই কাজটিতে, আপনি একটি নতুন বিজ্ঞপ্তি তৈরি করছেন, আপনার ব্যবহারকারীর জন্য একটি বার্তা সেট করছেন এবং বিজ্ঞপ্তি পাঠাচ্ছেন।

  1. NotificationUtils.kt ক্লাস খুলুন এবং TODO: Step 1.1 । আপনি এই কোডল্যাব এবং অ্যাপ কোডে মিলে যাওয়া টোডো পাবেন।
  2. প্রদত্ত sendNotification() ফাংশন পরীক্ষা করুন। আপনি বিজ্ঞপ্তি পাঠাতে NotificationManager এ এই এক্সটেনশন ফাংশনটি প্রসারিত করবেন।
//NotificationUtils.kt
// TODO: Step 1.1 extension function to send messages (GIVEN)
/**
 * Builds and delivers a notification.
 *
 * @param messageBody, notification text.
 * @param context, activity context.
 */
fun NotificationManager.sendNotification(messageBody: String, applicationContext: Context) {
  1. বিজ্ঞপ্তি নির্মাতার একটি উদাহরণ পান, অ্যাপ প্রসঙ্গে পাস করুন এবং একটি চ্যানেল আইডি। চ্যানেল আইডি চ্যানেলের জন্য একটি স্ট্রিং মান।

নোটিফিকেশন চ্যানেল হল গ্রুপ নোটিফিকেশনের একটি উপায়। একই ধরণের বিজ্ঞপ্তিগুলিকে একত্রিত করে, বিকাশকারী এবং ব্যবহারকারীরা চ্যানেলের সমস্ত বিজ্ঞপ্তি নিয়ন্ত্রণ করতে পারে৷ একবার একটি চ্যানেল তৈরি হয়ে গেলে, এটি যেকোনো সংখ্যক বিজ্ঞপ্তি সরবরাহ করতে ব্যবহার করা যেতে পারে।

//NotificationUtils.kt
// TODO: Step 1.2 get an instance of NotificationCompat.Builder
val builder = NotificationCompat.Builder(
        applicationContext,
        applicationContext.getString(R.string.egg_notification_channel_id)
)
  1. আপনি ব্যবহারকারীকে যে বার্তা দিতে চান তার জন্য আপনার অ্যাপ, একটি শিরোনাম এবং বিষয়বস্তুর পাঠ্য উপস্থাপন করতে বিজ্ঞপ্তি আইকন সেট করুন। আপনি কোডল্যাবে আপনার বিজ্ঞপ্তিটি আরও কাস্টমাইজ করার জন্য আরও বিকল্প দেখতে পাবেন, তবে এটি একটি বিজ্ঞপ্তি পাঠানোর জন্য আপনাকে ন্যূনতম পরিমাণ ডেটা সেট করতে হবে।
//NotificationUtils.kt
   // TODO: Step 1.3 set title, text and icon to builder
   .setSmallIcon(R.drawable.cooked_egg)
   .setContentTitle(applicationContext.getString(R.string.notification_title))
   .setContentText(messageBody)
  1. এরপর, আপনাকে আপনার বিজ্ঞপ্তির জন্য একটি অনন্য আইডি সহ এবং আপনার বিল্ডার থেকে Notification অবজেক্ট সহ notify() কল করতে হবে।

এই আইডিটি বর্তমান বিজ্ঞপ্তির উদাহরণ উপস্থাপন করে এবং এই বিজ্ঞপ্তিটি আপডেট বা বাতিল করার জন্য প্রয়োজন। যেহেতু আপনার অ্যাপে একটি নির্দিষ্ট সময়ে শুধুমাত্র একটি সক্রিয় বিজ্ঞপ্তি থাকবে, তাই আপনি আপনার সমস্ত বিজ্ঞপ্তির জন্য একই আইডি ব্যবহার করতে পারেন। আপনাকে ইতিমধ্যেই NotificationUtils.ktNOTIFICATION_ID নামক এই উদ্দেশ্যে একটি ধ্রুবক দেওয়া হয়েছে। লক্ষ্য করুন যে আপনি সরাসরি notify() কল করতে পারেন যেহেতু আপনি একই ক্লাসে একটি এক্সটেনশন ফাংশন থেকে কল করছেন।

//NotificationUtils.kt
   // TODO: Step 1.4 call notify to send the notification
    // Deliver the notification
    notify(NOTIFICATION_ID, builder.build())
  1. ui/EggTimerViewModel.kt খুলুন এবং startTimer() ফাংশন খুঁজুন। যখন ব্যবহারকারী ডিম টাইমার সক্ষম করে তখন এই ফাংশনটি নির্বাচিত সময়ের ব্যবধানের সাথে একটি অ্যালার্ম তৈরি করে।
  2. ব্যবহারকারী টাইমার শুরু করলে আপনি এই ফাংশনে একটি বিজ্ঞপ্তি ট্রিগার করবেন। আপনি পূর্বে প্রয়োগ করেছেন sendNotification() কল করার জন্য, আপনার NotificationManager এর একটি উদাহরণ প্রয়োজন। NotificationManager হল একটি সিস্টেম পরিষেবা যা আপনার যোগ করা এক্সটেনশন ফাংশন সহ বিজ্ঞপ্তি API এর জন্য উন্মুক্ত সমস্ত ফাংশন প্রদান করে৷ যে কোনো সময় আপনি একটি বিজ্ঞপ্তি পাঠাতে, বাতিল করতে বা আপডেট করতে চান, আপনাকে সিস্টেম থেকে NotificationManager এর একটি উদাহরণের জন্য অনুরোধ করতে হবে। sendNotification()| কল করুন বিজ্ঞপ্তি বার্তা এবং প্রসঙ্গ সহ ফাংশন।
// EggTimerViewModel.kt
// TODO: Step 1.5 get an instance of NotificationManager 
// and call sendNotification

val notificationManager = ContextCompat.getSystemService(
    app, 
    NotificationManager::class.java
) as NotificationManager
                notificationManager.sendNotification(app.getString(R.string.timer_running), app)

তুমি অনেকটা সেখানে. যাইহোক, আপনি যদি এখন আপনার অ্যাপটি চালান এবং টাইমার সেট করেন, আপনি একটি বিজ্ঞপ্তি পাবেন না।

  1. logcat খুলুন এবং "No Channel found" অনুসন্ধান করুন। আপনি একটি ত্রুটি বার্তা দেখতে পাবেন যে egg_channel বিদ্যমান নেই। নিম্নলিখিত ধাপে আপনি বিজ্ঞপ্তি চ্যানেল সম্পর্কে আরও শিখবেন এবং এটি ঠিক করতে পারবেন।

ধাপ 2: বিজ্ঞপ্তি চ্যানেল

API স্তর 26 দিয়ে শুরু করে, সমস্ত বিজ্ঞপ্তি অবশ্যই একটি চ্যানেলে বরাদ্দ করতে হবে৷ আপনি যদি অ্যাপ লঞ্চার আইকনটি ট্যাপ করে ধরে রাখেন, অ্যাপের তথ্য নির্বাচন করুন এবং বিজ্ঞপ্তিগুলি আলতো চাপুন, আপনি অ্যাপের সাথে যুক্ত বিজ্ঞপ্তি চ্যানেলগুলির একটি তালিকা দেখতে পাবেন। এই মুহূর্তে তালিকাটি খালি কারণ আপনার অ্যাপ কোনো চ্যানেল তৈরি করেনি।

চ্যানেলগুলি বিজ্ঞপ্তির একটি "প্রকার" প্রতিনিধিত্ব করে—উদাহরণস্বরূপ, আপনার ডিমের টাইমার যখন ডিম রান্না করা হয় তখন একটি বিজ্ঞপ্তি পাঠাতে পারে এবং আপনার সকালের নাস্তার সাথে ডিম খাওয়ার কথা মনে করিয়ে দেওয়ার জন্য প্রতিদিনের বিজ্ঞপ্তি পাঠাতে অন্য চ্যানেল ব্যবহার করতে পারে। একটি চ্যানেলের সমস্ত বিজ্ঞপ্তি একসাথে গোষ্ঠীভুক্ত করা হয় এবং ব্যবহারকারীরা একটি সম্পূর্ণ চ্যানেলের জন্য বিজ্ঞপ্তি সেটিংস কনফিগার করতে পারেন৷ এটি ব্যবহারকারীদের তাদের আগ্রহের ধরনের বিজ্ঞপ্তির উপর ভিত্তি করে তাদের বিজ্ঞপ্তি সেটিংস ব্যক্তিগতকৃত করতে অনুমতি দেয়৷ উদাহরণস্বরূপ, আপনার ব্যবহারকারীরা সকালের নাস্তার বিজ্ঞপ্তিগুলি অক্ষম করতে পারে, কিন্তু তারপরও টাইমার থেকে বিজ্ঞপ্তিগুলি দেখতে বেছে নেয়৷

বিকাশকারীরা একটি চ্যানেলের সমস্ত বিজ্ঞপ্তিতে প্রয়োগ করার জন্য প্রাথমিক সেটিংস, গুরুত্ব এবং আচরণ সেট করে। আপনি প্রাথমিক সেটিংস সেট করার পরে, ব্যবহারকারীরা এই সেটিংস ওভাররাইড করতে পারেন।

ধাপ 1.1-এ আপনি আপনার নোটিফিকেশন চ্যানেল হিসেবে egg_notification_channel_id ব্যবহার করেছেন, তাই এখন আপনাকে এই চ্যানেলের বিজ্ঞপ্তি সেটিংস এবং আচরণ আসলে তৈরি এবং কাস্টমাইজ করতে হবে।

  1. EggTimerFragment.kt খুলুন এবং createChannel() ফাংশন খুঁজুন।
  2. NotificationChannel এর কনস্ট্রাক্টরের কাছে অনন্য চ্যানেল আইডি পাস করুন।
  3. বিজ্ঞপ্তি চ্যানেলের নাম পাস করুন, যা ব্যবহারকারীরা তাদের সেটিংস স্ক্রিনেও দেখতে পাবেন।
  4. শেষ পরামিতি হিসাবে, বিজ্ঞপ্তি চ্যানেলের জন্য গুরুত্ব স্তর পাস করুন। গুরুত্বপূর্ণ স্তরগুলি এই কোডল্যাবে পরে কভার করা হবে, তাই আপাতত আপনি NotificationManag er.IMPORTANCE_LOW ব্যবহার করতে পারেন।
  5. notificationChannel চ্যানেল অবজেক্ট সেট enableLights সত্য করুন। একটি বিজ্ঞপ্তি দেখানো হলে এই সেটিং লাইট সক্রিয় করবে।
  6. notificationChannel চ্যানেল অবজেক্টে একটি বিজ্ঞপ্তি দেখানো হলে একটি লাল আলো দেখানোর জন্য lightColor লাল সেট করুন।
  7. notificationChannel চ্যানেল অবজেক্টে কম্পন সক্ষম করার জন্য enableVibration কে সত্যে সেট করুন।
  8. notificationChannel চ্যানেল অবজেক্ট চ্যানেলের বিবরণকে 'Time for breakf সেট করে।
  9. getSystemService() কল করে NotificationManager এর একটি উদাহরণ পান।
  10. NotificationManagercreateNotificationChannel() কে কল করুন এবং আপনি আগের ধাপে তৈরি করা notificationChannel অবজেক্টটি পাস করুন।
//EggTimerFragment.kt
private fun createChannel(channelId: String, channelName: String) {
    // TODO: Step 1.6 START create a channel
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val notificationChannel = NotificationChannel(
            channelId,
            channelName,
            // TODO: Step 2.4 change importance
            NotificationManager.IMPORTANCE_LOW
        )
        // TODO: Step 2.6 disable badges for this channel

        notificationChannel.enableLights(true)
        notificationChannel.lightColor = Color.RED
        notificationChannel.enableVibration(true)
        notificationChannel.description = "Time for breakfast"

        val notificationManager = requireActivity().getSystemService(
            NotificationManager::class.java
        )
        notificationManager.createNotificationChannel(notificationChannel)
    }
    // TODO: Step 1.6 END create channel
}
  1. এরপরে, একটি চ্যানেল তৈরি করতে, আপনাকে createChannel() ফাংশনটি কল করতে হবে যা আপনি লিখেছিলেন (ধাপ 1.7)। এই ফাংশনটি দুটি প্যারামিটার নেয়, চ্যানেল আইডি এবং চ্যানেলের নাম। আপনার প্রকল্পে ইতিমধ্যে দেওয়া স্ট্রিং সংস্থানগুলি থেকে আপনাকে আপনার চ্যানেল আইডি এবং চ্যানেলের নাম দেখতে হবে।
// EggTimerFragment.kt
    // TODO: Step 1.7 call createChannel
    createChannel(
          getString(R.string.egg_notification_channel_id),
          getString(R.string.egg_notification_channel_name)
    )
  1. বিজ্ঞপ্তি নির্মাতার কাছে আপনাকে চ্যানেল আইডি পাস করতে হবে। আপনি ইতিমধ্যে ধাপ 1.2 এ এটি করেছেন। চ্যানেল আইডি হিসাবে একটি ভুল মান সেট করা বিজ্ঞপ্তিকে ব্যর্থ করে দেবে। আপনার পূর্বে সেট করা চ্যানেল আইডি সঠিক কিনা তা যাচাই করতে NotificationUtils.kt খুলুন।
// NotificationUtils.kt
val builder = NotificationCompat.Builder(
        applicationContext,
       // TODO: Step 1.8 verify the notification channel name
        applicationContext.getString(R.string.egg_notification_channel_id)
)
  1. অ্যাপটি চালান, এবং আপনি দেখতে পাবেন যে প্রতিবার আপনি টাইমার শুরু করার সময় অ্যাপটি একটি বিজ্ঞপ্তি পাঠায়।
  2. স্ট্যাটাস বারটি টানুন এবং লক্ষ্য করুন যে বিজ্ঞপ্তির শিরোনাম, বিষয়বস্তু এবং আইকন আপনি আগের ধাপে সেট করেছেন।
  3. নতুন তৈরি চ্যানেল যাচাই করতে, অ্যাপটি বন্ধ করুন এবং অ্যাপ আইকন খুঁজুন। অ্যাপ আইকনে একটি দীর্ঘ আলতো চাপুন এবং অ্যাপের তথ্য নির্বাচন করুন।

  1. সেটিংসের তালিকা থেকে বিজ্ঞপ্তি নির্বাচন করুন। শো বিজ্ঞপ্তি সেটিং এর ঠিক নীচে আপনি ডিম নামে একটি নতুন চ্যানেল দেখতে পাবেন৷

আপনি যখন অ্যাপটি চালান তখন বিজ্ঞপ্তিটি এখন দেখানো হয়। অ্যাপ ডেভেলপার হিসেবে আপনি এবং আপনার ব্যবহারকারী উভয়েই এই চ্যানেলে পাঠানো সমস্ত বিজ্ঞপ্তির জন্য সেটিংস এবং আচরণ কাস্টমাইজ করতে পারেন। অভিনন্দন, আপনি একটি বিজ্ঞপ্তি তৈরি করেছেন!

ধাপ 3: আপনার অ্যাপে বিজ্ঞপ্তি যোগ করুন

এখনও অবধি এটি বিজ্ঞপ্তি API এর প্রাথমিক ব্যবহার দেখায়, তবে টাইমার শুরু করার পরে একটি বিজ্ঞপ্তি পাঠানোর খুব বেশি অর্থ হয় না। ডিম প্রস্তুত হলে ব্যবহারকারীরা সম্ভবত বিজ্ঞপ্তি পেতে পছন্দ করবে। কোডল্যাবের নিম্নলিখিত অংশে, আপনি এটি ঠিক করবেন এবং টোস্ট বার্তাটিকে একটি বিজ্ঞপ্তিতে পরিবর্তন করবেন।

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

আপনার অ্যাপ অ্যালার্ম সেট আপ করতে অ্যালার্ম AlarmManager ব্যবহার করে। AlarmManager সম্পর্কিত কোডটি ইতিমধ্যেই স্টার্টার কোডে দেওয়া হয়েছে এবং টোস্ট বার্তা দেখানোর জন্য ব্যবহার করা হয়েছে। AlarmManager পছন্দসই সময় নির্বাচন ট্র্যাক রাখে এবং সময় শেষ হলে AlarmReceiver.kt এর onReceive() ফাংশন ট্রিগার করবে। আপনি যদি AlarmReceiver.kt এবং onReceive() এ নেভিগেট করলে, আপনি টোস্ট বার্তাটি দেখতে পাবেন যা প্রতিবার ডিম টাইমার সেট আপ করার সময় প্রদর্শিত হয়।

  1. AlarmReceiver.kt খুলুন, NotificationManager এর একটি উদাহরণ, এবং মেসেজ টেক্সট এবং প্রসঙ্গ প্যারামিটার সহ sendNotification() ফাংশনটি কল করুন।
// AlarmReceiver.kt
   // TODO: Step 1.9 add call to sendNotification
   val notificationManager = ContextCompat.getSystemService(
       context, 
       NotificationManager::class.java
   ) as NotificationManager
             
   notificationManager.sendNotification(
       context.getText(R.string.eggs_ready).toString(), 
       context
   )
  1. ঐচ্ছিকভাবে, টোস্টটি সরান যেহেতু টাইমার শেষ হলে আপনার অ্যাপটি একটি বিজ্ঞপ্তি পাঠাবে।
// AlarmReceiver.kt
     // TODO: Step 1.10 [Optional] remove toast
//   Toast.makeText(
//       context, 
//       context.getText(R.string.eggs_ready),
//       Toast.LENGTH_SHORT
//   ).show()
  1. আপনার অ্যাপ চালান। আপনি যখনই টাইমার শুরু করবেন এবং প্রতিবার টাইমার শেষ হবে তখন আপনার একটি বিজ্ঞপ্তি দেখতে হবে।

এটা আদর্শ নয়। আপনি আপনার ব্যবহারকারীদের অনেক বিজ্ঞপ্তি পাঠাতে চান না. ব্যবহারকারী যখন টাইমার শুরু করে তখন আপনি পাঠানো প্রথম বিজ্ঞপ্তিটি সরাতে পারেন।

  1. EggTimerFragment.kt খুলুন এবং ধাপ 1.5 এর জন্য বিজ্ঞপ্তি কোড সরান।
// EggTimeViewModel.kt

// TODO: Step 1.5 get an instance of NotificationManager 
// and call sendNotification
// val notificationManager = ContextCompat.getSystemService(
//      app,
//      NotificationManager::class.java
// ) as NotificationManager
// notificationManager.sendNotification(app.getString(R.string.eggs_ready), app)
  1. আবার আপনার অ্যাপ চালান.
  2. একটি টাইমার সেট করুন, এটিকে পটভূমিতে রাখুন এবং সময় শেষ হওয়ার জন্য অপেক্ষা করুন। আপনি একটি বিজ্ঞপ্তি দেখতে পাবেন। এটি একটি অনেক বেশি দরকারী বিজ্ঞপ্তি।

ধাপ 4: একটি বিষয়বস্তুর অভিপ্রায় যোগ করুন

  1. অ্যাপটি আবার চালান, যদি এটি ইতিমধ্যে চালু না হয়।
  2. বিজ্ঞপ্তিতে ক্লিক করুন। কিছুই ঘটেনি!

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

একটি Intent হল একটি মেসেজিং অবজেক্ট যা আপনি অন্য অ্যাপ উপাদান থেকে একটি অ্যাকশনের অনুরোধ করতে ব্যবহার করতে পারেন। উদ্দেশ্য একটি কার্যকলাপ, একটি পরিষেবা, বা একটি সম্প্রচার প্রদান শুরু করার জন্য ব্যবহার করা যেতে পারে. এই ক্ষেত্রে, ব্যবহারকারী যখন বিজ্ঞপ্তিতে ট্যাপ করে তখন আপনি সিস্টেমকে MainActivity খুলতে বলার জন্য এই উদ্দেশ্যটি ব্যবহার করেন। যেহেতু আপনার অ্যাপ শুধুমাত্র একটি একক ভিউ নিয়ে গঠিত, তাই এখানে আপনার কাছে অনেক অপশন নেই। যাইহোক, একটি বৃহত্তর অ্যাপে, বিজ্ঞপ্তিটি ব্যবহারকারীকে এমন একটি স্ক্রিনে এনে একটি বিরামহীন অভিজ্ঞতা তৈরি করা উচিত যা তারা যখন বিজ্ঞপ্তির সাথে ইন্টারঅ্যাক্ট করে তখন বোঝা যায়।

  1. NotificationUtils.kt খুলুন এবং sendNotification() এক্সটেনশন ফাংশন খুঁজুন।
  2. আপনার applicationContext কনটেক্সট এবং যে ক্রিয়াকলাপটি চালু করা হবে তা দিয়ে একটি উদ্দেশ্য তৈরি করুন, MainActivity::class.java Intent
// NotificationUtils.kt

fun NotificationManager.sendNotification(messageBody: String, applicationContext: Context) {
    // Create the content intent for the notification, which launches
    // this activity
   // TODO: Step 1.11 create intent
    val contentIntent = Intent(applicationContext, MainActivity::class.java)

আপনি অভিপ্রায় তৈরি করেছেন, কিন্তু বিজ্ঞপ্তিটি আপনার অ্যাপের বাইরে প্রদর্শিত হবে। আপনার অ্যাপের বাইরে কোনো উদ্দেশ্য কাজ করতে, আপনাকে একটি নতুন PendingIntent তৈরি করতে হবে।

PendingIntent আপনার আবেদনের পক্ষে অপারেশন করার জন্য অন্য অ্যাপ্লিকেশন বা সিস্টেমকে অধিকার দেয়। একটি PendingIntent নিজেই একটি টোকেনের একটি রেফারেন্স যা সিস্টেম দ্বারা রক্ষণাবেক্ষণ করে এটি পুনরুদ্ধার করতে ব্যবহৃত মূল ডেটা বর্ণনা করে। এর মানে হল, এমনকি যদি এর মালিকানাধীন আবেদনের প্রক্রিয়াটি মেরে ফেলা হয়, PendingIntent নিজেই এটি দেওয়া অন্যান্য প্রক্রিয়া থেকে ব্যবহারযোগ্য থাকবে। এই ক্ষেত্রে, টাইমার অ্যাপটি চলমান কিনা তা বিবেচনা না করে, সিস্টেমটি আপনার পক্ষে অ্যাপটি খুলতে মুলতুবি থাকা অভিপ্রায় ব্যবহার করবে।

  1. applicationContext , NOTIFICATION_ID , আগের ধাপে আপনার তৈরি করা contentIntent এবং PendingIntent পতাকা সহ একটি PendingIntent তৈরি করুন। PendingIntent পতাকা একটি নতুন PendingIntent তৈরি বা বিদ্যমান একটি ব্যবহার করার বিকল্প নির্দিষ্ট করে। আপনাকে PendingIntent.FLAG_UPDATE_CURRENT কে পতাকা হিসাবে সেট করতে হবে যেহেতু আপনি একটি নতুন বিজ্ঞপ্তি তৈরি করতে চান না যদি একটি বিদ্যমান থাকে। এইভাবে আপনি বর্তমান PendingIntent পরিবর্তন করবেন যা আপনার সরবরাহ করা অভিপ্রায়ের সাথে যুক্ত।
// NotificationUtils.kt
   // TODO: Step 1.12 create PendingIntent
    val contentPendingIntent = PendingIntent.getActivity(
        applicationContext, 
        NOTIFICATION_ID,
        contentIntent,
        PendingIntent.FLAG_UPDATE_CURRENT
    )
  1. আপনার বিজ্ঞপ্তিতে PendingIntent পাস করুন। আপনি NotificationBuildersetContentIntent() কল করে এটি করবেন। এখন, আপনি যখন বিজ্ঞপ্তিতে ক্লিক করবেন, PendingIntent ট্রিগার হবে, আপনার MainActivity খুলে যাবে।
  2. এছাড়াও setAutoCancel() true তে সেট করুন, যাতে ব্যবহারকারী যখন বিজ্ঞপ্তিতে ট্যাপ করেন, তখন বিজ্ঞপ্তিটি তাদের অ্যাপে নিয়ে যাওয়ার সাথে সাথেই বাতিল হয়ে যায়।
// NotificationUtils.kt
    // TODO: Step 1.13 set content intent
    .setContentIntent(contentPendingIntent)
    .setAutoCancel(true)
  1. অ্যাপটি আবার চালান।
  2. একটি টাইমার সেট করুন, অ্যাপটিকে পটভূমিতে রাখুন এবং বিজ্ঞপ্তিটি উপস্থিত হওয়ার জন্য অপেক্ষা করুন।
  3. একবার আপনি বিজ্ঞপ্তিটি দেখতে পেলে, স্ট্যাটাস বারটি নীচে টেনে বিজ্ঞপ্তিতে ক্লিক করুন এবং অ্যাপটিকে কীভাবে অগ্রভাগে আনা হয়েছে তা পর্যবেক্ষণ করুন।

ধাপ 5: বিজ্ঞপ্তি বাতিল করুন

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

এটি ঠিক করতে, আপনি যখন একটি নতুন টাইমার শুরু করবেন তখন আপনাকে পূর্ববর্তী বিজ্ঞপ্তিটি সাফ করতে হবে৷ আপনার NotificationUtils.kt এ আরেকটি এক্সটেনশন ফাংশন তৈরি করে শুরু করুন। NotificationManager ম্যানেজার-এর একটি এপিআই রয়েছে যাতে cancelAll () বলা হয়।

  1. NotificationsUtil.kt খুলুন।
  2. NotificationManager এ একটি এক্সটেনশন ফাংশন যোগ করুন যা cancelAll() কল করে।
// NotificationUtils.kt

// TODO: Step 1.14 Cancel all notifications
/**
 * Cancels all notifications.
 *
 */
fun NotificationManager.cancelNotifications() {
    cancelAll()
}
  1. EggTimerViewModel.kt খুলুন এবং startTimer() ফাংশনে নেভিগেট করুন।
  2. startTimer() এর ভিতরে, সিস্টেম থেকে NotificationManager এর একটি উদাহরণ পান এবং cancelNotifications() কল করুন।
//  EggTimerViewModel.kt
   //TODO Step 1.15 call cancel notification
    val notificationManager =
       ContextCompat.getSystemService(
            app,
            NotificationManager::class.java
        ) as NotificationManager
    notificationManager.cancelNotifications()       
  1. অ্যাপটি চালান এবং টাইমার শুরু করুন।
  2. আপনি বিজ্ঞপ্তি দেখার পরে, আবার টাইমার শুরু করুন এবং দেখুন কিভাবে আমাদের অ্যাপ স্ট্যাটাস বার থেকে আগের বিজ্ঞপ্তিটি স্বয়ংক্রিয়ভাবে মুছে দেয়।

নোটিফিকেশন ফ্রেমওয়ার্ক ডেভেলপারদের কাস্টম অ্যাকশন সেট করতে এবং প্রয়োজন অনুযায়ী তাদের বিজ্ঞপ্তি স্টাইল করার জন্য বিভিন্ন ধরনের কাস্টমাইজেশন বিকল্প দেয়। এই কাজের সময়, আপনি শিখবেন কিভাবে আপনার ডিমের টাইমার বিজ্ঞপ্তিগুলি কাস্টমাইজ করবেন।

ধাপ 1: আপনার বিজ্ঞপ্তি স্টাইল করুন

আপনার চাহিদা এবং বিজ্ঞপ্তি বিষয়বস্তু অনুযায়ী আপনার বিজ্ঞপ্তি স্টাইল করা আপনার বিজ্ঞপ্তিগুলিকে আলাদা করে তুলবে এবং আপনার অ্যাপ্লিকেশনের একটি এক্সটেনশনের মতো দেখাবে৷ বিজ্ঞপ্তি ফ্রেমওয়ার্ক সাহায্য করার জন্য বেশ কয়েকটি অন্তর্নির্মিত শৈলীর সাথে আসে এবং আপনি সর্বদা নিজের তৈরি করতে পারেন।

NotificationCompat এর জন্য অন্তর্নির্মিত শৈলী অফার করে:

  • BigTextStyle , যা পাঠ্যের একটি বড় ব্লক প্রদর্শন করতে পারে, যেমন প্রসারিত হলে একটি ইমেলের বিষয়বস্তু দেখানো।
  • BigPictureStyle , যা বড়-ফরম্যাট বিজ্ঞপ্তিগুলি দেখায় যাতে একটি বড় ছবি সংযুক্তি অন্তর্ভুক্ত থাকে।
  • InboxStyle , যা একটি কথোপকথন শৈলী পাঠ্য সামগ্রী দেখায়৷
  • MediaStyle , যা মিডিয়া প্লেব্যাকের জন্য নিয়ন্ত্রণ দেখায়।
  • MessagingStyle , যা বৃহৎ-ফরম্যাটের বিজ্ঞপ্তিগুলি দেখায় যা যে কোনও সংখ্যক লোকের মধ্যে একাধিক বার্তা অন্তর্ভুক্ত করে।

আপনি একটি প্রসারণযোগ্য বিজ্ঞপ্তি তৈরি করার জন্য ডকুমেন্টেশনে অন্যান্য শৈলী সম্পর্কে আরও তথ্য পেতে পারেন। এই ধাপে আপনি NotificationCompat.BigPictureStyle ব্যবহার করবেন একটি প্রসারণযোগ্য বিজ্ঞপ্তি তৈরি করতে যা প্রসারিত হলে একটি বড় ডিমের ছবি দেখায়।

  1. NotificationUtils.kt খুলুন এবং sendNotification() ফাংশন খুঁজুন।
  2. BitmapFactory ব্যবহার করে resources থেকে একটি ছবি লোড করে শুরু করুন।
// NotificationUtils.kt

// TODO: Step 2.0 add style
val eggImage = BitmapFactory.decodeResource(
     applicationContext.resources, 
     R.drawable.cooked_egg
)
  1. একটি নতুন BigPictureStyle তৈরি করুন এবং আপনার ছবি সেট করুন।
  2. bigLargeIcon() কে null সেট করুন যাতে বিজ্ঞপ্তিটি প্রসারিত হলে বড় আইকনটি চলে যায়।
// NotificationUtils.kt

// TODO: Step 2.0 add style
val eggImage = BitmapFactory.decodeResource(
     applicationContext.resources, 
     R.drawable.cooked_egg
)
val bigPicStyle = NotificationCompat.BigPictureStyle()
        .bigPicture(eggImage)
        .bigLargeIcon(null)
  1. setStyle() দিয়ে স্টাইলটিকে bigPicStyle এ সেট করুন।
  2. setLargeIcon() সহ বড় আইকনটি eggImage এ সেট করুন, যাতে নোটিফিকেশন বন্ধ হয়ে গেলে ছবিটি একটি ছোট আইকন হিসেবে প্রদর্শিত হবে।
// NotificationUtils.kt
// TODO: Step 2.1 add style to builder
.setStyle(bigPicStyle)
.setLargeIcon(eggImage)
  1. অ্যাপটি চালান এবং একটি টাইমার সেট করুন। যখন বিজ্ঞপ্তিটি প্রথম দেখানো হয়, তখন এটি বিজ্ঞপ্তির ড্রয়ারে ভেঙে পড়া অবস্থায় থাকে। আপনি বিজ্ঞপ্তি প্রসারিত করলে, বর্ধিত বিজ্ঞপ্তি এলাকায় একটি বড় ছবি দেখানো হয়।

ধাপ 2: বিজ্ঞপ্তি কর্ম

বিজ্ঞপ্তি অ্যাকশন হল আরেকটি কাস্টমাইজেশন যা আপনি আপনার বিজ্ঞপ্তিতে যোগ করতে পারেন। ব্যবহারকারীরা ক্লিক করলে আপনার বিজ্ঞপ্তিগুলি বর্তমানে আপনার অ্যাপে পুনঃনির্দেশিত হয়। এই ডিফল্ট বিজ্ঞপ্তি অ্যাকশন ছাড়াও, আপনি অ্যাকশন বোতাম যোগ করতে পারেন যা বিজ্ঞপ্তি থেকে একটি অ্যাপ-সম্পর্কিত কাজ সম্পূর্ণ করে।

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

একটি অ্যাকশন বোতাম যোগ করতে, addAction() এ একটি PendingIntent পাস করুন নির্মাতার উপর ফাংশন। এটি setContentIntent() কল করে বিজ্ঞপ্তির ডিফল্ট ট্যাপ অ্যাকশন সেট আপ করার মতো, কোনো অ্যাক্টিভিটি চালু করার পরিবর্তে, আপনি অন্যান্য বিভিন্ন জিনিস করতে পারেন, উদাহরণস্বরূপ, একটি BroadcastReceiver শুরু করুন যা ব্যাকগ্রাউন্ডে একটি কাজ করে যাতে অ্যাকশনটি হয় ইতিমধ্যে খোলা অ্যাপটিকে বাধা দেবেন না।

এই কোডল্যাবে, আপনাকে ইতিমধ্যেই BoadcastReceiver নামে একটি SnoozeReceiver দেওয়া হয়েছে। নোটিফিকেশন অ্যাকশনে ব্যবহারকারীর ক্লিক পাওয়ার জন্য আপনি SnoozeReceiver ব্যবহার করবেন। নিম্নলিখিত ধাপে আপনি যখন ব্যবহারকারী স্নুজ অ্যাকশন বোতামে ক্লিক করবেন তখন 60 সেকেন্ডের জন্য ডিম টাইমার বিজ্ঞপ্তিটি স্নুজ করার জন্য কোড যোগ করবেন। যখন স্নুজ অ্যাকশনটি ক্লিক করা হয়, তখন SnoozeReceiver একটি অভিপ্রায় পাবে এবং 60 সেকেন্ড পরে একটি নতুন বিজ্ঞপ্তি পাঠানোর জন্য একটি নতুন অ্যালার্ম তৈরি করবে৷

  1. SnoozeReceiver.kt খুলুন। এই ক্লাসটি AlarmReceiver এর মত যা আপনি আগে ব্যবহার করেছেন। নিম্নলিখিত ধাপে আপনি কোড যোগ করবেন যা SnoozeReceiver এর onReceive() ফাংশনকে ট্রিগার করবে। সংক্ষেপে, SnoozeReceiver এর কোডটি এক মিনিট পরে একটি নতুন বিজ্ঞপ্তি পাঠানোর জন্য একটি নতুন অ্যালার্ম তৈরি করবে৷ অনরিসিভ ফাংশনের নীচে স্ক্রোলডাউন করুন, সিস্টেম থেকে নোটিফিকেশন ম্যানেজারের একটি উদাহরণ পান এবং সমস্ত বাতিল করুন।
// SnoozeReceiver.kt
        val notificationManager = ContextCompat.getSystemService(
            context,
            NotificationManager::class.java
        ) as NotificationManager
        notificationManager.cancelAll()
  1. SnoozeReceiver ব্যবহার করার জন্য, NotificationUtils.kt খুলুন।
  2. SnoozeReceiver-এর জন্য SnoozeReceiver sendNotification() ফাংশনের স্টাইলের ঠিক পরে একটি নতুন Intent snoozeIntent তৈরি করুন।
  3. PendingIntent-এ PendingIntent getBroadcast() পদ্ধতিতে কল করে একটি মুলতুবি অভিপ্রায় তৈরি করুন যা নিম্নলিখিত ধাপে পরামিতিগুলি আশা করে। এই PendingIntent টি ব্যবহারকারী দ্বারা স্নুজ বোতামটি ট্যাপ করার পরে 60 সেকেন্ড পরে একটি নতুন বিজ্ঞপ্তি পোস্ট করার জন্য একটি নতুন অ্যালার্ম সেট আপ করতে সিস্টেম দ্বারা ব্যবহার করা হবে।
  4. প্রথম প্যারামিটার হল অ্যাপ্লিকেশনের প্রসঙ্গ যেখানে এই PendingIntent এর কার্যকলাপ শুরু করা উচিত।
  5. দ্বিতীয় প্যারামিটার হল অনুরোধ কোড, যা এই মুলতুবি অভিপ্রায়ের জন্য অনুরোধ কোড। আপনি যদি এই মুলতুবি অভিপ্রায় আপডেট বা বাতিল করতে চান, তাহলে মুলতুবি অভিপ্রায় অ্যাক্সেস করতে আপনাকে এই কোডটি ব্যবহার করতে হবে।
  6. এরপরে, snoozeIntent অবজেক্ট যোগ করুন, যা চালু করা কার্যকলাপের উদ্দেশ্য।
  7. সবশেষে, #FLAG_ONE_SHOT এর ফ্ল্যাগ মান যোগ করুন কারণ উদ্দেশ্যটি শুধুমাত্র একবার ব্যবহার করা হবে। দ্রুত অ্যাকশন এবং বিজ্ঞপ্তিটি প্রথম ট্যাপের পরে অদৃশ্য হয়ে যাবে যার কারণে অভিপ্রায়টি শুধুমাত্র একবার ব্যবহার করা যেতে পারে।
// NotificationUtils.kt

// TODO: Step 2.2 add snooze action
val snoozeIntent = Intent(applicationContext, SnoozeReceiver::class.java)
val snoozePendingIntent: PendingIntent = PendingIntent.getBroadcast(
    applicationContext, 
    REQUEST_CODE, 
    snoozeIntent, 
    FLAGS
)
  1. এরপর, notificationBuilder addAction() ফাংশনটি কল করুন। এই ফাংশনটি একটি আইকন এবং একটি পাঠ্য ব্যবহারকারীর কাছে আপনার ক্রিয়া বর্ণনা করার আশা করে৷ এছাড়াও আপনাকে snoozeIntent যোগ করতে হবে। যখন আপনার অ্যাকশনটি ক্লিক করা হয় তখন এই উদ্দেশ্যটি সঠিক boadcastReceiver ট্রিগার করতে ব্যবহার করা হবে।
// NotificationUtils.kt
// TODO: Step 2.3 add snooze action
.addAction(
    R.drawable.egg_icon, 
    applicationContext.getString(R.string.snooze),
    snoozePendingIntent
)
  1. স্নুজ অ্যাকশন পরীক্ষা করতে ডিম টাইমার অ্যাপটি চালান।
  2. টাইমার চালান এবং অ্যাপটিকে ব্যাকগ্রাউন্ডে রাখুন। একবার টাইমার আপ হয়ে গেলে, বিজ্ঞপ্তিটি প্রসারিত করুন এবং আপনি দেখতে পাবেন যে বিজ্ঞপ্তিটিতে এখন একটি স্নুজ অ্যাকশন বোতাম রয়েছে যা ডিম টাইমারটিকে আরও এক মিনিটের জন্য স্নুজ করে।

ধাপ 3: বিজ্ঞপ্তির গুরুত্ব

গুরুত্ব নির্ধারণ করে যে বিজ্ঞপ্তিটি ব্যবহারকারীকে দৃশ্যত এবং শ্রুতিমধুরভাবে কতটা বাধা দেবে। উচ্চ গুরুত্ব সহ বিজ্ঞপ্তিগুলি ব্যবহারকারীদের জন্য আরও বাধাগ্রস্ত হবে।

NotificationChannel কন্সট্রাক্টরে আপনাকে অবশ্যই গুরুত্বের স্তর উল্লেখ করতে হবে। আপনি মূলত ডিম টাইমার অ্যাপের জন্য কম গুরুত্ব সেট করেছেন। আপনি IMPORTANCE_NONE(0) থেকে IMPORTANCE_HIGH(4) পর্যন্ত পাঁচটি গুরুত্ব স্তরের একটি ব্যবহার করতে পারেন৷ আপনি একটি চ্যানেলে যে গুরুত্ব প্রদান করেন তা আপনি এটিতে পোস্ট করা সমস্ত বিজ্ঞপ্তি বার্তাগুলিতে প্রযোজ্য।

চ্যানেলের গুরুত্বের মাত্রা

ব্যবহারকারী-দৃশ্যমান গুরুত্ব স্তর

গুরুত্ব (Android 8.0 এবং উচ্চতর)

অগ্রাধিকার (Android 7.1 এবং নিম্ন)

একটি শব্দ করে এবং একটি হেড-আপ বিজ্ঞপ্তি হিসাবে উপস্থিত হয় (স্ক্রীনের শীর্ষে পপ আপ হয়)

IMPORTANCE_HIGH

PRIORITY_HIGH / PRIORITY_MAX

শব্দ করে

IMPORTANCE_DEFAULT

PRIORITY_DEFAULT

কোন শব্দ নেই

IMPORTANCE_LOW

PRIORITY_LOW

কোন শব্দ নেই এবং স্ট্যাটাস বারে উপস্থিত হয় না

IMPORTANCE_MIN

PRIORITY_MIN

একটি উপযুক্ত অগ্রাধিকার স্তর নির্বাচন করার বিষয়ে তথ্যের জন্য, বিজ্ঞপ্তি ডিজাইন গাইডে "অগ্রাধিকার স্তর" দেখুন। আপনার অ্যাপে বিজ্ঞপ্তিগুলির জন্য একটি গুরুত্বের স্তর নির্বাচন করার সময় আপনার সতর্ক হওয়া উচিত। ব্যবহারকারীর সময় এবং মনোযোগ বিবেচনা করে চ্যানেলের গুরুত্ব নির্বাচন করা উচিত। যখন একটি গুরুত্বহীন বিজ্ঞপ্তি জরুরী হিসাবে ছদ্মবেশিত হয়, তখন এটি অপ্রয়োজনীয় অ্যালার্ম তৈরি করতে পারে এবং বিভ্রান্তিকর হতে পারে। ব্যবহারকারীদের তাদের বিজ্ঞপ্তিগুলির গুরুত্বের স্তরের উপর সম্পূর্ণ নিয়ন্ত্রণ রয়েছে, তাই আপনি যদি একটি বিরক্তিকর বিজ্ঞপ্তি তৈরি করেন তবে তারা আপনার বিজ্ঞপ্তি চ্যানেল সম্পূর্ণরূপে বন্ধ করে দিতে পারে৷

আপনি যখন প্রথম ধাপ 1.6-এ বিজ্ঞপ্তি তৈরি করেছিলেন, তখন ডিম টাইমারটি কম অগ্রাধিকারের সাথে বিজ্ঞপ্তি পাঠাতে সেট করা হয়েছিল কারণ এটি ব্যবহারকারীকে বিজ্ঞপ্তি দিয়ে বিরক্ত না করার জন্য ডিজাইন করা হয়েছিল। যাইহোক, ডিম বেশি রান্না করার আগে ব্যবহারকারীর দৃষ্টি আকর্ষণ করা একটি ভাল ধারণা হতে পারে। বিজ্ঞপ্তির গুরুত্বের স্তর পরিবর্তন করতে, চ্যানেল সেটিংস দিয়ে শুরু করুন। চ্যানেলের গুরুত্ব চ্যানেলে পোস্ট করা সমস্ত বিজ্ঞপ্তির বাধা স্তরকে প্রভাবিত করে, এবং অবশ্যই NotificationChannel কনস্ট্রাক্টরে উল্লেখ করতে হবে।

  1. আপনার অ্যাপের বিজ্ঞপ্তি চ্যানেলের গুরুত্বের স্তর পরিবর্তন করতে, EggTimerFragment.kt খুলুন এবং createChannel() নেভিগেট করুন। গুরুত্বের মাত্রা IMPORTANCE_LOW IMPORTANCE_HIGH পরিবর্তন করুন।
// EggTimerFragment.kt
    val notificationChannel = NotificationChannel(
        channelId,
        channelName,
        // TODO: Step 2.4 change importance
        NotificationManager.IMPORTANCE_HIGH
    )

Android 7.1 (API লেভেল 25) বা তার নিচে চলমান ডিভাইসগুলিকে সমর্থন করতে, আপনাকে অবশ্যই NotificationCompat ক্লাস থেকে একটি অগ্রাধিকার ধ্রুবক ব্যবহার করে প্রতিটি বিজ্ঞপ্তির জন্য setPriority() কল করতে হবে।

  1. NotificationUtils.kt খুলুন এবং বিজ্ঞপ্তি বিল্ডার অবজেক্টে নিম্নলিখিত যোগ করুন।
// NotificationUtils.kt
   .addAction(
       R.drawable.common_google_signin_btn_icon_dark,
       applicationContext.getString(R.string.snooze),
       snoozePendingIntent
    )
   // TODO: Step 2.5 set priority
    .setPriority(NotificationCompat.PRIORITY_HIGH)
  1. অ্যাপটি চালানোর আগে, আপনার ডিভাইস বা এমুলেটরের অ্যাপ আইকনে দীর্ঘক্ষণ ক্লিক করুন এবং পূর্ববর্তী চ্যানেল সেটিংস সাফ করতে আনইনস্টল নির্বাচন করুন। আপনি অ্যাপটি আনইনস্টল করতে ব্যর্থ হলে, চ্যানেলের অগ্রাধিকার সেটিংস পরিবর্তন হবে না এবং এর ফলে বিজ্ঞপ্তি পোস্ট করার সময় কোনো আচরণ পরিবর্তন হবে না।
  2. এখন আবার অ্যাপটি চালান এবং টাইমার চালু করুন। এই সময়, যখন বিজ্ঞপ্তি বিতরণ করা হয়, আপনার অ্যাপটি অগ্রভাগে বা ব্যাকগ্রাউন্ডে চলছে কিনা তা নির্বিশেষে আপনি পর্দার শীর্ষে একটি পপআপ দেখতে পাবেন।

ধাপ 4: বিজ্ঞপ্তি ব্যাজ

বিজ্ঞপ্তি ব্যাজ হল ছোট বিন্দু যা সংশ্লিষ্ট অ্যাপের লঞ্চার আইকনে প্রদর্শিত হয় যখন অ্যাপটিতে একটি সক্রিয় বিজ্ঞপ্তি থাকে। ব্যবহারকারীরা বিজ্ঞপ্তি প্রকাশ করতে অ্যাপ আইকনে দীর্ঘক্ষণ চাপ দিতে পারেন।

এই বিন্দুগুলি, যাকে ব্যাজ বলা হয়, ডিফল্টরূপে প্রদর্শিত হয় এবং আপনার অ্যাপের কিছু করার দরকার নেই৷ যাইহোক, এমন পরিস্থিতি হতে পারে যেখানে ব্যাজগুলি আপনার বিজ্ঞপ্তিগুলির জন্য অর্থপূর্ণ নয়, তাই আপনি আপনার NotificationChannel অবজেক্টে setShowBadge(false) কল করে প্রতি-চ্যানেল ভিত্তিতে সেগুলিকে নিষ্ক্রিয় করতে পারেন৷ যেহেতু ডিম টাইমারে একটি নির্দিষ্ট সময়ে শুধুমাত্র একটি সক্রিয় বিজ্ঞপ্তি থাকে, তাই আপনার অ্যাপ আইকনের ব্যাজটি আপনার ব্যবহারকারীদের জন্য খুব বেশি সুবিধা দেয় না। নিম্নলিখিত ধাপে আপনি ব্যাজ নিষ্ক্রিয় করবেন এবং শুধুমাত্র ডিম টাইমারের জন্য একটি বিজ্ঞপ্তি দেখাবেন।

  1. ব্যাজ নিষ্ক্রিয় করতে ডিম টাইমারের জন্য চ্যানেল তৈরির কোডে setShowBadge(false) যোগ করুন।
// EggTimerFragment.kt

    ).apply {
        // TODO: Step 2.6 disable badges for this channel
        setShowBadge(false)
    }
  1. অ্যাপটি আবার চালান, টাইমার শুরু করুন এবং অ্যাপ আইকনটি দেখুন। আপনি অ্যাপ আইকনে কোনো ব্যাজ দেখতে পাবেন না।

সমাধান কোডটি আপনার ডাউনলোড করা কোডের মাস্টার শাখায় রয়েছে

  • ব্যবহার করে একটি বিজ্ঞপ্তি তৈরি, পাঠাতে, আপডেট করতে এবং বাতিল করতে NotificationManager ক্লাস ব্যবহার করুন।
  • বিজ্ঞপ্তির জন্য একটি চ্যানেল সেট করতে createNotificationChannel পদ্ধতি সহ একটি NotificationChannel অবজেক্ট ব্যবহার করুন।
  • একটি বিজ্ঞপ্তিতে দ্রুত অ্যাকশন যোগ করতে addAction() ব্যবহার করুন।
  • ব্যাজ সক্ষম বা নিষ্ক্রিয় করতে setShowBadge() ব্যবহার করুন,
  • Notification.Style থেকে প্রসারিত শৈলী ব্যবহার করে আপনার বিজ্ঞপ্তি স্টাইল করুন
  • NotificationChannel.setImportance() দিয়ে গুরুত্বের স্তর সেট করুন

উদাসীনতা কোর্স:

অ্যান্ড্রয়েড বিকাশকারী ডকুমেন্টেশন:

এই কোর্সে অন্যান্য কোডল্যাবগুলির লিঙ্কগুলির জন্য, কোটলিন কোডল্যাবগুলির ল্যান্ডিং পৃষ্ঠাতে উন্নত Android দেখুন৷