مقدمه‌ای بر ساخت نوتیفیکیشن

نوتیفیکیشن چه کاربردی دارد؟ هنگامی که از یک اپلیکیشن‌ استفاده نمی‌کنید، نوتیفیکیشن‌ها اطلاعات کوتاه و ضروری آن را در اختیار شما می‌گذارند. ساخت نوتیفیکیشن، از مهارت‌های اساسی در آموزش نوتیفیکیشن در اندروید است.

با ما همراه باشید تا ساخت یک نوتیفیکیشن را برای Android 4.0 (API level 14)  و بالاتر بیاموزید.

برای کد،از API‌های NotificationCompat موجود در کتابخانه پشتیبانی اندروید استفاده شده‌است.  بااین API‌ها می‌توانید خصوصیاتی را که تنها در ورژن‌های جدیدتر Android دیده می‌شوند، اضافه کنید. به‌ علاوه، این API ها با  Android 4.0 (API level 14) نیز سازگاری دارند.اگرچه این مشکل وجود دارد که بعضی از ویژگی‌های جدید مانند پاسخ درون خطی (Inline reply) در ورژن‌های قدیمی‎‌تر اندروید عمل نمی‌کنند.

مراحل زیر را به ترتیب انجام دهید تا نوتیفیکیشن خود را در اندروید بسازید.

اضافه کردن کتابخانه پشتیبانی اندروید

پروژه‌های Android studio معمولا دارای Dependency‌های لازم برای استفاده از  NotificationCompat هستند، اما اطمینان حاصل کنید که فایل build.gradle شما، Dependency‌ زیر را داشته باشد:

dependencies {
implementation "com.android.support:support-compat:28.0.0"
}

 

*توجه:  com.android.support، شامل Support-compat به عنوان یک  Dependency‌Transitive  است. پس اگر از سایر API‌های کتابخانه اندروید استفاده می‌کنید، ممکن است بدون دستورالعمل عینی  بالا به NotificationCompat دسترسی داشته باشید.

ساخت یک نوتیفیکیشن ساده ( Collapsed notification )

با کلیک   کاربران روی یک Push notification   که در قالب  عنوان یا آیکونی برای آن‌ها ظاهر شده است، اپلیکیشن راه‌اندازی می‌شود. اینجاست که کاربرد آموزش نوتیفیکیشن در اندروید روشن می‌شود. اگر ساخت ساده ترین فرم نوتیفیکیشن را بیاموزید، به راحتی توجه کاربر را به اپلیکیشن جلب خواهید‌ کرد.

در مراحل ساخت Basic notification با ما همراه باشید.

تنظیم محتوای نوتیفیکیشن

برای شروع، از notificationcompat.builder استفاده کنید تا محتوا و کانال نوتیفیکیشن را بسازید.

 

کاربرد کد مرحله
آیکون کوچک(تنها قسمت قابل مشاهده برای کابران) ()setsmallIcon ۱
عنوان ()setContentTitle ۲
متن بدنه ()setContentText ۳
اولویت پوش نوتیفیکیشن( تعیین کننده میزان سرزدگی آن در اندروید ۷٫۱ و بالاتر. برای اندروید ۸ و بالاتر از آن، باید Channel importance را آنگونه که در بخش بعدی توضیح داده شده است تنظیم کنید) ()setPriority ۴

 

مثال کد
Kotlin
var builder = NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle(textTitle)
        .setContentText(textContent)
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
Java
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle(textTitle)
        .setContentText(textContent)
        .setPriority(NotificationCompat.PRIORITY_DEFAULT);

 

توجه کنید که برای سازنده notificationcompat.builder ، باید از Channel ID استفاده کنید. البته این مورد فقط برای Android 8.0 (API level 26) و بالاتر کاربرد دارد و شامل ورژن های قدیمی تر Android نمی‌شود.

معمولا نوتیفیکشین به اندازه یک خط است. ولی اگر می‌خواهید متن نوتیفیکیشن شما طولانی تر باشد،از   ()setstyleاستفاده کنید.

