برمجة الاشعارات في تطبيقات الاندرويد

هذه المقالة تسلط الضوء على كيفية إنشاء االاشعارات (الـ Notification) في نظام الاندرويد بشكل محترف وبأفضل الطرق.

Mohammad Laifمنذ 5 سنوات

بسم الله الرحمن الرحيم
السلام عليكم ورحمة الله وبراكته

 

كيفية إنشاء االاشعارات (الـ Notification) في نظام الاندرويد بشكل محترف وبأفضل الطرق من خلال صنع كلاس خاصة بالاشعارات واستخدامها بسهوله وفي اكثر من مشروع بدون اعادة كتابتها.

 

 هذه المقالة تشرح طريقة صنع الاشعارات بلغة الجافا, اي من خلال البرمجة, لذلك من الافضل اولاً القاء نظرة على شكل تصميم الاشعارات من خلال الصفحة Android notifications - Material Design.

 

ماذا ستقرئ في هذه المقالة؟

  • ماهي الاشعارات.
  • المشاكل التي سوف تقوم بحلها هذه المقالة.
  • نبذة عن ماذا سوف نقوم بإنشائه.
  • أين سنقوم بإستخدام هذه الكلاس.
  • فهم كلاس الاشعارات NotificationUtils التي سنقوم بإنشائها.
  • إنشاء كلاس الاشعارات.
  • طريقة تشغيل الاشعارات مباشرةً وفي اوقات مؤقته. وذلك بإستخدام إما Alarm Manager او Android JobSchedualer او Firebase JobDispatcher او WorkManager كما جاء في الدروس المتعلقة بالتزامن في نظام الاندرويد.

 

ماهي الاشعارات

الاشعارات عبارة عن رسائل يقوم تطبيقك بإرسالها الى نظام الاندرويد ليقوم بدوره بعرضها الى المستخدم لإعلامه بإحداث ومعلومات انت تحددها. كما تستطيع جعل المستخدم يتخطاب مع تطبيقك من خلال هذه الاشعارات. كمثال عندما يقوم المستخدم بالضغظ على الاشعار يعمل تطبيقك (او اي Activity تقوم بتحديدها انت), ايضاً تستطيع وضع ازرار في الاشعارات تمكن المستخدم المزيد من التخاطب مع تطبيقك.

 

المشاكل التي سوف تحلها هذه المقالة

  • إنشاء كلاس خاصة بالاشعارات, حتى يتمكن المبرمج بإستخدامها في عدة مشاريع بدون الحاجة لكتابتها من جديد.
  • طريقة صنع الاشعار متوافق مع النسخ القديمة والجديدة من نظام الاندرويد.
  • طريقة تحديث الاشعار.
  • اضافة ازرار للإشعار.
  • لمحة بسيطة على طريقة تشغيل الاشعارات في اوقات مختلفه.

 

ماذا سننشئ؟

لن نقوم بوضع الاسطر البرمجية لإشعاراتنا مبعثره في المشروع بل سنقوم بجمعها في كلاس واحده بإسم NotificationUtils. وهكذا نستطيع استخدامها في اكثر من جزئية في المشروع, بل حتى تستطيع نسخها واستخدامها في مشروع اخر بدلاً من برمجتها من جديد (تقريبا مبدأ الـ Code Reuse), وتستطيع بناء مكتبة منها لمشاركتها مع الاخرين او استخدامها في مشاريع اخرى بشكل اسرع وافضل من النسخ واللصق.

 

أين سنقوم بإستخدام هذه الكلاس؟

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

NotificationUtils.showNotification(this, title, body);
  • الـ NotificationUtils هو اسم الكلاس الذي سنقوم بعمله.
  • الـ showNotification هي دالة موجودة بالكلاس سنقوم بعملها ايضاً وظيفتها صنع وإظهار الاشعارات.
  • الـ title العنوان المراد للإشعار.
  • الـ body كمحتوى للإشعار.
  • الـ this ترجع الى الـ Context الذي نريد تشغيل واطلاق الاشعار منه سواء كان Activity او Service وما الى ذلك.

 

