إنشاء إشعارات لأنظمة الساعات

الإعلانات

إنشاء إشعارات لأنظمة تشغيل الساعات

 

 إنشاء إشعارات لأنظمة الساعات

تصف هذه الصفحة كيفية إنشاء إشعارات للساعة. توضح هذه الصفحة أيضاً كيفية توفير محتوى إضافي لكل إشعار يتم توصيله بالساعة من الهاتف المتصل بالساعه.

الإشعارات على الساعات لها نفس بنية الإشعارات على الهواتف. بالإضافة إلى ذلك، لمنح المستخدمين أفضل تجربة..

يوفر نظام تشغيل الساعات من قوقل واجهات برمجة التطبيقات لإضافة خصائص مميزة للإشعارات.

عندما تصدر إشعار من تطبيقك، كل إشعار يظهر كبطاقة على مسار الإشعارات.

الشكل 1. نفس الإشعار يظهر على الهاتف وعلى الساعة.

 

يمكن أن يكون كلٍ من الساعة والهاتف مصدراً للإشعارات. إستخدم الفئة NotificationCompat.Builder لإنشاء إشعارات للساعات.

عند إنشاء إشعارات بإستخدام هذه الفئة، يكون النظام حذراً في عرض الإشعارات بشكلٍ صحيح.

ملاحظة: يتم إزالة الإشعارات بإستخدام RemoteViews من المخططات المخصصة ولا تعرض الساعة سوى النص والأيقونه.

مع ذلك، يمكنك إنشاء إشعارات مخصصة تستخدم مخططات بطاقات مخصصة عن طريق إنشاء تطبيق قابل للإرتداء يعمل على الساعة.

 

 

راجع الموارد التاليه ذات الصلة:

عينة إشعارات الساعه
كود إختبار لتشغيل الموسيقى
كود إختبار لتوسيع الرسائل

 

 

 

 

إستيراد الفئات الضرورية


لإستيراد الحزم الضرورية، أضف هذا السطر إلى ملف البناء build.gradle الخاص بك:

compile "com.android.support:support-v13:27.0.2"

 

الآن وقد أصبح مشروعك قادراً على الوصول إلى الحزم الضرورية، قم بإستيراد الفئات الضرورية من مكتبة الدعم:

KOTLIN

import android.support.v4.app.NotificationCompat
import android.support.v4.app.NotificationManagerCompat
import android.support.v4.app.NotificationCompat.WearableExtender

JAVA

import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationManagerCompat;
import android.support.v4.app.NotificationCompat.WearableExtender;

 

 

 

 

 

إنشاء إشعار بإستخدام أداة إنشاء الإشعارات


تتيح لك مكتبة الدعم الإصدار 4 إنشاء إشعارات بإستخدام أحدث خصائص الإشعارات، مثل أزرار الإجراءات والأيقونات..

مع إستمرار التوافق مع أندرويد 1.6 (مستوى واجهة برمجة التطبيقات 4) وأعلى.

ملاحظة: بدءاً من أندرويد 8.0 (مستوى واجهة برمجة التطبيقات 26)، يلزمك إنشاء قنوات “مسارات” إشعارات لكل نوع من الإشعارات التي تريد عرضها.

لإنشاء إشعار بإستخدام مكتبة الدعم:

1- قم بإنشاء مثيل من NotificationCompat.Builder

KOTLIN

val notificationId = 1
// The channel ID of the notification.
val id = "my_channel_01"
// Build intent for notification content
val viewPendingIntent = Intent(this, ViewEventActivity::class.java).let { viewIntent ->
    viewIntent.putExtra(EXTRA_EVENT_ID, eventId)
    PendingIntent.getActivity(this, 0, viewIntent, 0)
}

// Notification channel ID is ignored for Android 7.1.1
// (API level 25) and lower.
val notificationBuilder = NotificationCompat.Builder(this, id)
        .setSmallIcon(R.drawable.ic_event)
        .setContentTitle(eventTitle)
        .setContentText(eventLocation)
        .setContentIntent(viewPendingIntent)

JAVA

