کار با نوتیفیکیشن ها (Notifications )در اندروید

ساخت Notification ساده در اندروید

نوتیفیکیشن در اندروید در حالت‌های مختلفی قابل پیاده سازی و اجراست. از یک Notification ساده شامل یک عنوان و متن و آیکون کوچک تا یک پیغام که دارای یک تصویر بزرگ، تعدادی دکمه (اکشن) و… است. در ادامه سری مباحث آموزش برنامه نویسی اندروید در این مبحث به آموزش ساخت نوتیفیکیشن (Notification) در اندروید می‌پردازیم.

نوتیفیکیشن یا Notification چیست؟

به نام خدا. نوتیفیکِیشِن یک اعلان یا پیغام است که به جهت یاداوری، هشدار یا اطلاع رسانی یک رویداد به کاربر نمایش داده می‌شود. این اعلان ابتدا در قالب یک آیکون در قسمت نوار وضعیت یا همان Status Bar ظاهر می‌گردد که کاربر با کشیدن نوار به پایین و باز شدن Notification Drawer، نوتیفیکیشن(های) ساخته شده توسط اپلیکیشن‌ها را مشاهده می‌کند.

قطعا همه ما روزانه با تعداد زیادی از این اعلان‌ها در دیوایس اندرویدی خود سروکار داریم. Notification ها در محیط خارج از رابط کاربری برنامه ساخته می‌شوند. بنابراین این اعلان‌ها می‌توانند در هر زمانی ساخته شوند. حتی هنگامی که برنامه در حال اجرا نیست.
به عنوان مثال شما در حال تماشای یک ویدئو هستید و یک اعلان مشاهده می‌کنید که به شما اطلاع می‌دهد یک SMS دریافت شده. یا در حال وب گردی هستید و آیکون Instagram را در نوار وضعیت مشاهده می‌کنید که با کشیدن نوار به پایین، پیغامی مبنی بر درخواست فالو (Follow) از جانب یک شخص نشان داده می‌شود. یا اعلان‌های تبلیغاتی که کاربر را به خرید یک محصول یا ارتقاء برنامه از نسخه رایگان به نسخه تجاری ترغیب می‌کند.
بنابراین نوتیفیکیشن در اندروید و سایر سیستم عامل‌ها کاربرد بسیار گسترده‌ای داشته و بسته به هدف و نیاز، در فرمت‌ها و قالب‌های متعددی می‌توان آنها را اجرا کرد. این پیغام‌ها حتی هنگامی که صفحه در حالت قفل (Lock screen) قرار دارد نیز امکان نمایش اطلاعات را دارند؛ مانند اعلان یک تقویم که تاریخ شمسی، میلادی و قمری را به ما نشان می‌دهد.

انواع نوتیفیکیشن‌ها در اندروید

نوتیفیکیشن در اندروید را به روش‌ها و حالت‌های مختلفی می‌توان پیاده سازی کرد. از یک اعلان ساده شامل عنوان و توضیحات گرفته تا یک اعلان پیچیده شامل تصویر، اکشن، استفاده از Style و… .
همچنین توسط PendingIntent می‌توانیم تعیین کنیم کاربر پس از لمس اعلان به کدام اکتیویتی از برنامه منتقل شود.
البته در این آموزش صرفا نحوه ساخت یک نوتیفیکیشن ساده را بررسی می‌کنیم. مباحث پیشرفته را در آموزش‌های بعد ارائه خواهم کرد.

ساختار نوتیفیکیشن اندروید

به نام خدا. قبل از ادامه مبحث ابتدا بهتر است ساختار نوتیفیکیشنی که در مبحث قبل ساختیم را مرور کنیم. هرکدام از اجزاء اعلان را به ترتیب شماره توضیح می‌دهم:

۱: آیکون کوچک (Small icon): این آیکون توسط setSmallIcon ساخته شده که تعریف آن برای نوتیفیکیشن الزامی است.
۲: در اینجا نام اپلیکیشنی که نوتیفیکیشن را اجرا کرده نمایش داده می‌شود.
۳: زمان ساخت نوتیفیکیشن را نشان می‌دهد. البته می‌توان این قسمت را به دلخواه تغییر داد و یا حذف کرد.
۴: آیکون بزرگ (Large icon): این آیکون توسط setLargeIcon ساخته شده و کاربرد آن نمایش یک آیکون یا تصویر بزرگ در کنار پیغام است.
۵: عنوان نوتیفیکیشن
۶: متن نوتیفیکیشن

انواع نوتیفیکیشن در اندروید

اعلان‌ها یا همان Notification را به روش‌های مختلفی می‌توان پیاده سازی کرد که هرکدام کاربرد مختص خود را داراست. یک نوتیفیکیشن صرفا پیام مختصری را به کاربر اطلاع می‌دهد. دیگری جزئیات بیشتری در اختیار کاربر قرار داده و او را به سمت یک اکتیویتی در اپلیکیشن و یا یک صفحه وب هدایت می‌کند. و انواع دیگری از نحوه ساخت و اجرای نوتیفیکیشن وجود دارد.