فهم كلاس الاشعارات NotificationUtils التي سنقوم بإنشائها 

قبل كل شئ علينا معرفة من ماذا سوف تتكون كلاس الـ NotificationUtils التي سنقوم بعملها؟

هي مثل اي كلاس اخرى تحتوي على ٣ اقسام وهي الحقول ودالة الـ Constructor والدوال الاخرى.

 

الحقول:

  • بعض الحقول والتي تحمل الـ ID للإشعار ويمكننا من تحديثه او الغائه لاحقاً.
  • حقل عنصر من NotificationCompat.Builder من خلاله نقوم ببناء الاشعارات.
  • حقل عنصر من NotificationManager هو المسؤل عن ارسال اشعاراتنا الى نظام الاندرويد ليعرضها الى المستخدم.
  • حقل عنصر Boolean بإسم isNotificationNew حتى نستعلم هل هناك اشعار معروض ام لا من هذه الكلاس.

 

الـ Constructor:

سنقوم بجعل الـ Constructor خاص اي Private حتى لانخطئ ونعمل Init لعناصر هذه الكلاس في مشروعنا. فنحن لانحتاج لإنشاء عناصر من هذه الكلاس, سنقوم بإستخدام دوالها كـ Static في إي جزئية.

 

الدوال:

  • دالة showNotification: هي المسؤلة عن اظهار الاشعارات. فيها سنقوم بكتابة الاسطر البرمجية لبناء الاشعارات بإستخدام عنصر الحقل NotificationCompat.Builder.
  • دالة updateNotification: لتحديث الاشعارات. مثلاً لو اردنا تحديث احد الاشعارات لاحقاً. كتحديث لإشعار عداد وقت او Progress Bar لشئ يتم تحميله من الانترنت.
  • دالة contentIntent: دالة مساعدة. تكمن وظيفتها في صناعة PendingIntent للـ Activity التي نريد منها ان تعمل عندما يضغظ المستخدم على الاشعار.
  • دالة largeIcon: دالة مساعدة. تكمن وظيفتها في صناعة صورة نقطيه بحجم كبير من الـ Drawable Resource.
  • دالة clearNotifications: نستخدمها لإزالة الاشعارات من واجهة المستخدم بعد اتمام عملها.
  • دالة الـ shareNotification: تساعدنا في مشاركة الاشعار.
  • دالة actionShareNotification: دالة مساعدة ستقوم بصناعة Action, لنضعه كزر في الاشعار. وظيفتها هي مشاركة الاشعار بإستخدام الدالة shareNotification عندما يقوم المستخدم بالضغظ عليها.
  • دالة actionClearNotifications: دالة مساعدة لصنع Action, لنضعه كزر في الاشعار. وظيفتها تنظيف الاشعارات عندما يقوم المستخدم بالضغظ عليها.

 

الدوال المساعدة؟
نستطيع الاستغناء عن هذه الدوال وكتابة الاسطر البرمجية في الدالة الرئيسية showNotification, ولكن ليكون الوضع منضم لدينا قمنا بفصل الجزئيات التي نعتقد اننا سوف نقوم بتحريرهم واستخدامهم في اكثر من موضع في المستقبل (القليل من مبدأ التجريد الـ Abstraction).

 

إنشاء كلاس الاشعارات NotificationUtils

إنشاء الحقول

قبل كل شئ علينا اولاً ان ننشئ الحقول كالتالي:

private static final int NOTIFICATION_ID = 9000;
private static final int PENDING_INTENT_ID = 9001;
private static final String NOTIFICATION_CHANNEL_ID = "notification_channel_name";
private static NotificationCompat.Builder mNotificationBuilder;
private static NotificationManager mNotificationManager;
private static boolean isNotificationNew = true;
  • الحقل NOTIFICATION_ID: يعتبر الـ ID الخاص بالاشعار الذي سوف نقوم بصنعه, من خلاله نستطيع تحديث والغاء الاشعار.
  • الحقل PENDING_INTENT_ID: يعتبر الـ ID الخاص بالـ Pending Intent التي تعمل على فتح Activity ما عندما يقوم المستخدم بالضغظ على الاشعار.
  • الحقل NOTIFICATION_CHANNEL_ID: يعتبر الـ ID الخاص بالقناة التي من خلالها نقوم بعرض الاشعار في نظام الاندرويد للإصدار ٨٫٠ ومافوق.
  • الحقل mNotificationBuilder: من خلال هذا الحقل سنقوم ببناء الاشعار الخاص بنا.
  • الحقل mNotificationManager: من خلال هذا الحقل نقوم بإرسال الاشعار من التطبيق الى نظام الاندرويد ليعرضها الى المستخدم.
  • الحقل isNotificationNew: للتأكد هل تم عرض الاشعار ام لا. حتى لو اردنا تحديثه لاحقاً اذا كان معروض.

 

إنشاء الـ Constructor

قمنا بجعله private حتى نلغي عمل instantiate العناصر لهذه الكلاس. تذكر اننا سنقوم بإستخدام دوال هذه الكلاس بشكل static من اماكن مختلفه في التطبيق:

private NotificationUtils() {}

 

إنشاء الدوال

دالة الـ showNotification
هذه الدالة هي المسؤوله عن بناء الاشعار وعرضه للمستخدم, سنقوم بجعلها ثابته وعامه static و public حتى نستطيع النداء عليها واستخدامها في اي جزئية للتطبيق. ايضاً سنجعلها تقوم بإخد ثلاثة معطيات الاول عبارة عن Context و عنصرين من نوع String يمثلان العنوان والمحتوى للإشعار:

public static void showNotification(Context context, String title, String body) {
}

 

تستطيع تمرير ماتشاء استخدامه هنا, ولكن من المهم هو تمرير الـ Context حتى يعمل الاشعار.

 

 في البداية نقوم بالتأكد هل تم عرض الاشعار ام لا بإستخدام الحقل isNotificationNew وإذا كان كذلك فسنقوم بنداء الدالة updateNotification لتحديث الاشعار والتي سنقوم بإنشائها لاحقاً:

if (isNotificationNew == false) {
    updateNotification(title, body);
    return;
}

 

ثم نقوم بعمل Initialization للعنصر mNotificationManager والذي من خلاله سنقوم بإرسال الاشعار الى النظام بعد ان ننتهي من بنائه لاحقاً:

mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

 

الان نقوم بصنع قناة Channel وهذا الشئ ضروري لتشغيل الاشعار على الانظمة الحديثة من الاندرويد ٨٫٠ وما فوق كالتالي:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
    String name = "Awesome Notification Channel";
    String description = "This channel shows only awesome notification";
    int importance = NotificationManager.IMPORTANCE_HIGH;

    NotificationChannel channel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, name, importance);
    mNotificationManager.createNotificationChannel(channel);

    channel.setDescription(description);
}
  • قمنا بالتأكد عن نوع الاصدارة لجهاز المستخدم لإنشاء هذه القناة فقط اذا كان متوافق, اي اما نظام Android O او احدث.
  • لإنشاء قناة نحتاج الى إنشاء اسم لها كما هو بالعنصر name.
  • والى وصف كما هو بالعنصر description.
  • وايضاً الى درجة الاولوية المراده كما هو بالعنصر importance.
  • ثم نقوم بإنشاء القناة بإستخدام NotificationChannel.
  • وإخيراً لإنشاء هذه القناة وتمريرها الى نظام الاندرويد نقوم بإستخدام العنصر mNotificationManager والدالة createNotificationChannel.

 

القنوات؟

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

مثلاً قناة لعرض التنبيهات المهمه جداً, وقناة اخرى لعرض التنبيهات الغير مهمه او العشوائية. بحيث لو ان المستخدم قام بمنع القناة الثانية فهذا لن يؤثر على التنبيهات المهمه جداً. 