int notificationId = 001;
// The channel ID of the notification.
String id = "my_channel_01";
// Build intent for notification content
Intent viewIntent = new Intent(this, ViewEventActivity.class);
viewIntent.putExtra(EXTRA_EVENT_ID, eventId);
PendingIntent viewPendingIntent =
        PendingIntent.getActivity(this, 0, viewIntent, 0);

// Notification channel ID is ignored for Android 7.1.1
// (API level 25) and lower.
NotificationCompat.Builder notificationBuilder =
    new NotificationCompat.Builder(this, id)
        .setSmallIcon(R.drawable.ic_event)
        .setContentTitle(eventTitle)
        .setContentText(eventLocation)
        .setContentIntent(viewPendingIntent);

 

2- قم بإصدار الإشعار من خلال تمرير كائن الإشعار بمعرف الإشعار لـ()notify.

KOTLIN

NotificationManagerCompat.from(this).apply {
    notify(notificationId, notificationBuilder.build())
}

JAVA

// Get an instance of the NotificationManager service
NotificationManagerCompat notificationManager =
        NotificationManagerCompat.from(this);

// Issue the notification with notification manager.
notificationManager.notify(notificationId, notificationBuilder.build());

 

 

عندما يظهر هذا الإشعار على الهاتف، يمكن للمستخدم إستدعاء الغرض قيد الإنتظار PendingIntent المحدد بواسطة دالة ()setContentIntent عن طريق لمس الإشعار.

عند ظهور هذا الإشعار على الساعه، يظهر في تدفق الإشعارات. بالنسبة إلى الإشعارات المعلقة، يمكن للمستخدم النقر على الإشعار..

لعرض الإشعار الموسع وتشغيل أي إجراء محدد، مثل الإجراء المفتوح. عادة ما تفتح هذه الإجراءات نشاطاً على تطبيق هاتفك.

 

 

 

 

 

بناء الإشعارات الموسعة


توفر الإشعارات الموسعة محتوى وإجراءات إضافيه أساسيه لكل إشعار. عند تحديد صفحات وإجراءات محتوى إضافية لإشعار..

فسوف تكون متاحة للمستخدم ضمن الإشعار الموسع. يتبع كل إشعار موسع أدوات التصميم لأنظمة تشغيل الساعات..

لذلك يحصل المستخدم على تجربة شبيهة بالتطبيقات.

إذا كان الإجراء الأول في الإشعار الموسع يحتوي على إدخال عن بعد RemoteInput (مثال، إجراء الرد)..

فإن الإختيارات التي تقوم بتعيينها بـ ()setChoices ستظهر ضمن الإشعار الموسع أسفل الإجراء الأول.

يمكن للمستخدم عرض الإشعار الموسع عن طريق النقر على إشعار عندما يكون أي مما يلي صحيحاً:

  • يتم إنشاء الإشعار من خلال تطبيق على الهاتف المقترن ويتم توصيله إلى الساعه.
  • لا يحتوي الإشعار على غرض محتوى contentIntent.

 

ملاحظة: يتم عرض مجموعة ألوان الخلفية الخاصة بالتطبيق للإشعار، بإستخدام دالة ()setColor فقط عندما تقوم بتوسيع الإشعار.

 

 

 

 

 إنشاء إشعارات لأنظمة الساعات

 

أفضل الممارسات للإشعارات الموسعة

لتحديد متى تُستخدم الإشعارات الموسعة، أتبع الإرشادات التالية:

  •  ستستخدم جميع الإشعارات الموصولة، من الهاتف المقترن، إلى الساعة، الإشعارات الموسعة.
  • إذا تم إنشاء إشعار بواسطة تطبيق يعمل محلياً على الساعة، فيجب أن تجعل الهدف الذي يعمل بلمس إشعارك..

أن يقوم بتشغيل كائن الإشعار بإستخدام معرف إشعار بداخل تطبيقك عن طريق إستدعاء ()setContentIntent .

نوصيك بعدم إستخدام الإشعارات الموسعة للإشعارات التي تم إنشاؤها بواسطة تطبيق يعمل محلياً على الساعه.

 

 

 