مثال کد
Kotlin
var builder = NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Much longer text that cannot fit one line...")
        .setStyle(NotificationCompat.BigTextStyle()
                .bigText("Much longer text that cannot fit one line..."))
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
Java
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Much longer text that cannot fit one line...")
        .setStyle(new NotificationCompat.BigTextStyle()
                .bigText("Much longer text that cannot fit one line..."))
        .setPriority(NotificationCompat.PRIORITY_DEFAULT);

ساختن کانال و تنظیم اهمیت

قبل از ارائه نوتیفیکیشن  به Android 8.0 و بالاتر، برای هماهنگ کردن کانال نوتیفیکیشن اپ با سیستم، باید  NotificationChannel به ()Create NotificationChannelتغییر دهید.کدی که در ادامه مشاهده می‌کنید، در SDK_INT به دلیلی بلاک می‌شود.

مثال کد
Kotlin
private fun createNotificationChannel() {
    // Create the NotificationChannel, but only on API 26+ because
    // the NotificationChannel class is new and not in the support library
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        val name = getString(R.string.channel_name)
        val descriptionText = getString(R.string.channel_description)
        val importance = NotificationManager.IMPORTANCE_DEFAULT
        val channel = NotificationChannel(CHANNEL_ID, name, importance).apply {
            description = descriptionText
        }
        // Register the channel with the system
        val notificationManager: NotificationManager =
            getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
        notificationManager.createNotificationChannel(channel)
    }
}
Java
private void createNotificationChannel() {
    // Create the NotificationChannel, but only on API 26+ because
    // the NotificationChannel class is new and not in the support library
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        CharSequence name = getString(R.string.channel_name);
        String description = getString(R.string.channel_description);
        int importance = NotificationManager.IMPORTANCE_DEFAULT;
        NotificationChannel channel = new NotificationChannel(CHANNEL_ID, name, importance);
        channel.setDescription(description);
        // Register the channel with the system; you can't change the importance
        // or other notification behaviors after this
        NotificationManager notificationManager = getSystemService(NotificationManager.class);
        notificationManager.createNotificationChannel(channel);
    }
}

 

ابتدا باید  NotificationChannel ساخته شود و سپس نوتیفیکیشن‌ها روی Android 8.0 و بالاتر پست شوند. بنابراین،   زمانی که اپلیکیشن شما شروع به کار کرد، این کد را اجرا کنید. استفاده متعدد از این کد کاملا امن است، زیرا  با ساختن کانال نوتیفیکیشنی که از قبل وجود دارد، تغییری رخ نخواهد داد و سرویس پوش نوتیفیکیشن به درستی کار می‌کند.

سازنده NotificationChannel، نیاز به یک Importance دارد  باید از مقادیر ثابت موجود در NotificationManager  انتخاب شود. این پارامتر، تعیین می‌کند که کاربر چگونه از نوتیفیکیشن‌های کانال، آگاه شود. اگرچه همان‌طور که بالاتر گفتیم، برای Android 7.1 و پایین تر، باید از ()SetPriority استفاده کرد.

اولویت و اهمیت  سرویس Push notification، تنها با روش‌های گفته شده در آموزش نوتیفیکیشن در اندروید تنظیم نمی‎‌شود. سیستم، اولویت را به شکل بالا تضمین نمی‌کند و این مساله دو دلیل دارد. اول اینکه ممکن است سیستم، اولویت را بر اساس فاکتور‌های دیگر تغییر دهد. دوم اینکه خود کاربر به نتظیم اهمیت هر کانال نوتیفیکیشن دسترسی دارد.

تنظیم عملکرد ضربه‌ای در نوتیفیکیشن

کاربر اندروید باید بتواند با یک ضربه بر روی Push notification، وارد برنامه شود.   شما باید با استفاده از PendingIntent، محتوایی را مشخص کنید  و آن را به setContentIndent گذر دهید.  با کد زیر، شما امکان استفاده از ضربه را به کاربر می‌دهید.

// Create an explicit intent for an Activity in your app
val intent = Intent(this, AlertDetails::class.java).apply {
    flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK
}
val pendingIntent: PendingIntent = PendingIntent.getActivity(this, 0, intent, 0)

val builder = NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        // Set the intent that will fire when the user taps the notification
        .setContentIntent(pendingIntent)
        .setAutoCancel(true)
Java
// Create an explicit intent for an Activity in your app
Intent intent = new Intent(this, AlertDetails.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);

NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        // Set the intent that will fire when the user taps the notification
        .setContentIntent(pendingIntent)
        .setAutoCancel(true);

 

کد setAutoCancel ، نوتیفیکیشن را به صورت اتوماتیک، پس از ضربه کاربر، حذف خواهد کرد.

روش ()setFlags که در بالا از آن استفاده شده، کاربر را به مسیری که شما از پیش تعیین کرده‌اید هدایت می‌کند. استفاده از این روش، بستگی به این دارد که شما چه فعالیتی را برای کاربر در نظر گرفته اید. ممکن است این فعالیت، به طور خاص فقط پس از ضربه کاربر به روی پوش نوتیفیکیشن فعال شود. این فعالیت به طور معمول در Task and back stack برنامه شما وجود ندارد و در حالت عادی که برنامه کار می‌کند، این فعالیت اجرا نمی‌شود. مثال این مورد در کد بالا نمایش داده شده‌است.

حالت دیگر، فعالیتی است که در مواقع عادی که برنامه شما کار می‌کند اجرا می‌شود. در این موقعیت، باید دکمه بازگشت به عقب برای کاربر فعال باشد تا انتظارات کاربر در این زمینه برآورده شود.

نمایش دادن Android notification

برای فعال کردن این قسمت، از ()NotificationManagerCompat.notify استفاده کنید، به آن یک ID منحصر به فرد برای نوتیفیکیشن دهید(این ID را ذخیره کنید زیرا ممکن است بعد‌ها برای به روز رسانی یا حذف کردن نوتیفیکیشن به آن نیاز داشته باشید) و سپس آن را با Builder.build().NotificationCompat به پایان برسانید.

مثال کد
Kotlin
with(NotificationManagerCompat.from(this)) {
    // notificationId is a unique int for each notification that you must define
    notify(notificationId, builder.build())
}
Java
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);

// notificationId is a unique int for each notification that you must define
notificationManager.notify(notificationId, builder.build());

 

*توجه: اپلیکیشن های   Android 8.1(API level 27) و ورژن‌های بالاتر، توانایی ایجاد بیش از یک صدای نوتیفیکیشن در ثانیه را ندارند. ممکن است در یک ثانیه، چندین نوتیفیکیشن در برنامه ظاهر شود ولی فقط اولین نوتیفیکیشن دارای صدا است.

اضافه کردن دکمه اقدام ( Action buttons )

با یادگیری این بخش از آموزش نوتیفیکیشن در اندروید، می‌توانید این امکان را به کاربر بدهید که پاسخ سریعی به نوتیفیکیشن بدهد.  با استفاده از دکمه Snooze  یا تایپ کردن متنی به عنوان پاسخ، کاربر می‌تواند به نوتیفیکیشن واکنش نشان دهد. البته دکمه‌های پاسخ، نباید سبب تکرار مجدد
فعالیتی شوند که پس از ضربه کاربر فعال می‌گردند.

برای افزودن Action button، یک PendingIntent را به روش() addAction گذر دهید. این روش، تنظیماتی مشابه بخش ضربه کاربر دارد. با این تفاوت که به جای افزودن انواع فعالیت‌ها، می‌توان موارد دیگری مانند BroadcastReceiver را افزود تا مانع دخالت فعالیت در برنامه‌ی در حال اجرا شود.

کد زیر، نشان می‌دهد که چطور می‌توان یک Broadcast  را به یک دریافت کننده فرستاد.

مثال کد
Kotlin
val snoozeIntent = Intent(this, MyBroadcastReceiver::class.java).apply {
    action = ACTION_SNOOZE
    putExtra(EXTRA_NOTIFICATION_ID, 0)
}
val snoozePendingIntent: PendingIntent = 
    PendingIntent.getBroadcast(this, 0, snoozeIntent, 0)
val builder = NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        .setContentIntent(pendingIntent)
        .addAction(R.drawable.ic_snooze, getString(R.string.snooze),
                snoozePendingIntent)
Java
Intent snoozeIntent = new Intent(this, MyBroadcastReceiver.class);
snoozeIntent.setAction(ACTION_SNOOZE);
snoozeIntent.putExtra(EXTRA_NOTIFICATION_ID, 0);
PendingIntent snoozePendingIntent =
        PendingIntent.getBroadcast(this, 0, snoozeIntent, 0);

NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        .setContentIntent(pendingIntent)
        .addAction(R.drawable.ic_snooze, getString(R.string.snooze),
                snoozePendingIntent);

 

*توجه: در Android 10 (API level 29) و بالاتر، پلتفرم به صورت اتوماتیک برای برنامه‌ها دکمه پاسخ ایجاد می‌کند (اگر برنامه فاقد دکمه باشد). اگر ‌نمی‌خواهید برنامه شما پاسخ‌های پیشنهادی و غیره را نمایش دهد، از   ()  setAllowGeneratedRepliesو ()setAllowSystemGeneratedContextualAction  استفاده کنید.

افزودن قابلیت پاسخ مستقیم ( Direct reply action )

مهارت دیگری که با آموزش نوتیفیکیشن در اندروید توسط تیم ما به دست ‌می‌آورید، این امکان را به کاربر می‌دهد تا بدون ورود به برنامه، پیامی را برای آن بفرستد.

قابلیت پاسخ مستقیم، دکمه‌ای در پیام نوتیفیکیشن دارد که باکسی را برای ورود متن باز می‌کند. کاربر می‌تواند مستقیما به نوتیفیکیشن پاسخ دهد و پس از پایان تایپ کردن، سیستم پاسخ کاربر را به خواسته شما که مختص نوتیفیکیشن ساخته‌اید، وصل می‌کند و به اپلیکیشن می‌فرستد.

مراحل زیر را دنبال کنید تا Android notification شما حالت فعال‌تری به خود بگیرد.

دکمه پاسخ را اضافه کنید

۱-نمونه‌ای از RemoteInpuy.Builder را بسازید تا به Notification action شما اضافه شود. این سازنده، رشته‌ای را می‌پذیرد که سیستم از آن به عنوان کلید برای ورودی بعدی استفاده می‌کند. سپس اپلیکیشن با کلید، متن ورودی را بازیابی می‌کند.

مثال کد
Kotlin
// Key for the string that's delivered in the action's intent.
private val KEY_TEXT_REPLY = "key_text_reply"
var replyLabel: String = resources.getString(R.string.reply_label)
var remoteInput: RemoteInput = RemoteInput.Builder(KEY_TEXT_REPLY).run {
    setLabel(replyLabel)
    build()
}
Java
// Key for the string that's delivered in the action's intent.
private static final String KEY_TEXT_REPLY = "key_text_reply";

String replyLabel = getResources().getString(R.string.reply_label);
RemoteInput remoteInput = new RemoteInput.Builder(KEY_TEXT_REPLY)
        .setLabel(replyLabel)
        .build();

۲-  PendingIntent برای پاسخ دادن بسازید

مثال کد
Kotlin
// Build a PendingIntent for the reply action to trigger.
var replyPendingIntent: PendingIntent = 
    PendingIntent.getBroadcast(applicationContext,
        conversation.getConversationId(),
        getMessageReplyIntent(conversation.getConversationId()),
        PendingIntent.FLAG_UPDATE_CURRENT)
Java
// Build a PendingIntent for the reply action to trigger.
PendingIntent replyPendingIntent =
        PendingIntent.getBroadcast(getApplicationContext(),
                conversation.getConversationId(),
                getMessageReplyIntent(conversation.getConversationId()),
                PendingIntent.FLAG_UPDATE_CURRENT);

 

*احتیاط: اگر از یک PendingIntent دوباره استفاده کنید، ممکن است کاربر به مکالمه‌ای غیر از آنچه قصد داشته پاسخ دهد. شما یا می‌توانید از کد درخواستی متفاوتی برای هر مکالمه استفاده کنید یا این خواسته را مطرح کنید که به ()equals در هیچ مکالمه دیگری، پاسخ true ندهد. ID مکالمه به صورت مکرر به عنوان دسته موارد اضافی بر خواسته مطرح می‌شود اما با استفاده از() equals دیگر مورد توجه قرار نخواهد گرفت.

۳-با استفاده از addRemoteInput()، RemoteInput را به یک عمل متصل کنید.

مثال کد
Kotlin
// Create the reply action and add the remote input.
var action: NotificationCompat.Action = 
    NotificationCompat.Action.Builder(R.drawable.ic_reply_icon,
        getString(R.string.label), replyPendingIntent)
        .addRemoteInput(remoteInput)
        .build()