معلومات مفصلة اكثر عن القنوات في المصدر Create and Manage Notification Channels.

 

الان سوف نقوم ببناء الاشعار بإستخدام العنصر mNotificationBuilder من نوع NotificationCompat.Builder كالتالي:

mNotificationBuilder = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)

 

لاحظ اننا لم ننهي السطر البرمجي السابق بالـ ; حتى نتمكن من تخصيص هذا الاشعار كالتالي:

.setGroup(NotificationCompat.CATEGORY_REMINDER)
.setGroupSummary(true)
.setSmallIcon(R.drawable.notification_small_icon)
.setLargeIcon(largeIcon(context))
.setContentTitle(title)
.setContentText(body)
.setStyle(new NotificationCompat.BigTextStyle().bigText(body))
.setContentIntent(contentIntent(context))
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.addAction(actionOne(context))
.addAction(actionTwo(context))
.setAutoCancel(true)
;

شرح للخصائص:

  • الـ setGroup: لجمع الاشعارات في إشعار واحد.
  • الـ setGroupSummary: لاحق للخاصيه السابقه.
  • الـ setSmallIcon: لوضع صورة مصغره للإشعار تعتبر كصوره مشابهه للتطبيق, ولكن يجب الانتباه بإنها يجب ان تكون شبه شفافه وذي لونين ومن نوع xml حتى يتمكن نظام الاندرويد من عرضها.
  • الـ setLargeIcon: صورة كبيره تظهر في الاشعار. سنقوم بتصميم دالة largeIcon كدالة مساعدة لتوليد هذه الصورة لاحقاً.
  • الـ setContentTitle: عنوان الاشعار.
  • الـ setContentText: محتوى الاشعار.
  • الـ setStyle: شكل الاشعار, قمنا بإختيار BigTextStyle وهو لعرض نص طويل. للمزيد من الاشكال الاخرى على الرابط Create an Expandable Notification.
  • الـ setContentIntent: من خلالها نرفق الـ ContentIntent للـ Activity المراد تشغيلها عندما يضغظ المستخدم على الاشعار.
  • الـ setVisibility: بجعلها VISIBILITY_PUBLIC نتمكن من عرض الاشعار في شاشة قفل الهاتف.
  • الـ addAction: لإضافة ازرار للإشعار. سنقوم بتصميم دالتين مساعدتين لاحقاً بإسم actionOne و actionTwo لتصميم هذه الازرار.
  • الـ setAutoCancel: حتى نلغي الاشعار عندما يقوم المستخدم بالضغظ علىيه.

 

ليصبح شكل الاشعار على النحو التالي:

 

يوجد المزيد من الاشكال على الرابط: Create an Expandable Notification. وايضاً يوجد المزيد من الخصائص لبناء وتخصيص الاشعار على الرابط: NotificationCompat.Builder.

 

والان نقوم بإضافة الاولوية للإشعار حسب متطلب اصدار الاندرويد ٧٫١ واقل:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
    mNotificationBuilder.setPriority(NotificationCompat.PRIORITY_MAX);
}

 

واخيراً نقوم ببناء الاشعار وإرساله الى النظام بإستخدام الدالة notify من الحقل mNotificationManager كالتالي:

mNotificationManager.notify(NOTIFICATION_ID, mNotificationBuilder.build());
isNotificationNew = false;
  • ايضاً لاننسى تغير قيمة الحقل isNotificationNew من true الى false حتى نستطيع عمل تحديث للإشعار لاحقاً.

 