إضافة إشعارات موسعة

تسمح لك الإشعارات الموسعة بتضمين محتوى وإجراءات إضافية للإشعار. تختار أنت مستوى التفاصيل التي تعرضها إشعارات تطبيقك..

مع ذلك، كن حكيماً مع كمية التفاصيل التي تدرج في الإشعار.

إضافة محتوى إضافي

لإظهار نص إضافي في إشعارك

الموسع، إستخدم BigTextStyle.

لإضافة صور في إشعارك الموسع، يمكنك إستخدام BigPictureStyle.

إذا كنت تريد إضافة أكثر من صورة واحدة في إشعارك الموسع..

فإستخدم دالة ()addPage مع دالة BigPictureStyle.

 

 

 

 

الإجراء الأساسي

سيحتوي الإشعار الموسع على إجراء أساسي واحد، وهو الإجراء الأول في الإشعار ما لم يتم تحديد إجراء مختلف بإستخدام ()setContentAction.

 

 

إجراءات إضافية

لتحديد إجراءات إضافية، إستخدم ()addAction أو ()addActions . تحتوي خزانة الإجراءات للإشعار الموسع على جميع الإجراءات المتاحة.

 

 

 

إضافة إجراءات الإشعار


بالإضافة إلى إجراء المحتوى الأساسي المحدد بواسطة دالة “تعيين محتوى الغرض” ()setContentIntent ، يمكنك إضافة إجراءات أخرى بتمرير “غرض معلق” PendingIntent إلى دالة “إضافة إجراء” ()addAction.

مثال، يعرض الكود التالي نفس النوع من الإشعار في الأعلى، ولكنه يضيف إجراء لعرض موقع الحدث على الخريطة.

KOTLIN

// بناء غرض من أجل إجراء لعرض خريطه

// معّرف قناة الإشعار

// Build an intent for an action to view a map
val mapIntent = Intent(Intent.ACTION_VIEW)
// The channel ID of the notification.
val id = "my_channel_01"
val mapPendingIntent = Intent(Intent.ACTION_VIEW).let { mapIntent ->
    mapIntent.data = Uri.parse("geo:0,0?q=" + Uri.encode(location))
    PendingIntent.getActivity(this, 0, mapIntent, 0)
}

val notificationBuilder = NotificationCompat.Builder(this, id)
        .setSmallIcon(R.drawable.ic_event)
        .setContentTitle(eventTitle)
        .setContentText(eventLocation)
        .setContentIntent(viewPendingIntent)
        .addAction(R.drawable.ic_map, getString(R.string.map), mapPendingIntent)

JAVA

// Build an intent for an action to view a map
Intent mapIntent = new Intent(Intent.ACTION_VIEW);
// The channel ID of the notification.
String id = "my_channel_01";
Uri geoUri = Uri.parse("geo:0,0?q=" + Uri.encode(location));
mapIntent.setData(geoUri);
PendingIntent mapPendingIntent =
        PendingIntent.getActivity(this, 0, mapIntent, 0);

NotificationCompat.Builder notificationBuilder =
        new NotificationCompat.Builder(this, id)
        .setSmallIcon(R.drawable.ic_event)
        .setContentTitle(eventTitle)
        .setContentText(eventLocation)
        .setContentIntent(viewPendingIntent)
        .addAction(R.drawable.ic_map,
                getString(R.string.map), mapPendingIntent);

 

على الهاتف، يظهر الإجراء كزر إضافي مرفق بالإشعار. على الساعه، يظهر الإجراء في الإشعار الموسع بعد نص المحتوى.

عندما ينقر المستخدم على الإجراء، يتم إستدعاء الغرض المرتبط به على الهاتف.

نصيحة: إذا اشتملت إشعاراتك على إجراء “الرد” (مثل تطبيق المراسلة)، فيمكنك تحسين السلوك من خلال تمكين الردود بالإدخال الصوتي مباشرة من الساعه.

لمزيد من المعلومات، اقرأ إضافة إدخال صوتي كإجراء إشعار.

 

 

إضافة إجراء مضمن

