تقدّم الإشعارات معلومات قصيرة وفي الوقت المناسب عن الأحداث في تطبيقك أثناء عدم استخدامه. يوضّح لك هذا المستند كيفية إنشاء إشعار يتضمّن ميزات مختلفة. للحصول على مقدمة حول كيفية ظهور الإشعارات على Android، يُرجى الاطّلاع على نظرة عامة على الإشعارات. للاطّلاع على نموذج رمز برمجي يستخدم الإشعارات، يمكنك الاطّلاع على نموذج SociaLite على GitHub.
يستخدم الرمز البرمجي في هذه الصفحة واجهات برمجة تطبيقات NotificationCompat من مكتبة
AndroidX. تتيح لك واجهات برمجة التطبيقات هذه إضافة ميزات لا تتوفّر إلا في الإصدارات الأحدث من Android مع الحفاظ على التوافق مع الإصدار Android 9 (مستوى واجهة برمجة التطبيقات 28).
ومع ذلك، فإن بعض الميزات، مثل إجراء الرد المضمّن، تؤدي إلى عدم إجراء أي عملية في الإصدارات السابقة.
إنشاء إشعار أساسي
يعرض الإشعار في أبسط أشكاله وأكثرها إيجازًا، والمعروف أيضًا باسم الشكل المصغّر، رمزًا وعنوانًا ومقدارًا صغيرًا من المحتوى النصي. يوضّح هذا القسم كيفية إنشاء إشعار يمكن للمستخدم النقر عليه لبدء نشاط في تطبيقك.
الشكل 1: إشعار يحتوي على رمز وعنوان وبعض النصوص
لمزيد من التفاصيل حول كل جزء من الإشعار، يمكنك الاطّلاع على بنية الإشعار.
تضمين إذن التشغيل في نموذج البيان
يتيح الإصدار 13 من نظام التشغيل Android (المستوى 33 لواجهة برمجة التطبيقات) والإصدارات الأحدث إذن التشغيل لنشر الإشعارات غير المُعفاة (بما في ذلك الخدمات التي تعمل في المقدّمة (FGS)) من أحد التطبيقات.
يظهر الإذن الذي تحتاج إلى الإفصاح عنه في ملف بيان تطبيقك في مقتطف الرمز التالي:
<manifest ...> <uses-permission android:name="android.permission.POST_NOTIFICATIONS"/> <application ...> ... </application> </manifest>
لمزيد من التفاصيل حول أذونات التشغيل، يُرجى الاطّلاع على إذن التشغيل الخاص بالإشعارات.
ضبط محتوى الإشعار
للبدء، اضبط محتوى الإشعار وقناته باستخدام عنصر
NotificationCompat.Builder. يوضّح المثال التالي كيفية إنشاء إشعار يتضمّن ما يلي:
رمز صغير يتم ضبطه من خلال
setSmallIcon(). هذا هو المحتوى الوحيد المطلوب الذي يظهر للمستخدم.عنوان يحدّده
setContentTitle().النص الأساسي الذي تم ضبطه من خلال
setContentText().أولوية الإشعار، التي يضبطها
setPriority(). تحدّد الأولوية مدى تطفّل الإشعار على Android 7.1 والإصدارات الأقدم. بالنسبة إلى الإصدار Android 8.0 والإصدارات الأحدث، يمكنك ضبط أهمية القناة كما هو موضّح في القسم التالي.
val textTitle = "Title" val textContent = "Content" val builder = NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_logo) .setContentTitle(textTitle) .setContentText(textContent) .setPriority(NotificationCompat.PRIORITY_DEFAULT)
يتطلّب منك الدالة الإنشائية NotificationCompat.Builder تقديم معرّف القناة. هذا الإجراء مطلوب للتوافق مع الإصدار 8.0 من Android (المستوى 26 لواجهة برمجة التطبيقات) والإصدارات الأحدث، ولكن يتم تجاهله في الإصدارات الأقدم.
يتم تلقائيًا اقتطاع المحتوى النصي للإشعار ليلائم سطرًا واحدًا. يمكنك عرض معلومات إضافية عن طريق إنشاء إشعار قابل للتوسيع.
الشكل 2: إشعار قابل للتوسيع في شكليه المصغّر والموسّع
إذا أردت أن يكون الإشعار أطول، يمكنك تفعيل إشعار قابل للتوسيع من خلال إضافة نموذج نمط باستخدام setStyle(). على سبيل المثال،
تنشئ التعليمة البرمجية التالية مربّع نص أكبر:
val builder = NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_logo) .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)
لمزيد من المعلومات حول أنماط الإشعارات الكبيرة الأخرى، بما في ذلك كيفية إضافة صورة وعناصر التحكّم في تشغيل الوسائط، يُرجى الاطّلاع على إنشاء إشعار قابل للتوسيع.
إنشاء قناة وضبط مستوى الأهمية
قبل أن تتمكّن من إرسال الإشعار على نظام التشغيل Android 8.0 والإصدارات الأحدث، عليك تسجيل قناة الإشعارات الخاصة بتطبيقك في النظام من خلال تمرير مثيل من NotificationChannel إلى createNotificationChannel(). يتم حظر الرمز البرمجي التالي بسبب شرط في الإصدار SDK_INT:
fun createNotificationChannel(context: Context) { // Create the NotificationChannel, but only on API 26+ because // the NotificationChannel class is not in the Support Library. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { val name = context.getString(R.string.channel_name) val descriptionText = context.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 = context.getSystemService(NotificationManager::class.java) as NotificationManager notificationManager.createNotificationChannel(channel) } }
بما أنّه عليك إنشاء قناة الإشعارات قبل نشر الإشعارات على Android 8.0 والإصدارات الأحدث، يجب تنفيذ هذا الرمز عند بدء تشغيل تطبيقك. من الآمن تكرار الطلب لأنّ إنشاء قناة حالية لا يؤدي إلى أي نتيجة.
تتطلّب الدالة الإنشائية NotificationChannel مستوى أهمية باستخدام ثابت NotificationManager. يحدّد هذا الإعداد كيفية مقاطعة المستخدم. لإتاحة الإصدار 7.1 من نظام التشغيل Android والإصدارات الأقدم، يمكنك أيضًا ضبط الأولوية باستخدام
setPriority() كما هو موضّح في المثال السابق.
على الرغم من أنّه عليك ضبط مستوى الأهمية أو الأولوية، لا يضمن النظام سلوك التنبيه. وقد يعدّله النظام استنادًا إلى عوامل أخرى، ويمكن للمستخدم دائمًا تخصيص مستوى أهمية القناة.
لمزيد من المعلومات حول معنى المستويات المختلفة، يمكنك الاطّلاع على مستويات أهمية الإشعارات.
ضبط إجراء النقر على الإشعار
يجب أن يستجيب كل إشعار للنقر عليه، وذلك عادةً لفتح نشاط في تطبيقك يتوافق مع الإشعار. لإجراء ذلك، حدِّد هدف المحتوى
باستخدام عنصر PendingIntent ومرِّره إلى
setContentIntent().
يوضّح المقتطف التالي كيفية إنشاء نية أساسية لفتح نشاط عندما ينقر المستخدم على الإشعار:
// Create an explicit intent for an Activity in your app. val intent = Intent(context, AlertDetails::class.java).apply { flags = Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK } val pendingIntent: PendingIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_IMMUTABLE) val builder = NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_logo) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) // Set the intent that fires when the user taps the notification. .setContentIntent(pendingIntent) .setAutoCancel(true)
يستدعي هذا الرمز setAutoCancel()، الذي يزيل الإشعار تلقائيًا عندما ينقر عليه المستخدم.
تحافظ علامات intent في المثال السابق على تجربة التنقّل المتوقّعة للمستخدم بعد أن يفتح تطبيقك باستخدام الإشعار. قد تحتاج إلى استخدامها حسب نوع النشاط الذي تبدأه، والذي يمكن أن يكون أحد ما يلي:
نشاط مخصّص حصريًا للردود على الإشعار ما مِن سبب يدفع المستخدم إلى الانتقال إلى هذا النشاط أثناء الاستخدام العادي للتطبيق، لذا يبدأ النشاط مهمة جديدة بدلاً من إضافته إلى المهمة والأنشطة السابقة الحالية في تطبيقك. هذا هو نوع الغرض الذي تم إنشاؤه في النموذج السابق.
نشاط متوفّر في مسار تطبيقك العادي في هذه الحالة، يؤدي بدء النشاط إلى إنشاء أنشطة سابقة بحيث يتم الحفاظ على توقعات المستخدم بشأن زرَّي الرجوع والانتقال للأعلى.
عرض الإشعار
لإظهار الإشعار، يمكنك استدعاء
NotificationManagerCompat.notify()، مع تمرير معرّف فريد للإشعار
ونتيجة NotificationCompat.Builder.build(). يظهر هذا في المثال التالي:
with(NotificationManagerCompat.from(context)) { if (ActivityCompat.checkSelfPermission( context, Manifest.permission.POST_NOTIFICATIONS ) != PackageManager.PERMISSION_GRANTED ) { // TODO: Consider calling ActivityCompat#requestPermissions here // to request the missing permissions, and then overriding // public fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, // grantResults: IntArray) // to handle the case where the user grants the permission. See the documentation // for ActivityCompat#requestPermissions for more details. return@with } // notificationId is a unique int for each notification that you must define. notify(notificationId, builder.build())
احفظ معرّف الإشعار الذي ترسله إلى NotificationManagerCompat.notify()، لأنّك ستحتاج إليه عندما تريد تعديل الإشعار أو إزالته.
بالإضافة إلى ذلك، لاختبار الإشعارات الأساسية على الأجهزة التي تعمل بنظام التشغيل Android 13 والإصدارات الأحدث، يجب تفعيل الإشعارات يدويًا أو إنشاء مربّع حوار لطلب الإشعارات.
إضافة أزرار الإجراءات
يمكن أن يقدّم الإشعار ما يصل إلى ثلاثة أزرار إجراءات تتيح للمستخدم الردّ بسرعة، مثل تأجيل تذكير أو الردّ على رسالة نصية. ومع ذلك، يجب ألا تكرر أزرار الإجراءات هذه الإجراء الذي يتم تنفيذه عندما ينقر المستخدم على الإشعار.
الشكل 3: إشعار يتضمّن زر إجراء واحد
لإضافة زر إجراء، مرِّر PendingIntent إلى طريقة addAction(). يشبه ذلك إعداد إجراء النقر التلقائي للإشعار، ولكن بدلاً من بدء نشاط، يمكنك تنفيذ إجراءات أخرى مثل بدء BroadcastReceiver الذي ينفّذ مهمة في الخلفية حتى لا يقاطع الإجراء التطبيق المفتوح حاليًا.
على سبيل المثال، يوضّح الرمز التالي كيفية إرسال بث إلى مستلِم محدّد:
val ACTION_SNOOZE = "snooze" val snoozeIntent = Intent(context, MyBroadcastReceiver::class.java).apply { action = ACTION_SNOOZE putExtra(EXTRA_NOTIFICATION_ID, 0) } val snoozePendingIntent: PendingIntent = PendingIntent.getBroadcast(context, 0, snoozeIntent, PendingIntent.FLAG_IMMUTABLE) val builder = NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_logo) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setContentIntent(pendingIntent) .addAction(R.drawable.snooze, context.getString(R.string.snooze), snoozePendingIntent)
لمزيد من المعلومات حول إنشاء BroadcastReceiver لتنفيذ المهام في الخلفية، يُرجى الاطّلاع على نظرة عامة على عمليات البث.
إذا كنت تحاول بدلاً من ذلك إنشاء إشعار يتضمّن أزرار تشغيل الوسائط، مثل إيقاف المقاطع الصوتية مؤقتًا وتخطّيها، يمكنك الاطّلاع على كيفية إنشاء إشعار يتضمّن عناصر التحكّم في الوسائط.
إضافة إجراء ردّ مباشر
يتيح إجراء الردّ المباشر، الذي تم طرحه في Android 7.0 (مستوى واجهة برمجة التطبيقات 24)، للمستخدمين إدخال النص مباشرةً في الإشعار. يتم بعد ذلك تسليم النص إلى تطبيقك بدون فتح نشاط. على سبيل المثال، يمكنك استخدام إجراء الرد المباشر للسماح للمستخدمين بالرد على الرسائل النصية أو تحديث قوائم المهام من داخل الإشعار.
الشكل 4. يؤدي النقر على زر "الردّ" إلى فتح حقل إدخال النص.
يظهر إجراء الردّ المباشر كزرّ إضافي في الإشعار الذي يفتح حقل إدخال نص. عندما ينتهي المستخدم من الكتابة، يرفق النظام الرد النصي بالغرض الذي تحدده لإجراء الإشعار ويرسل الغرض إلى تطبيقك.
إضافة زر الردّ
لإنشاء إجراء إشعار يتيح الردّ المباشر، اتّبِع الخطوات التالية:
أنشِئ مثيلاً من RemoteInput.Builder يمكنك إضافته إلى إجراء الإشعار. يقبل مُنشئ هذه الفئة سلسلة يستخدمها النظام كمفتاح لإدخال النص. يستخدم تطبيقك لاحقًا هذا المفتاح لاسترداد نص الإدخال.
// Key for the string that's delivered in the action's intent. val replyLabel: String = context.resources.getString(R.string.reply_label) val remoteInput: RemoteInput = RemoteInput.Builder(KEY_TEXT_REPLY).run { setLabel(replyLabel) build() }
أنشئ PendingIntent لإجراء الرد.
// Build a PendingIntent for the reply action to trigger. val replyPendingIntent: PendingIntent = PendingIntent.getBroadcast(context, conversationId, getMessageReplyIntent(conversationId), PendingIntent.FLAG_MUTABLE)
أرفِق العنصر RemoteInput بإجراء باستخدام
addRemoteInput().
// Create the reply action and add the remote input. val action: NotificationCompat.Action = NotificationCompat.Action.Builder(R.drawable.reply, context.getString(R.string.reply_label), replyPendingIntent) .addRemoteInput(remoteInput) .build()
طبِّق الإجراء على إشعار وأرسِله.
// Build the notification and add the action.
val newMessageNotification = NotificationCompat.Builder(context, CHANNEL_ID)
.setSmallIcon(R.drawable.ic_message)
.setContentTitle(context.getString(R.string.title))
.setContentText(context.getString(R.string.content))
.addAction(action)
.build()
// Issue the notification.
NotificationManagerCompat.from(context).notify(notificationId, newMessageNotification)
يطلب النظام من المستخدم إدخال ردّ عندما يشغّل إجراء الإشعار، كما هو موضّح في الشكل 4.
استرداد البيانات التي أدخلها المستخدم من الردّ
لتلقّي إدخال المستخدم من واجهة مستخدم الردّ على الإشعار، يمكنك استدعاء
RemoteInput.getResultsFromIntent()، مع تمرير Intent الذي تلقّاه
BroadcastReceiver:
private fun getMessageText(intent: Intent): CharSequence? { return RemoteInput.getResultsFromIntent(intent)?.getCharSequence(KEY_TEXT_REPLY) }
بعد معالجة النص، عدِّل الإشعار من خلال استدعاء
NotificationManagerCompat.notify() باستخدام رقم التعريف والعلامة نفسيهما، إذا تم استخدامهما. وهذا ضروري لإخفاء واجهة مستخدم الرد المباشر والتأكيد للمستخدم على أنه تم تلقي رده ومعالجته بشكل صحيح.
// Build a new notification, which informs the user that the system // handled their interaction with the previous notification. val repliedNotification = NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.message) .setContentText(context.getString(R.string.replied)) .build() // Issue the new notification. NotificationManagerCompat.from(context).notify(notificationId, repliedNotification)
استرداد بيانات أخرى
تتم معالجة أنواع البيانات الأخرى بطريقة مشابهة باستخدام RemoteInput. يستخدم المثال التالي صورة كإدخال.
val replyLabel: String = context.resources.getString(R.string.reply_label) val remoteInput: RemoteInput = RemoteInput.Builder(KEY_REPLY).run { setLabel(replyLabel) // Allow for image data types in the input. // This method can be used again to allow for other data types. setAllowDataType("image/*", true) build() }
اتصل بـ RemoteInput#getDataResultsFromIntent واستخرِج البيانات المقابلة.
class ReplyReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { val dataResults = RemoteInput.getDataResultsFromIntent(intent, KEY_REPLY) val imageUri: Uri? = dataResults?.get("image/*") as? Uri if (imageUri != null) { // Extract the image context.contentResolver.openInputStream(imageUri)?.use { inputStream -> val bitmap = BitmapFactory.decodeStream(inputStream) // Display the image // ... } } } companion object { const val KEY_REPLY = "key_reply" const val KEY_TEXT_REPLY = "key_text_reply" } }
عند العمل مع هذا الإشعار الجديد، استخدِم السياق الذي تم تمريره إلى طريقة onReceive() الخاصة بالمستلِم.
أضِف الردّ إلى أسفل الإشعار من خلال استدعاء
setRemoteInputHistory(). ومع ذلك، إذا كنت تنشئ تطبيق مراسلة،
يمكنك إنشاء إشعار بنمط المراسلة وإلحاق الرسالة الجديدة
بالمحادثة.
لمزيد من النصائح حول الإشعارات من تطبيقات المراسلة، يُرجى الاطّلاع على القسم المتعلّق بأفضل الممارسات لتطبيقات المراسلة.
عرض رسالة عاجلة
قد يحتاج تطبيقك إلى عرض رسالة عاجلة وحسّاسة للوقت، مثل مكالمة هاتفية واردة أو منبّه يرنّ. في هذه الحالات، يمكنك ربط intent ملء الشاشة بالإشعار.
عند ظهور الإشعار، يرى المستخدمون أحد الخيارات التالية، حسب حالة قفل الجهاز:
- إذا كان جهاز المستخدم مقفلاً، يظهر نشاط بملء الشاشة يغطي شاشة القفل.
- إذا كان جهاز المستخدم غير مقفل، يظهر الإشعار بشكل موسّع يتضمّن خيارات للتعامل مع الإشعار أو إغلاقه.
يوضّح مقتطف الرمز التالي كيفية ربط الإشعار بـ intent ملء الشاشة:
val fullScreenIntent = Intent(context, ImportantActivity::class.java) val fullScreenPendingIntent = PendingIntent.getActivity(context, 0, fullScreenIntent, PendingIntent.FLAG_IMMUTABLE) val builder = NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_logo) .setContentTitle("My notification") .setContentText("Hello World!") .setPriority(NotificationCompat.PRIORITY_DEFAULT) .setFullScreenIntent(fullScreenPendingIntent, true)
ضبط مستوى عرض شاشة القفل
للتحكّم في مستوى التفاصيل الظاهرة في الإشعار من شاشة القفل،
استخدِم setVisibility() وحدِّد إحدى القيم التالية:
VISIBILITY_PUBLIC: يظهر محتوى الإشعار بالكامل على شاشة القفل.VISIBILITY_SECRET: لا يظهر أي جزء من الإشعار على شاشة القفل.VISIBILITY_PRIVATE: تظهر المعلومات الأساسية فقط، مثل رمز الإشعار وعنوان المحتوى، على شاشة القفل. لا يظهر المحتوى الكامل للإشعار.
عند ضبط VISIBILITY_PRIVATE، يمكنك أيضًا تقديم نسخة بديلة من
محتوى الإشعار الذي يخفي تفاصيل معيّنة. على سبيل المثال، قد يعرض تطبيق SMS إشعارًا يتضمّن "لديك 3 رسائل نصية جديدة"، ولكنّه يخفي محتوى الرسائل والمُرسِلين. لتقديم هذا الإشعار البديل، عليك أولاً إنشاء الإشعار البديل باستخدام NotificationCompat.Builder كالمعتاد. بعد ذلك، أرفِق الإشعار البديل
بالإشعار العادي باستخدام setPublicVersion().
يُرجى العِلم أنّ المستخدم لديه دائمًا إمكانية التحكّم المطلق في ما إذا كانت إشعاراته تظهر على شاشة القفل، ويمكنه التحكّم فيها استنادًا إلى قنوات الإشعارات في تطبيقك.
تعديل إشعار
لتعديل إشعار بعد إصداره، يمكنك استدعاء
NotificationManagerCompat.notify() مرة أخرى، مع تمرير المعرّف نفسه الذي استخدمته
من قبل. إذا تم إغلاق الإشعار السابق، يتم إنشاء إشعار جديد
بدلاً منه.
يمكنك اختياريًا استدعاء setOnlyAlertOnce() لكي يقاطع الإشعار
المستخدم، من خلال الصوت أو الاهتزاز أو الإشارات المرئية، في المرة الأولى فقط
التي يظهر فيها الإشعار وليس في التحديثات اللاحقة.
إزالة إشعار
تظل الإشعارات مرئية إلى أن يحدث أحد الإجراءات التالية:
- يتجاهل المستخدم الإشعار.
- ينقر المستخدم على الإشعار، إذا طلبت
setAutoCancel()عند إنشاء الإشعار. - يمكنك طلب
cancel()لمعرّف إشعار معيّن. تؤدي هذه الطريقة أيضًا إلى حذف الإشعارات المستمرة. - يمكنك استدعاء
cancelAll()، ما يؤدي إلى إزالة جميع الإشعارات التي أصدرتها سابقًا. - انقضاء المدة المحدّدة، إذا ضبطت مهلة عند إنشاء الإشعار باستخدام
setTimeoutAfter(). إذا لزم الأمر، يمكنك إلغاء إشعار قبل انقضاء مدة المهلة المحددة.
أفضل الممارسات لتطبيقات المراسلة
ننصحك باتّباع أفضل الممارسات المذكورة هنا عند إنشاء إشعارات لتطبيقات المراسلة والمحادثة.
استخدام MessagingStyle
بدءًا من الإصدار Android 7.0 (مستوى واجهة برمجة التطبيقات 24)، يوفّر Android نموذجًا لنمط الإشعارات مخصّصًا لمحتوى المراسلة. باستخدام الفئة
NotificationCompat.MessagingStyle، يمكنك تغيير العديد من
التصنيفات المعروضة في الإشعار، بما في ذلك عنوان المحادثة
والرسائل الإضافية وعرض المحتوى للإشعار.
يوضّح مقتطف الرمز التالي كيفية تخصيص نمط الإشعار باستخدام الفئة MessagingStyle.
val message1 = NotificationCompat.MessagingStyle.Message( messages[0].text, messages[0].time, messages[0].sender ) val message2 = NotificationCompat.MessagingStyle.Message( messages[1].text, messages[1].time, messages[1].sender ) notification = NotificationCompat.Builder(context, CHANNEL_ID) .setSmallIcon(R.drawable.ic_logo) .setStyle( NotificationCompat.MessagingStyle(Person.Builder().setName("Me").build()) .addMessage(message1) .addMessage(message2) ) .build()
بدءًا من الإصدار 9.0 من نظام التشغيل Android (مستوى واجهة برمجة التطبيقات 28)، يجب أيضًا استخدام الفئة Person للحصول على عرض مثالي للإشعار والأفاتار.
عند استخدام NotificationCompat.MessagingStyle، اتّبِع الخطوات التالية:
- يمكنك استدعاء
MessagingStyle.setConversationTitle()لضبط عنوان للمحادثات الجماعية التي تضم أكثر من شخصَين. قد يكون عنوان المحادثة الجيد هو اسم المحادثة الجماعية أو، إذا لم يكن لها اسم، قائمة بالمشاركين في المحادثة. بدون ذلك، قد يتم اعتبار الرسالة على أنّها تنتمي إلى محادثة فردية مع مُرسِل آخر رسالة في المحادثة. - استخدِم طريقة
MessagingStyle.setData()لتضمين رسائل وسائط، مثل الصور. يتم قبول أنواع MIME التي تتبع النمط image/* .
استخدام ميزة "الردّ المباشر"
تتيح ميزة "الرد المباشر" للمستخدم الردّ بشكل مضمّن على رسالة.
- بعد أن يردّ المستخدم باستخدام إجراء الردّ المضمّن، استخدِم
MessagingStyle.addMessage()لتعديل الإشعارMessagingStyleولا تسحب الإشعار أو تلغه. ويتيح عدم إلغاء الإشعار للمستخدم إرسال ردود متعددة من الإشعار. - لجعل إجراء الردّ المضمّن متوافقًا مع Wear OS، يمكنك استدعاء
Action.WearableExtender.setHintDisplayInlineAction(true). - استخدِم الطريقة
addHistoricMessage()لتوفير سياق لمحادثة ردّ مباشر من خلال إضافة رسائل سابقة إلى الإشعار.
تفعيل ميزة "الرد السريع"
- لتفعيل ميزة "الرد السريع"، يمكنك استدعاء
setAllowGeneratedResponses(true)في إجراء الرد. يؤدي ذلك إلى إتاحة ردود "الرد السريع" للمستخدمين عند ربط الإشعار بجهاز Wear OS. يتم إنشاء ردود "الرد السريع" باستخدام نموذج تعلُّم الآلة على الساعة بالكامل باستخدام السياق الذي يوفّره إشعار "NotificationCompat.MessagingStyle"، ولا يتم تحميل أي بيانات على الإنترنت لإنشاء الردود.
إضافة بيانات وصفية للإشعارات
- يمكنك تخصيص بيانات وصفية للإشعارات لإعلام النظام بكيفية التعامل مع إشعارات تطبيقك عندما يكون الجهاز في وضع "عدم الإزعاج". على سبيل المثال، يمكنك استخدام الطريقة
addPerson()أوsetCategory(Notification.CATEGORY_MESSAGE)لتجاوز ميزة "عدم الإزعاج".