Java
// Create the reply action and add the remote input.
NotificationCompat.Action action =
        new NotificationCompat.Action.Builder(R.drawable.ic_reply_icon,
                getString(R.string.label), replyPendingIntent)
                .addRemoteInput(remoteInput)
                .build();

 

۴-عمل را برای Notification  و Issue the Notification  استفاده کنید.

مثال کد
Kotlin
// Build the notification and add the action.
val newMessageNotification = Notification.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.ic_message)
        .setContentTitle(getString(R.string.title))
        .setContentText(getString(R.string.content))
        .addAction(action)
        .build()

// Issue the notification.
with(NotificationManagerCompat.from(this)) {
    notificationManager.notify(notificationId, newMessageNotification)
}
Java
// Build the notification and add the action.
Notification newMessageNotification = new Notification.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.ic_message)
        .setContentTitle(getString(R.string.title))
        .setContentText(getString(R.string.content))
        .addAction(action)
        .build();

// Issue the notification.
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
notificationManager.notify(notificationId, newMessageNotification);

 

زمانی که کاربر   Notification action را فعال می‌کند، سیستم او را به پاسخ وادار می‌کند.

پاسخ ورودی کاربر اندروید را بازیابی کنید

برای دریافت ورودی کاربر از از قسمت پاسخ نوتیفیکیشن، از ()RemoteInput.getResultsFromIntent استفاده کنید و آن را به Intent گذر دهید که توسط BroadcastReciener  شما دریافت می‌شود.

مثال کد
Kotlin
private fun getMessageText(intent: Intent): CharSequence? {
    return RemoteInput.getResultsFromIntent(intent)?.getCharSequence(KEY_TEXT_REPLY)
}
Java
private CharSequence getMessageText(Intent intent) {
    Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
    if (remoteInput != null) {
        return remoteInput.getCharSequence(KEY_TEXT_REPLY);
    }
    return null;
 }

 

پس از پردازش متن، نوتیفیکیشن باید با استفاده از() NotificationManagerCompat.notifyآپدیت شود.  باید از ID و  Tag  قبلی استفاده شود. ضرورت این قسمت، آنجاست که قسمت پاسخ مستقیم باید پنهان شود و این اطمینان را به کاربر اندروید بدهد که پاسخ او دریافت و به طور صحیح پردازش شده است.

مثال کد
Kotlin
// Build a new notification, which informs the user that the system
// handled their interaction with the previous notification.
val repliedNotification = Notification.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.ic_message)
        .setContentText(getString(R.string.replied))
        .build()

// Issue the new notification.
NotificationManagerCompat.from(this).apply {
    notificationManager.notify(notificationId, repliedNotification)
}
Java
// Build a new notification, which informs the user that the system
// handled their interaction with the previous notification.
Notification repliedNotification = new Notification.Builder(context, CHANNEL_ID)
        .setSmallIcon(R.drawable.ic_message)
        .setContentText(getString(R.string.replied))
        .build();

// Issue the new notification.
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
notificationManager.notify(notificationId, repliedNotification);

 

وقتی با نوتیفیکیشن آپدیت شده و جدید کار می‌کنید، از محتوایی استفاده کنید که به ()onReceiveدریافت کننده گذر کرده‌است. همچنین با استفاده از ()setRemoteInputHistoryباید پاسخ را به انتهای نوتیفیکیشن ضمیمه کنید. اگرچه هنگامی که پیام‌رسان Android را می‌سازید، باید یک Messagigng-style notification تولید کنید تا پیام جدید به آن ضمیمه شود.

چگونه نوار پیشرفت ( Progress bar ) را به Android notification اضافه کنیم

افزودن انیمیشن به Notification، برای آگاهی و جلب توجه بیشتر کاربر، از اهداف آموزش نوتیفیکیشن در اندروید است.

نوار پیشرفت در نوتیفیکیشن، کاربر اندروید را در جریان پیشرفت فعالیت‌ها قرار می‌دهد.

کار با Notification نوتیفیکیشن در اندروید