يتيح الإجراء المضمن للمستخدمين، إتخاذ إجراءات بشأن إشعار، من داخل بطاقة تدفق الإشعار.

على الساعه، يظهر الإجراء المضمن كزر إضافي معروض في أسفل الإشعار.

تعتبر الإجراءات المضمنه إختيارية، ولكن يُنصح بها في الحالات التي، يُرجح أن يتخذ المستخدمون فيها إجراء بشأن إشعار..

بعد عرض المحتويات في بطاقة تدفق الإشعار (دون الإنتقال إلى الإشعار الموسع). من أمثلة حالات الإستخدام الجيد للإجراء المضمن في الإشعار. ما يلي:

الرد على رسالة نصية، إيقاف نشاط اللياقة البدنية، أرشفة رسالة بريد إلكتروني.

 

يمكن أن يوفر الإشعار إجراء مضمن واحداً فقط. لعرض الإجراء المضمن كزر إضافي في الإشعار، قم بتعيين الداله ()setHintDisplayActionInline إلى القيمة “صحيح”.

عندما ينقر المستخدم على الإجراء المضمن، فإن النظام يستدعي الغرض الذي حددته في إجراء الإشعار.

قصاصة الكود التاليه تضيف تلميحاً لعرض إجراء مضمن، وتستخدم الداله addAction لإضافة الإجراء المضمن إلى إشعار.

KOTLIN

JAVA 

//Wear OS requires a hint to display the reply action inline.
Action.WearableExtender actionExtender =
    new Action.WearableExtender()
        .setHintLaunchesActivity(true)
        .setHintDisplayActionInline(true);
wearableExtender.addAction(actionBuilder.extend(actionExtender).build());

 

 

 

 

إضافة خصائص ساعه محددة إلى إشعار


إذا احتجت في أي وقت إلى إضافة خصائص محددة للساعة إلى إشعار، مثل إخفاء أيقونة تطبيق من إشعار الساعه..

أو السماح للمستخدمين بفرض إستجابة نصية بإستخدام إدخال صوتي، فيمكنك إستخدام فئة NotificationCompat.WearableExtender لتحديد الخيارات.

لإستخدام واجهة برمجة التطبيقات هذه:

1-  أنشئ مثيل لـ WearableExtender، و أضبط خيارات الساعة المحددة للإشعار.

2-  أنشئ مثيل لـ NotificationCompat.Builder ، وقم بتعيين الخصائص المطلوبة لإشعارك كما هو موضح سابقاً في هذا الدرس.

3- قم بإستدعاء ()extend على الإشعار و قم بتمريره في WearableExtender. هذا يقوم بتطبيق خيارات الساعة على الإشعار.

4- قم بإستدعاء ()build لإنشاء الإشعار.

 

ملاحظة: إذا كنت تستخدم إطار عمل إدارة الإشعارات NotificationManager ، فإن بعض الخصائص من NotificationCompat.WearableExtender لن تعمل..

لذلك تأكد من إستخدام NotificationCompat.

 

يمكنك مزامنة عمليات الطرد (الإلغاء) للإشعارات عبر أجهزة المستخدم. لتمكين الإلغاء لتتم مزامنته، إستخدم الداله ()setDismissalId.

لكل إشعار، قم بتمرير معرف عمومي فريد، كسلسلة، عندما تستدعي الداله ()setDismissalId .

عندما يتم إلغاء الإشعار، يتم إلغاء جميع الإشعارات الأخرى التي لها نفس معرف الإلغاء على الساعة (الساعات) وعلى الهاتف المرتبط. لإسترداد معرف الإلغاء، إستخدم ()getDismissalId.

ملاحظة: لا يتم دعم الداله ()setBackground على نظام الساعات النسخة 2.0. يمكنك إستخدام NotificationCompat.BigPictureStyle للإشعارات التي تتضمن صور.

دالة ()setHintHideIcon غير معتمدة أيضاً على نظام الساعات النسخة 2.0.

 

 

 

 إنشاء إشعارات لأنظمة الساعات

 

حدد إجراءات الساعة فقط