الدالة كاملة:

    public static void showNotification(Context context, String title, String body) {
        if (isNotificationNew == false) {
            updateNotification(title, body);
            return;
        }

        // Create a Notification Manager
        mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);

        // Create Notification Channel on Android 8.0 and Above.
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
            // Prepare name, description, and importance (PRIORITY) for our channel. More about: Set the importance level at: https://developer.android.com/training/notify-user/channels#importance
            String name = "Awesome Notification Channel";
            String description = "This channel shows only awesome notification";
            int importance = NotificationManager.IMPORTANCE_HIGH;

            // Create the Channel (Registering the channel with the system).
            NotificationChannel channel = new NotificationChannel(NOTIFICATION_CHANNEL_ID, name, importance);
            mNotificationManager.createNotificationChannel(channel);

            // Should it pass Do Not Disturb?
            // channel.setBypassDnd(true);

            // Set its description
            channel.setDescription(description);
        }


        // Create the Notification with the Builder
        mNotificationBuilder = new NotificationCompat.Builder(context, NOTIFICATION_CHANNEL_ID)

                // Put all notifications under one as a group
                .setGroup(NotificationCompat.CATEGORY_REMINDER)
                .setGroupSummary(true)

                // Required icon for the notification.
                .setSmallIcon(R.drawable.notification_small_icon)

                // Optional large icon for the notification event
                .setLargeIcon(largeIcon(context))

                // Title text
                .setContentTitle(title)

                // Body text
                .setContentText(body)

                // If you want more text use Style For longer text
                // Want more? Check: Create an Expandable Notification at:
                // https://developer.android.com/training/notify-user/expanded
                .setStyle(new NotificationCompat.BigTextStyle().bigText(body))

                // ContentIntent an intent to open when the user tap on the notification (We used our helper method):
                .setContentIntent(contentIntent(context))

                // Show notification on lock screen
                .setVisibility(NotificationCompat.VISIBILITY_PUBLIC)

                // Actions
                .addAction(actionShareNotification(context, title, body))
                .addAction(actionClearNotifications(context))

                // Used if you want to update the notification in silent.
                // .setOnlyAlertOnce(true)

                // Close the notification when user tap on it
                .setAutoCancel(true);

        // More Configuration to the notificationBuilder
        // Notification Intrusive (PRIORITY) on Android 7.1 and Lower.
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN && Build.VERSION.SDK_INT < Build.VERSION_CODES.O) {
            mNotificationBuilder.setPriority(NotificationCompat.PRIORITY_MAX);
        }


        // Build it
        mNotificationManager.notify(NOTIFICATION_ID, mNotificationBuilder.build());
        isNotificationNew = false;
    }

 

هكذا قمنا بصناعة اشعار, تستطيع الاكتفاء بهذا القدر لإظهار الاشعارات في تطبيق.


دالة الـ updateNotification
في هذه الدالة سوف نقوم بتحديث الـ Builder الذي قمنا ببناء الاشعار به وهو الحقل mNotificationBuilder. ايضاً ستأخد هذه الدالة كمعطيات العنوان والمحتوى للإشعار. واخيراً سنقوم بإستخدام الحقل mNotificationManager لإرسال الاشعار الى النظام ليحدثه لتصبح بالشكل:

public static void updateNotification(String title, String body) {
    mNotificationBuilder
        .setContentTitle(title)
        .setContentText(body)
        .setStyle(new NotificationCompat.BigTextStyle().bigText(body))
        .setOnlyAlertOnce(true)
;

 mNotificationManager.notify(NOTIFICATION_ID, mNotificationBuilder.build());
}
  • قمنا بإستخدام setOnlyAlertOnce حتى لاينزعج المستخدم من صوت الاشعار عند تحديثه.
  • ايضاً لاتنسى اننا قمنا بإستخدام رقم الـ NOTIFICATION_ID لتحديث الاشعار المراد.

 

دالة الـ ContentIntent

دالة مساعدة. تكمن وظيفتها في صناعة PendingIntent للـ Activity التي نريد منها ان تعمل عندما يضغظ المستخدم على الاشعار كالتالي:

private static PendingIntent contentIntent(Context context) {
    Intent startActivityIntent = new Intent(context, MainActivity.class);
    return PendingIntent.getActivity(
            context,
            PENDING_INTENT_ID,
            startActivityIntent,
            PendingIntent.FLAG_UPDATE_CURRENT);
}
  • لاحظ ان هذه الدالة تحتاج الى Context لصنع PendingIntent.
  • استخدمنا الكلاس MainActivity التي نريد تشغيلها عند الضغظ على الاشعار.
  • استخدمنا الحقل PENDING_INTENT_ID للإشارة لهذه الـ Intent.
  • واخيراً استخدمنا التاج FLAG_UPDATE_CURRENT لتحديث الـ PendingIntent القدميه بالجديدة إن وجد.

 

للمزيد حول الـ PendingIntent.

 

دالة الـ largeIcon

دالة مساعدة. تكمن وظيفتها في صناعة صورة نقطيه بحجم كبير من الـ Drawable Resource كالتالي:

private static Bitmap largeIcon(Context context) {
    Resources res = context.getResources();
    Bitmap largeIcon = BitmapFactory.decodeResource(res, R.drawable.notification_big);
    return largeIcon;
}
  • لاحظ الصورة المرادة هي الموجودة في المسار: R.drawable.notification_big.

 

دالة الـ clearNotifications

هذه الدالة تساعدنا في تنظيف جميع الاشعارات الظاهره للمستخدم من تطبيقنا, بعض الاحيان نحتاج الى ندائها قبل اظهار اي اشعار جديد, وهي كالتالي:

public static void clearNotifications(Context context) {
    NotificationManager notificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
    notificationManager.cancelAll();
}

 

دالة الـ shareNotification

هذه الدالة تساعدنا في مشاركة الاشعار. تقوم بإستقبال Context وعنوان ومحتوى لمشاركته في التطبيقات الاخرى كالوتساب وماشبه ذلك كالتالي:

public static void shareNotification(Context context, String title, String body){
    StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append(title);
    stringBuilder.append("\n");
    stringBuilder.append(body);
    Intent intent = new Intent(Intent.ACTION_SEND);
    intent.setType("text/plain");
    intent.putExtra(Intent.EXTRA_TEXT, stringBuilder.toString());
    context.startActivity(intent.createChooser(intent, "Choose the app you want to share on it"));
}

 

دالة الـ actionShareNotification

هذه الدالة ستقوم بصناعة Action لنا, لنضعه كزر في الاشعار. وظيفتها هي مشاركة الاشعار بإستخدام الدالة shareNotification. ولكن اولاً علينا معرفة من ماذا يتكون الـ Action.

 

من ماذا يتكون الـ Action
لصنع Action علينا اولاً ان نقوم بتغليف الشفرة البرمجية المراد تشغيلها (تلك الشفره هي المغلفه في الدالة shareNotification) عند استدعاء هذا الـ Action في Service ومن الاسهل استخدام Intent Service كما جاء في الدرس: انشاء الـ Intent Service من الدورة: التزامن في نظام الاندرويد. ثم نقوم بتغليف هذه الـ Intent بداخل PendingIntent ومن ثم نقوم ببناء الـ Action.

 

 اي اننا سنحتاج الى: Service و Intent و PendingIntent لصناعة Action.

وحتى لانكرر صناعة كلاسات الـ Service سنقوم بصناعة كلاس واحدة بإسم NotificationService وسوف نتبع نمط المهام كما جاء في المقالة: ترتيب المهام في نظام الاندرويد (في المقالة اسم الكلاس هي TaskService).

 

وتصبح الدالة على هذا الشكل:

private static NotificationCompat.Action actionShareNotification(Context context, String title, String body) {
    Intent intent = new Intent(context, NotificationService.class);
    intent.setAction(AppTask.ACTION_SHARE);
    intent.putExtra("TITLE_KEY", title);
    intent.putExtra("BODY_KEY", body);

    PendingIntent pendingIntent = PendingIntent.getService(
            context,
            PENDING_INTENT_ID,
            intent,
            PendingIntent.FLAG_CANCEL_CURRENT
    );

    NotificationCompat.Action action = new NotificationCompat.Action(
            R.drawable.notification_share_icon,
            context.getString(R.string.share),
            pendingIntent
    );

    return action;
}
  • لاحظ المدخلات للدالة مثلا الـ Context نحتاجة لصناعة الـ action وايضاً الـ PendingIntent.
  • قمنا بصناعة Intent عبارة عن IntentService حتى نقوم بتشغيل الشفرة البرمجية في خيط حاسوبي مختلف. وكذلك قمنا بإرفاق العنوان والمحتوى للإشعار لها.
  • ايضاً قمنا بوضع action للـ Intent مستخدمين نمط لترتيب المهام وتشغيلهم في خيوط مختلفه. كما في المقالة:
  • في الجزئية الثانية قمنا بصناعة الـ PendingIntent.
  • وفي النهاية قمنا بصناعة الـ Action.

 

دالة الـ actionClearNotifications

مشابهه للدالة السابقة لصنع action خاص بتنظيف الاشعارات, وتكون الشفرة البرمجية كالتالي:

private static NotificationCompat.Action actionClearNotifications(Context context) {
    Intent intent = new Intent(context, NotificationService.class);
    intent.setAction(AppTask.ACTION_CLEAR_ALL_NOTIFICATION);

    PendingIntent pendingIntent = PendingIntent.getService(
            context,
            PENDING_INTENT_ID,
            intent,
            PendingIntent.FLAG_CANCEL_CURRENT
    );

    NotificationCompat.Action action = new NotificationCompat.Action(
            R.drawable.notification_clear_icon,
            context.getString(R.string.cancel),
            pendingIntent
    );
    
    return action;
}

 

طريقة تشغيل الاشعارات

لتشغيل الاشعار بشكل مباشر, كالضغظ على زر او عند حدوث حدث معين كحذف عنصر وماشبه ذلك فالامر سهل جداً. قم بإستخدام الكلاس التي انشئناها كالتالي:

NotificationUtils.showNotification(this, title, body);

 

اما لتشغيل الاشعار بشكل غير مباشر, كتوقيته بإستخدام احد Alarm Manager او Android JobSchedualer او Firebase JobDispatcher او WorkManager كما جاء في الدروس المتعلقة بالتزامن في نظام الاندرويد. فسيكون الوضع كالتالي بإستخدام الـ Work Manager:

 

إنشاء كلاس Worker:

public class TimerWithWorkManager extends Worker {

    public TimerWithWorkManager(@NonNull Context context, @NonNull WorkerParameters workerParams) {
        super(context, workerParams);
    }

    @NonNull
    @Override
    public Result doWork() {
        NotificationUtils.showNotification(getApplicationContext(), "MyTitle", "MyBody");
        return Result.success();
    }
}
  • لاحظ استخدام كلاسنا للإشعارات NotificationUtils بدالة الدالة doWork.

 

توقيت الكلاس للعمل بعد دقيقتان لإظهار الاشعار:

        Constraints constraints = new Constraints.Builder()
                .build();

        OneTimeWorkRequest oneTimeWorkRequest = new OneTimeWorkRequest.Builder(TimerWithWorkManager.class)
                .setConstraints(constraints)
                .addTag("MY_WORK_MANAGER_TAG_ONE_TIME")
                .setInitialDelay(2, TimeUnit.MINUTES)
                .build();

        WorkManager.getInstance().enqueue(oneTimeWorkRequest);

 

للمزيد حول الـ Work Manager راجع: استخدام الـ WorkManager من حزمة JetPack.

 

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


المصادر

كلمات دليلية: android java
2
إعجاب
7922
مشاهدات
1
مشاركة
3
متابع

التعليقات (2)

ابو يوسف الحازمي:

تسلم يامبدع

Ahmed Almansour:

شكرا لك ويعطيك ألف عافية

لايوجد لديك حساب في عالم البرمجة؟

تحب تنضم لعالم البرمجة؟ وتنشئ عالمك الخاص، تنشر المقالات، الدورات، تشارك المبرمجين وتساعد الآخرين، اشترك الآن بخطوات يسيرة !