اگر ‌می‌توانید میزان پیشرفت عملیات را در طول زمان تخمین بزنید، از فرم تعیین کننده در نشانگر Android notification(طبق شکل بالا)و از (setProgree(max, progress, false استفاده کنید. اولین پارامتر، مقدار تکمیل شده‌است(برای مثال ۱۰۰)و پارامتر دوم، مقدار تکمیل شده فعلی(برای مثال ۲۰ از ۱۰۰)است. آخرین پارامتر، نشان می‌دهد که این، یک نوار پیشرفت تعیین کننده است.

در حین انجام عملیات اندروید، از setProgree(max, progress, false)  با آپدیت progress استفاده کنید و مجددا نوتیفیکیشن را به کار ببرید.

مثال کد
Kotlin
val builder = NotificationCompat.Builder(this, CHANNEL_ID).apply {
    setContentTitle("Picture Download")
    setContentText("Download in progress")
    setSmallIcon(R.drawable.ic_notification)
    setPriority(NotificationCompat.PRIORITY_LOW
}
val PROGRESS_MAX = 100
val PROGRESS_CURRENT = 0
NotificationManagerCompat.from(this).apply {
    // Issue the initial notification with zero progress
    builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false)
    notify(notificationId, builder.build())

    // Do the job here that tracks the progress.
    // Usually, this should be in a 
    // worker thread 
    // To show progress, update PROGRESS_CURRENT and update the notification with:
    // builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false);
    // notificationManager.notify(notificationId, builder.build());

    // When done, update the notification one more time to remove the progress bar
    builder.setContentText("Download complete")
            .setProgress(0, 0, false)
    notify(notificationId, builder.build())
}
Java
...
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(this);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID);
builder.setContentTitle("Picture Download")
        .setContentText("Download in progress")
        .setSmallIcon(R.drawable.ic_notification)
        .setPriority(NotificationCompat.PRIORITY_LOW);

// Issue the initial notification with zero progress
int PROGRESS_MAX = 100;
int PROGRESS_CURRENT = 0;
builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false);
notificationManager.notify(notificationId, builder.build());

// Do the job here that tracks the progress.
// Usually, this should be in a 
// worker thread 
// To show progress, update PROGRESS_CURRENT and update the notification with:
// builder.setProgress(PROGRESS_MAX, PROGRESS_CURRENT, false);
// notificationManager.notify(notificationId, builder.build());

// When done, update the notification one more time to remove the progress bar
builder.setContentText("Download complete")
        .setProgress(0,0,false);
notificationManager.notify(notificationId, builder.build());

 