إذا كنت تريد أن تكون الإجراءات المتاحة على الساعة مختلفة عن تلك الموجودة على الهاتف، فإستخدم ()WearableExtender.addAction.

بمجرد إضافة إجراء بإستخدام هذه الداله، لن تعرض الساعه أي إجراءات أخرى تمت إضافتها بإستخدام ()NotificationCompat.Builder.addAction.

لا تظهر الإجراءات المضافة بواسطة ()WearableExtender.addAction  إلا على الساعه ولا تظهر على الهاتف.

 

 

 

 

أضف الإدخال الصوتي كإجراء إشعار

تمثل الإجراءات الصوتية جزء مهم من التجربة الساعه. لإنشاء إجراء يدعم الإدخال الصوتي، قم بإنشاء مثيل RemoteInput.Builder

الذي يمكنك إضافته إلى إجراء إشعارك. بنية الفئة هذه تقبل سلسلة يستخدمها النظام كمفتاح للإدخال الصوتي، والتي ستستخدمها لاحقاً لإسترداد نص الإدخال في التطبيق على هاتفك.

مثال، فيما يلي كيفية إنشاء كائن الإدخال عن بعد RemoteInput الذي يوفر تسمية مخصصة لموجه الإدخال الصوتي:

KOTLIN

JAVA

// Key for the string that's delivered in the action's intent
private static final String EXTRA_VOICE_REPLY = "extra_voice_reply";

String replyLabel = getResources().getString(R.string.reply_label);

RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY)
        .setLabel(replyLabel)
        .build();

 

 

 

 

 

إضافة إستجابات نصية محددة مسبقاً


بالإضافة إلى السماح بالإدخال الصوتي، يمكنك توفير ما يصل إلى خمسة إستجابات نصية يمكن للمستخدم تحديدها للحصول على ردود سريعة. قم بإستدعاء ()setChoices وقم بتمريرها في مصفوفة سلسلة.

 

 

 

 

 

 

 

 

 

 

 

مثال، يمكنك تحديد بعض الإستجابات في مصفوفة مصادر:

res/values/strings.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <string-array name="reply_choices">
        <item>Yes</item>
        <item>No</item>
        <item>Maybe</item>
    </string-array>
</resources>

ثم، قم بتضخيم مصفوفة السلسلة وإضافتها إلى RemoteInput:

KOTLIN

// Key for the string that's delivered in the action's intent
const val EXTRA_VOICE_REPLY = "extra_voice_reply"
...
val remoteInput = resources.getString(R.string.reply_label).let { replyLabel ->
    resources.getStringArray(R.array.reply_choices).let { replyChoices ->
        RemoteInput.Builder(EXTRA_VOICE_REPLY)
                .setLabel(replyLabel)
                .setChoices(replyChoices)
                .build()
    }
}

JAVA

public static final String EXTRA_VOICE_REPLY = "extra_voice_reply";
...
String replyLabel = getResources().getString(R.string.reply_label);
String[] replyChoices = getResources().getStringArray(R.array.reply_choices);

RemoteInput remoteInput = new RemoteInput.Builder(EXTRA_VOICE_REPLY)
        .setLabel(replyLabel)
        .setChoices(replyChoices)
        .build();

 

 

 

 

إستلام الإدخال الصوتي كسلسلة

لاستلام رسالة المستخدم المنسوخة في النشاط الذي قمت بالإعلان عنه في غرض إجراء الرد، قم بإستدعاء ()getResultsFromIntent، وقم بتمريره في غرض إجراء “الرد”.

ترجع هذه الداله حزمة تحتوي على إستجابة النص. يمكنك بعد ذلك الإستعلام عن الحزمة للحصول على الإستجابة.

ملاحظة: لا تستخدم ()Intent.getExtras للحصول على نتيجة صوتيه، لأنه يتم تخزين الإدخال الصوتي كقصاصة بيانات ClipData.

توفر دالة ()getResultsFromIntent طريقة ملائمة لإستلام تسلسل أحرف دون الحاجة إلى معالجة قصاصة البيانات بنفسك.

 

