نوتیفیکیشن های اندروید برای توسعه دهندگان — به زبان ساده
اعلان یا «نوتیفیکیشن» (Notification) یکی از سریعترین و آسانترین روشها برای افزایش تعاملپذیری و جذب کاربر به اپلیکیشن محسوب میشود. نوتیفیکیشن، چکیده کوتاهی از اطلاعاتی که کاربر باید در لحظه جاری بداند را در اختیار وی قرار میدهد. نوتیفیکیشنها همچنین به کاربران امکان میدهند که در برابر رویدادهای مختلف به سرعت اقداماتی اتخاذ کنند. ما در این نوشته به بررسی مثالهای پر استفاده از نوتیفیکیشن اندروید میپردازیم تا بتوانید در کمترین زمان ممکن به کاربران خود اطلاعرسانی کنید.
ساخت یک نوتیفیکیشن اندروید
نخستین گام برای نمایش یک نوتیفیکیشن برای کاربر، ساخت یک «شیء نوتیفیکیشن» است. نوتیفیکیشن با استفاده از یک NotificationCompat.Builder ساخته میشود. کمینه اطلاعاتی که برای نمایش یک نوتیفیکیشن مورد نیاز است صرفاً شامل یک آیکون کوچک میشود. این همه موارد ضروری را شامل میشود؛ اما چندان مفید نیست. نوتیفیکیشنها باید برای کاربر مفید باشند و از این رو عموماً شامل یک عنوان و متن هستند.
در ادامه نموداری از یک نوتیفیکیشن معمول را میبیند که بخشهای مهم توضیح داده شدهاند.
- آیکون کوچک در «نوار وضعیت» (status bar) نمایش مییابد و لازم است بدانید که رنگ آن در زمان نمایش ترسیم میشود. دلیل این مسئله آن است که این آیکون باید کانال آلفا داشته باشد، چون اگر چنین نباشد، در نهایت به جای رنگ خاص برندتان با یک آیکون سفید در نوار وضعیت مواجه خواهید شد.
- عنوان محتوا نیز مهم است. این عنوان باید توصیفی کوتاه از آن چه نوتیفیکیشن نمایش میدهد باشد.
- متن اصلی محتوا جزییات نسبتاً بیشتری از نوتیفیکیشن ارائه میکند. در مورد میزان حجم متنی که در بدنه محتوا قرار میدهید باید هوشیار باشید، چون به طور معمول از یک خط متن در این مکان استفاده میشود.
- آیکون بزرگ یک فایل «نقشهبیتی» (Bitmap) است که به نوتیفیکیشن مربوط میشود. این فایل میتواند هر چیزی مانند یک تصویر پروفایل باشد.
کد مورد نیاز نسبتاً ساده است و اگر بخواهید آن را به صورت تجمیع شده ببینید به صورت زیر خواهد بود:
1val notification = NotificationCompat.Builder(context, CHANNEL_ID)
2 .setSmallIcon(R.drawable.ic_announcement)
3 .setContentTitle(title)
4 .setContentText(body)
5 .build()
نمایش یک نوتیفیکیشن
اکنون که نوتیفیکیشن ما ساخته شده است باید روشی برای نشان دادن آن بیابیم. اندروید یک سرویس سیستمی برای نمایش نوتیفیکیشن به کاربر ارائه میکند. این سرویس با نام NotificationManagerCompat به اپلیکیشن امکان میدهد که به کاربر اعلانی را نمایش دهد. بدین منظور باید از یک notificationId و نوتیفیکیشنی که ساختهایم استفاده کنیم.
1with(NotificationManagerCompat.from(context)) {
2 if (getNotificationChannel(CHANNEL_ID) == null) {
3 createNotificationChannel(context)
4 }
5 notify(notificationId, builder.build())
6}
همان طور که میبینید در کد فوق، مقداری بررسیهای بیشتر نیز وجود دارد که شامل بررسی وجود یک کانال نوتیفیکیشن است.
کانالها و اهمیتشان
کانالها در اندروید نسخه Oreo معرفیشدهاند و به کاربران امکان میدهند که در مورد اعلانهایی که اپلیکیشنها نمایش میدهند، دست به انتخاب بزنند. ما به عنوان توسعهدهندگان اپلیکیشن باید اعلانهای خود را بر اساس موضوعاتشان دستهبندی کنیم. اگر یک اپلیکیشن تنها از یک کانال برای نمایش همه نوتیفیکیشنهایش استفاده کند، کاربر در صورت مسدود شدن آن کانال، نمیتواند تصمیم بگیرد که کدام نوتیفیکیشنها را میخواهد ببینید یا نبیند. در این حالت کاربر هیچ نوتیفیکیشنی از اپلیکیشن دریافت نخواهد کرد.
1fun createNotificationChannel(context: Context) {
2 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
3 val name = context.getString(R.string.channel_name)
4 val descriptionText = context.getString(R.string.channel_description)
5 val importance = NotificationManager.IMPORTANCE_HIGH
6 val channel = NotificationChannel(CHANNEL_ID, name, importance).apply {
7 description = descriptionText
8 }
9 NotificationManagerCompat.from(context).createNotificationChannel(channel)
10 }
11}
کانال باید اطلاعات زیر را داشته باشد:
- ID – یک شناسه برای کانال است که میتواند یک ثابت رشتهای در اپلیکیشن باشد.
- Name – نام کانال که باید نوع نوتیفیکیشنی که کانال ارائه میکند را به اطلاع کاربر برساند. این متغیر میتواند کوتاه و ساده باشد مثلاً «Messages» بدین منظور مناسب است.
- Importance – سطح اهمیت نوتیفیکیشن را میتوان به صورت High ،Default ،Low یا Min تعیین کرد. میزان اهمیتی که تعیین میکنید، در واقع بیانگر سطح دخالت نوتیفیکیشن در زمان اطلاعرسانی به کاربر خواهد بود.
- Description – این توضیح در منوی تنظیمات اندروید نمایش مییابد و باید جزییات بیشتری در مورد این کانال نمایش دهد.
پاسخ دادن به اقدامهای کاربر
هر کاربر چندین روش برای تعامل با یک نوتیفیکیشن دارد. خوشبختانه API مورد نیاز برای مدیریت چگونگی تعامل با نوتیفیکیشنها نسبتاً مشابه است. در این موارد از Intent و PendingIntent برای بازگشت دادن اقدامهای کاربر به اپلیکیشن استفاده میشود و بدین ترتیب امکان اعمال نوعی منطق پدید میآید.
سادهترین روش برای مدیریت حجم بالایی از نوتیفیکیشنها، استفاده از یک BroadcastReceiver است. زمانی که کاربر، اقدامی روی یک نوتیفیکیشن صورت میدهد، Intent مربوطه پیدا میشود و متد onReceive در BroadcastReceiver اجرا میشود.
1val builder = NotificationCompat.Builder(context, CHANNEL_ID)
2 ...
3 .setContentIntent(onContentTapped /** Pending intent */)
4 .setDeleteIntent(onSwipedAway /** Pending intent */)
5 .addAction(
6 R.drawable.ic_announcement,
7 actionTitle,
8 onActionTapped /** Pending intent */
9 )
- ContentIntent زمانی اجرا میشود که کاربر روی نوتیفیکیشن بزند. لازم به ذکر است که نوتیفیکیشن تا زمانی که متد (setAutoCancel(true هم روی نوتیفیکیشن فراخوانی نشده باشد، پاک نمیشود.
- DeleteIntent زمانی اجرا میشود که کاربر نوتیفیکیشن را به یکی از دو طرف سوایپ کند.
- Action-ها دکمههایی در انتهای نوتیفیکیشن هستند. اکشنها نیز به آیکون و عنوان نیاز دارند.
برای ایجاد یک BroadcastReceiver باید کلاس BroadcastReceiver را بسط دهیم و متد onReceive را override کنیم. فراموش نکنید که Receiver را در فایل AndroidManifest.xml نیز اعلان کنید.
1class NotificationBroadcastReceiver : BroadcastReceiver() {
2
3 override fun onReceive(context: Context, intent: Intent) {
4 val action = intent.action
5
6 when (action) {
7 ACTION_ONE -> {
8 Toast.makeText(context, "Action One hit!", Toast.LENGTH_SHORT).show()
9 }
10 ACTION_TWO -> {
11 Toast.makeText(context, "Action Two hit!", Toast.LENGTH_SHORT).show()
12 }
13 }
14 }
15
16}
17object NotificationController {
18 fun pendingIntent(context: Context, name: String, extras: Bundle?): PendingIntent {
19 val intent = Intent(context, NotificationBroadcastReceiver::class.java).apply {
20 action = name
21 putExtra(EXTRA_NOTIFICATION_ID, extras)
22 }
23
24 return PendingIntent.getBroadcast(context, 0, intent, 0)
25 }
26}
سخن پایانی
NotificationController یک ابزار سریع جهت ایجاد PendingIntent برای نوتیفیکیشنها محسوب میشود. مهمترین نکته این است که اقدامهایی با نام متفاوت، برای مدیریت صحیح شیوه تعامل کاربر با نوتیفیکیشنها ایجاد کنیم. ضمناً اگر قصد دارید یک Activity را از BroadcastReceiver اجرا کنید باید از IntentFlag به نام NEW_TASK استفاده کنید. Intent-ها را میتوان در BroadcastReceiver-های مختلف نیز ثبت کرد و از این رو میتوانید دامنه آن را به یک BroadcastReceiver برای هر نوع نوتیفیکیشن محدود کنید.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزش های برنامه نویسی اندروید
- گنجینه برنامه نویسی اندروید (Android)
- مجموعه آموزش های برنامه نویسی
- آموزش برنامه نویسی اندروید (Android) – مقدماتی
- آموزش برنامه نویسی اندروید (Android) – تکمیلی
- ارسال پوش نوتیفیکیشن از اپلیکیشن های جنگو (Django) — از صفر تا صد
- آموزش ساخت اپلیکیشن اندروید (Android) با PHP و MySQL
==
سلام من یه سوال داشتم
میخواستم یک نوتیفیکیشن به صورت روزانه ارسال بشه و وقتی روی اون کلیک شد یه اکتیویتی رو باز کنه که عکس یا متن اون اکتیویتی به صورت روازنه تغییر کنه
واقعا در حد فوق العاده ایی کامل و رسا بود .دمت گرم آقای لطفی
نوتیفکیشین هایی مثل تپسی که برای کاربر خاصی ارسال میشود چطوذی کدنویسی میشوند؟؟
سلام و وقت بخیر
ابتدا باید اشاره کنیم که ارسال نوتیفیکشن برای پلتفرمهای مختلف از قبیل اندروید، iOS یا وب، شرایط و الزامات متفاوتی دارد، اما به طور کلی در همه پلتفرمها در زمان ثبت کاربر، دستگاه مورد استفاده (Device ID) نیز ذخیره میشود. لذا زمانی که میخواهیم یک اعلان سفارشی برای یک کاربر بفرستیم، در بکاند از این شناسه دستگاه برای ارسال خاص به آن کاربر بهره میگیریم.
با تشکر.