در انتهای عملیات، progress با max  برابر می‌شود. نوتیفیکیشن حتما باید آپدیت شود و پایان را گزارش کند. می‌توان نوار پیشرفت تکمیل شده را نمایش داد یا با(setProgress(0, 0, false  آن را حذف کرد.

*توجه: این کد باید در Background service اجرا شود تا نوار پیشرفت، آپدیت را به طور مداوم از Android notification دریافت کند.

اگر قصد دارید نوار پیشرفت شما درصد تکمیل شده را نمایش ندهد(همچنان عملکرد انیمیشنی دارد)، از( setProgress(0, 0, true استفاده کنید. برای توقف انیمیشن،  (setProgress(0, 0, false  به کار می‌رود. سپس، نوتیفیکشن باید آپدیت شود تا نشانگر فعالیت حذف گردد.

Category را به شکلی بسازید که تمام سیستم اندروید را در بر بگیرد

هنگامی که کاربران اندروید، سرویس Push notification خود را در حالت Do not disturb  قرار می‌دهند، سیستم بر اساس اطلاعات Android notification شما تصمیم می‌گیرد که نوتیفیکیشن نمایش داده شود یا خیر.

اگر نوتیفیکیشن شما در یکی از دسته‌بندی های موجود در NotificationCompat مانند CATEGORY_ALARM، CATEGORY_REMINDER، CATEGORY_EVENT یا CATEGORY_Call قرار بگیرد، باید  Category آن را با استفاده از ()setCategory اعلام کنید.

مثال کد
Kotlin
var builder = NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        .setCategory(NotificationCompat.CATEGORY_MESSAGE)
Java
NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        .setCategory(NotificationCompat.CATEGORY_MESSAGE);

 

تنها زمانی باید یک Category  به وسعت کل سیستم بسازید که نوتیفیکشن شما، در یکی از دسته‌بندی‌های  NotificationCompat  قرار بگیرد.

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

بعضی از Android notification ها، مانند نوتیفیکیشن یک تماس یاهشدار، باید فورا نمایش داده شوند. اگر دستگاه کاربر قفل باشد، نوتیفیکیشن به صورت Full screen نمایش داده می‌شود و در غیر این صورت، نوتیفیکیشن به صورت گسترده‌تر در صفحه دیده می‌شود که قابلیت پاسخ یا رد پیام توسط کاربر اندروید وجود دارد.

*احتیاط: نوتیفیکیشن‌های Full screen، به علت ماهیت مختل کننده شدید، باید تنها در مواقع بسیار ضروری به کار روند.

*توجه: برای (Android 10(API level 29 با بالاتر، باید به اپلیکیشن اجازه داده شود تا از بخش USE_FULL_SCREEN_INTENT استفاده کند.

با این روش از آموزش نوتیفیکیشن در اندروید، نوتیفیکیشن را به  صورت Full screen تنظیم کنید.

مثال کد
Kotlin
val fullScreenIntent = Intent(this, ImportantActivity::class.java)
val fullScreenPendingIntent = PendingIntent.getActivity(this, 0,
    fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT)

var builder = NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        .setFullScreenIntent(fullScreenPendingIntent, true)
Java
Intent fullScreenIntent = new Intent(this, ImportantActivity.class);
PendingIntent fullScreenPendingIntent = PendingIntent.getActivity(this, 0,
        fullScreenIntent, PendingIntent.FLAG_UPDATE_CURRENT);

NotificationCompat.Builder builder = new NotificationCompat.Builder(this, CHANNEL_ID)
        .setSmallIcon(R.drawable.notification_icon)
        .setContentTitle("My notification")
        .setContentText("Hello World!")
        .setPriority(NotificationCompat.PRIORITY_DEFAULT)
        .setFullScreenIntent(fullScreenPendingIntent, true);

 

در Lock screen  کاربر اندروید، چه میزان اطلاعات از نوتیفیکیشن نمایش داده می‌شود؟

برای کنترل میزان اطلاعات، از ()setVisibility استفاده کنید و یکی از سه کد زیر را انتخاب کنید.

کاربرد کد
متن نوتیفیکیشن به صورت کامل نمایش داده می‌شود VISIBILITY_PUBLIC
متن نوتیفیکیشن اضلا نمایش داده نمی‌شود VISIBILITY_SECRET
متن نوتیفیکیشن کامل نیست، ولی بخش هایی مانند عنوان و آیکون نمایش داده می‌شود VISIBILITY_PRIVATE

 

مثالی از VISIBILITY_PRIVATE، این است که تعداد SMS ها مشخص اما فرستنده و محتوای آن‌ها پنهان است. برای استفاده از این کد،  با استفاده از NotificationCompat.Builder، نوتیفیکیشن جایگزین را بسازید. سپس آن را با() setPublicVersion به نوتیفیکیشن عادی متصل کنید.

البته کاربر همواره می‌تواند نمایش نوتیفیکیشن را روی Lock screen خود تغییر دهد و حتی آن را با کانال‌های نوتیفیکیشن برنامه‌های اندروید تنظیم کند.

آپدیت کردن نوتیفیکیشن

پس از صادر کردن نوتیفیکیشن، آن را با استفاده مجدد از ()NotificationManagerCompat.notify و ID که قبلا به کار برده‌اید، آپدیت کنید.

با استفاده از صدا، ویبره یا نشانه‌های بصری در Push notification، توجه کاربر در اولین دریافت نوتیفیکیشن جلب می‌شود. با کد ()setOnlyAlertOnce نوتیفیکیشن را آپدیت کنید تا این اتفاق رخ دهد.

*احتیاط: سیستم اندروید برای آپدیت، محدودیت دارد و اگر آپدیت Android notification خارج از حد سرعت آن انجام شود، بعضی آپدیت‌ها ناموفق خواهند بود.

Android notification چگونه حذف می‌شود؟

  • کاربر، می تواند آن را رد (Dismiss) کند.
  • کاربر روی نوتیفیکیشن کلیک می‌کند و سپس با() setAutoCancel حذف می‌شود.
  • ()cancel برای یک ID خاص به کار می‌رود که نوتیفیکیشن‌های جاری را نیز حذف ‌می‌کند.
  • ()cancelAllتمام پوش نوتیفیکیشن‌های قبلی را حذف می‌کند.
  • با استفاده از() setTimeoutAfter، سیستم، Android notification را پس از اتمام زمان مورد نظر، حذف می‌کند. البته می‌توان یک پوش نوتیفیکیشن را قبل از این زمان نیز حذف کرد.

 

آموزه‌های انتهایی برای پیام رسان‌های اندروید

برای تکمیل این بخش از آموزش نوتیفیکیشن در اندروید، نکات زیر را به خاطر بسپارید تا بهترین نوتیفیکیشن‌ها را برای برنامه‌های چت و پیام رسان بسازید.

ازMessagingStyle استفاده کنید

برای (Android 7.0(API level 24 و بالاتر، از این کد که مختص پیام رسانی است استفاده کنید.

با استفاده از NotuficationCompat.MessagingStyle، می‌توان موارد زیادی از جمله عنوان Android notification، پیام‌های اضافه شده و محتوای آن را تغییر داد. به عنوان مثال، با کد زیر می‌توان یک پوش نوتیفیکیشن را تخصصی کرد.

مثال کد
Kotlin
var notification = NotificationCompat.Builder(this, CHANNEL_ID)
        .setStyle(NotificationCompat.MessagingStyle("Me")
                .setConversationTitle("Team lunch")
                .addMessage("Hi", timestamp1, null) // Pass in null for user.
                .addMessage("What's up?", timestamp2, "Coworker")
                .addMessage("Not much", timestamp3, null)
                .addMessage("How about lunch?", timestamp4, "Coworker"))
        .build()
Java
Notification notification = new Notification.Builder(this, CHANNEL_ID)
        .setStyle(new NotificationCompat.MessagingStyle("Me")
                .setConversationTitle("Team lunch")
                .addMessage("Hi", timestamp1, null) // Pass in null for user.
                .addMessage("What's up?", timestamp2, "Coworker")
                .addMessage("Not much", timestamp3, null)
                .addMessage("How about lunch?", timestamp4, "Coworker"))
        .build();

 

(Android 8.0(API level 26 و بالاتر، که از NotuficationCompat.MessagingStyle استفاده می‌کنند، می‌توانند محتوای بیشتری در نوتیفیکیشن خود جا دهند. همچنین می‌توانید از ()addHistoricMessege استفاده کنید و با افزودن پیام‌های Historic به نوتیفیکیشن‌های مربوط به پیام‌ها، متن یک مکالمه را به دست آورید.

کاربرد کد
برای چت‌های گروهی عنوان مناسبی انتخاب ‌می‌کند تا با بقیه چت‌ها اشتباه گرفته نشود ()MessagingStyle.setConversationTitle
برای استفاده از مدیا(عکس‌ها و غیره)در پیام‌ها ()MessagingStyle.setData

 

از Direct reply استفاده کنید

  • از ()addmessage استفاده کنید تا کاربر بتواند به نوتیفیکیشن پاسخ دهد. پس از پاسخ کاربر، نوتیفیکیشین اندروید را کنسل نکنید تا او بتواند چندین پاسخ را وارد کند.
  • برای سازگاری آن با Wear OS،

از Action.WearableExtender.setHintDisplayInlinkAction(true) استفاده کنید.

  • ()addhistoryMessage  را برای افزودن مستقیم محتوا، توسط اضافه کردن پیام‌های Historic به نوتیفیکیشن به کار ببرید.

 

Smart reply  را فعال کنید

از(setAllowGeneratedResponses(true استفاده کنید تا پاسخ دهی به Push notification در دستگاه Wear OS فعال شود. در این روش، نیازی به آپلود اطلاعات به اینترنت برای تولید پاسخ‌ها نیست.

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

فراداده‌ها، هنگامی که دستگاه در حالت   Do Not disturbقرار دارد،Android notification ها را تنظیم می‌کنند. برای مثال، از() addpersonیا (setCategory(Notification.CATEGORY_MESSAGEاستفاده کنید تا بر Do Not Disturb Mode غلبه کنید.