تعرض الأكواد التالية دالة تقبل غرض وتقوم بإرجاع الإستجابة الصوتية، التي يشار إليها بواسطة المفتاح EXTRA_VOICE_REPLY المستخدم في الأمثلة السابقة:

KOTLIN 

/**
 * Obtain the intent that started this activity by calling
 * Activity.getIntent() and pass it into this method to
 * get the associated voice input string.
 */

private fun getMessageText(intent: Intent): CharSequence? =
        RemoteInput.getResultsFromIntent(intent)?.run {
            getCharSequence(EXTRA_VOICE_REPLY)
        }

JAVA

/**
 * Obtain the intent that started this activity by calling
 * Activity.getIntent() and pass it into this method to
 * get the associated voice input string.
 */

private CharSequence getMessageText(Intent intent) {
    Bundle remoteInput = RemoteInput.getResultsFromIntent(intent);
    if (remoteInput != null) {
        return remoteInput.getCharSequence(EXTRA_VOICE_REPLY);
    }
    return null;
}

 

KOTLIN

// Create an intent for the reply action
val actionPendingIntent = Intent(this, ActionActivity::class.java).let { actionIntent ->
    PendingIntent.getActivity(this, 0, actionIntent,
            PendingIntent.FLAG_UPDATE_CURRENT)
}
// Create the action
val action = NotificationCompat.Action.Builder(
        R.drawable.ic_action,
        getString(R.string.label),
        actionPendingIntent
).build()

// Build the notification and add the action via WearableExtender
var notification = NotificationCompat.Builder(context)
        .setSmallIcon(R.drawable.ic_message)
        .setContentTitle(getString(R.string.title))
        .setContentText(getString(R.string.content))
        .extend(NotificationCompat.WearableExtender().addAction(action))
        .build()

JAVA

// Create an intent for the reply action
Intent actionIntent = new Intent(this, ActionActivity.class);
PendingIntent actionPendingIntent =
        PendingIntent.getActivity(this, 0, actionIntent,
                PendingIntent.FLAG_UPDATE_CURRENT);

// Create the action
NotificationCompat.Action action =
        new NotificationCompat.Action.Builder(R.drawable.ic_action,
                getString(R.string.label), actionPendingIntent)
                .build();

// Build the notification and add the action via WearableExtender
Notification notification =
        new NotificationCompat.Builder(context)
                .setSmallIcon(R.drawable.ic_message)
                .setContentTitle(getString(R.string.title))
                .setContentText(getString(R.string.content))
                .extend(new WearableExtender().addAction(action))
                .build();

 

 

 

 

 

إطلاق الإشعارات من تطبيقات الساعات المستقلة


إنشاء إشعارات من تطبيق ساعة مستقل لا يختلف عن إنشاء الإشعارات الموصولة. الإشعارات التي يتم الحصول عليها من تطبيق الساعه المحلي..

تشبه الإشعارات الموصولة “أي المتلقاه من تطبيق على الهاتف” ولكنها تتصرف بشكل مختلف قليلاً.

إذا لم يتم تعيين أي غرض محتوى contentIntent أو إذا تم توصيل الإشعار من هاتف مقترن، فسيؤدي النقر على الإشعار إلى فتح إشعار موسع.

وحيث إن الإشعار مصدره تطبيق ساعه مستقل “محلي”، فإن النقر على الإشعار سيؤدي إلى إطلاق المحتوى لبدء فتح تطبيق الساعه.

للتعرف على كيفية إنشاء إشعارات من تطبيق مستقل وتقليد سلوك الإشعارات الموسعه، راجع نموذج إشعارات الساعه.

بشكلٍ إفتراضي، يتم توصيل الإشعارات من تطبيق على هاتف مصاحب إلى الساعة المقترنة. إذا كنت بصدد إنشاء تطبيق ساعة مستقل..

وكان لديك تطبيق هاتف مصاحب، فقد ينشئ التطبيقان إشعارات مكررة. للحصول على معلومات حول كيفية التعامل مع مشكلة الإشعارات المكررة، راجع وضع التوصيل “التجسير” Bridging للإشعارات.

 

 


للإطلاع على المقال باللغة الإنجليزية أضغط هنا.

الإعلانات