نوتیفیکیشن ساده (Simple Notification):

در قدم اول ساده ترین نوع از نوتیفیکیشن در اندروید را پیاده سازی می‌کنم تا با کلیّت کار آشنا شوید. ابتدا یک Button به activity_main.xml اضافه می‌کنم. برای مدیریت ساده‌تر دکمه‌ها لایه را به LinearLayout تغییر داده‌ام:

در ادامه کار، کدهایی که در فایل جاوای اکتیویتی نوشته‌ام را تشریح می‌کنم:

MainActivity.java:

داخل بدنه اصلی کلاس MainActivity یک Button با نام simpleButton و یک آبجکت از متد NotificationManager با نام notifManager جهت مدیریت نوتیفیکیشن ساخته‌ام. سپس این دو را درون متد onCreate کلاس تعریف کرده‌ام.
برای مرتب بودن کدها، کد مربوط به نوتیفیکیشن ساده را درون یک تابع جداگانه در بدنه اصلی کلاس تعریف کردم. من نام این متد را simpleNotification انتخاب کرده‌ام. برای ساخت محتوای نوتیفیکیشن لازم است تا از متد NotificationCompat.Builder یک آبجکت (شیء) بسازیم. من نام این شیء را sNotifBuilder تعیین کردم. پارامتر ورودی این متد، Context است که من this وارد نموده‌ام. سپس سه مورد از محتوای مدنظرم را به این آبجکت اضافه کرده‌ام:

  • setSmallIcon: آیکون نوتیفیکیشن توسط این متد تعیین می‌شود. من از آیکون‌های موجود در خود اندروید استودیو برای تست این ویژگی استفاده کردم. جهت استفاده از این آیکون‌ها روی پوشه drawable پروژه اندروید خود راست کلیک کرده، New > Vector Asset را انتخاب کنید. در صفحه‌ی باز شده یک آیکون انتخاب کرده و تایید کنید تا به drawable افزوده شود. یا از آیکون‌های خارج از اندروید استودیو استفاده کنید که کافیست فایل را کپی کرده و روی این پوشه paste کنید. من آیکون را با نام notif_icon به پروژه اضافه کردم و همانطور که مشاهده می‌کنید همین نام در ورودی setSmallIcon تعریف شده.
    • setContentTitle: از این متد برای تعیین عنوان پیغام استفاده می‌شود.
    • setContentText: همانطور که از نام آن پیداست برای نمایش متن پیغام بکار می‌رود.

    فعلا به همین سه مورد اکتفا می‌کنم.
    در خط آخر هم توسط متد notify دو ورودی به شیء ساخته شده از NotificationManager یعنی notifManager ارسال شده است. ورودی اول یک عدد صحیح است که در اینجا ۱ را انتخاب کردم. در ورودی دوم نیز سازنده‌ی نوتیفیکیشن یعنی sNotifBuilder را build می‌کنیم.

این یک نوتیفیکیشن بسیار ساده است.

مشاهده می‌کنید برای NotificationCompat.Builder گفته شده این Builder منقضی (deprecated) شده است. دلیل آن را در ادامه متن متوجه خواهید شد.

 

استفاده از PendingIntent و ساخت Action برای نوتیفیکیشن

نوتیفیکیشنی که قبلا ساختیم صرفا یک پیغام را به کاربر نمایش می‌دهد و غیر از بستن آن، کاربر هیچگونه تعاملی نمی‌تواند با این پیغام داشته باشد. در صورتی که ما به این تعامل نیاز داریم. اگر اعلان مربوط به یک تخفیف است، می‌بایست کاربر را به صفحه مرتبط با آن هدایت کند. در اینجا از pendingIntent استفاده می‌کنیم. قبلا با نحوه کار با intent در اندروید آشنا شدیم. حالا در نوتیفیکیشن هم با استفاده از اینتنت تعیین می‌کنیم بعد از لمس اعلان توسط کاربر، چه عملی صورت پذیرد.
پروژه را باز می‌کنم. ابتدا یک دکمه با عنوان PendingIntent Notification به Layout اکتیویتی اضافه می‌کنم:

فایل XML

فایل java

در کد فوق ابتدا PendingIntent_btn را به دکمه مربوطه در لِی اوت متصل کردم.

سپس یک شیء از Intent با نام mIntent ساختم:

به جهت ملموس بودن نتیجه کار، یک اکتیویتی با نام Secondactivity به پروژه اضافه کرده و به اینتنت معرفی کردم.

سپس با استفاده از متد PendingIntent و getActivity تعیین می‌کنم با لمس نوتیفیکیشن، pIntent اجرا شود. این متد ۴ پارامتر می‌گیرد که در جدول زیر معرفی شده:

اولی Context است که this وارد کردم. پارامتر دوم یک مقدار از جنس int است که به عنوان یک کد درخواست خصوصی تلقی می‌شود. من برای این نوتیفیکیشن مقدار ۰ قرار دادم. پارامتر سوم اینتنتی است که قبلا تعریف کردم یعنی pIntent. آخرین پارامتر یعنی flags جهت تعیین وضعیت اینتنت است که من در اینجا از نوع FLAG_UPDATE_CURRENT انتخاب کردم.

در قدم بعد یک تابع با نام pendingNotification به کلاس اضافه کردم.

توسط setContentIntent اینتنتی که قبلا ساختم را به نوتیفیکیشن معرفی می‌کنم.
در نهایت متد setOnClickListener مربوط به دکمه PendingIntent_btn را ساخته و توابع مرتبط با کانال و نوتیفیکیشن را فراخوانی می‌کنم. (برای سایر نوتیفیکیشن‌ها نیز همین مراحل تکرار می‌شود؛ یعنی اضافه کردن دکمه در Layout، ساخت متد setOnClickListener و فراخوانی توابع کانال و نوتیفیکیشن مربوط به آن درون این متد).
پروژه را اجرا کرده و روی دکمه PendingIntent Notification کلیک می‌کنم:

 

 

 

با کلیک روی نوتیفیکیشن، به اکتیویتی Secondactivity هدایت شدم. اما یک ایراد وجود دارد. به نوار وضعیت تصویر دوم دقت کنید. هنوز آیکون نوتیفیکیشن مشاهده می‌شود. یعنی با وجود اینکه کاربر روی نوتیفیکیشن کلیک کرده و به مقصد مدنظر منتقل شده، اعلان همچنان باقی مانده که لازم است این مشکل را رفع کنیم. اینکار توسط متد setAutoCancel انجام می‌پذیرد:

با اجرای مجدد پروژه، بعد از کلیک روی Notification، علاوه بر انتقال کاربر به صفحه Secondactivity نوتیفیکیشن نیز حذف می‌شود.
علاوه بر کلیک روی نوتیفیکیشن، می‌توان دکمه‌هایی به اعلان افزود که برای هرکدام نیز یک intent مجزا تعریف شده باشد. این دکمه‌ها یک Action می‌نامیم.
برای مثال، نوتیفیکیشن برنامه مدیریت پیامک عموما دو گزینه دارد. اولی Reply جهت پاسخ دادن به پیامک دریافتی و دومی Mark as read که با لمس این دکمه، پیامک از حالت “خوانده نشده” به “خوانده شده” تغییر وضعیت پیدا می‌کند.
من متد setContentIntent را غیرفعال کرده و بجای آن دو Action به نوتیفیکیشن اضافه می‌کنم:

addAction سه ورودی می‌گیرد:
ورودی اول: برای هر گزینه می‌توان یک آیکون تعریف کرد. البته توجه داشته باشید از اندروید Nougat به بعد برای سادگی بیشتر محیط نوتیفیکیشن، این آیکون‌ها نمایش داده نمی‌شوند.
ورودی دوم: عنوان اکشن است که برای اکشن اول “خرید” و اکشن دوم “جزئیات محصول” وارد کردم.
ورودی سوم: PendingIntent ای که قبلا تعریف شده.

مجدد پروژه را اجرا می‌کنم:

بوکزار

دو اکشن به انتهای نوتیفیکیشن اضافه شده ، که البته در این مثال هردو یک عملکرد دارند؛ یعنی هدایت به Secondactivity .
همانطور که قبلا اشاره کردم، از اندروید N و به بالاتر، آیکون گزینه‌ها نمایش داده نمی‌شود. اما روی دیوایس‌های پایین‌تر از این نسخه، آیکون‌ها در کنار عنوان دکمه وجود دارد.

نمایش متن طولانی در نوتیفیکیشن توسط BigTextStyle

گاهی اوقات لازم است متن طولانی تری در نوتیفیکیشن به کاربر نمایش دهیم. اگر برای متن طولانی از setContentText استفاده کنیم تنها چند کلمه ابتدای آن قابل مشاهده خواهد بود. اینجاست که استایل‌ها در نوتیفیکیشن امکان شخصی سازی بیشتری به ما می‌دهند. به کد زیر دقت کنید:

مانند قبل یک تابع جدید به کلاس اضافه کردم. نام این تابع را bigTextNotification گذاشتم.
در NotificationCompat امکان تعریف Style ها را داریم. در اینجا من از BigTextStyle یک شیء با نام bStyle ایجاد کرده‌ام که ۳ ویژگی برای آن تعریف شده.

مطالب بیشتر :

https://developer.android.com/guide/topics/ui/notifiers/notifications

https://developer.android.com/training/notify-user/build-notification

https://developer.android.com/training/notify-user/channels

 

 

مطالعه بیشتر