دمج إشعارات الجوّال

بدءًا من المستوى 26 لواجهة برمجة تطبيقات Android، يجب توفُّر إشعارات دائمة والخدمات التي تعمل في المقدّمة. يهدف هذا الشرط إلى منعك من إخفاء والخدمات التي قد تضع متطلبات مفرطة على موارد النظام، بما في ذلك البطارية على وجه الخصوص. يخلق هذا الشرط مشكلة محتملة: إذا كان التطبيق إذا كان لديك عدة خدمات تعمل في المقدّمة، فلا يدير الإشعار بعناية لذا أنه تتم مشاركته عبر جميع الخدمات، فقد يكون هناك العديد من التحديثات الإشعارات غير القابلة للإغلاق، مما يؤدي إلى فوضى غير مرحب بها في القائمة النشطة الإشعارات.

تصبح هذه المشكلة أكثر صعوبة عند استخدام حِزم تطوير البرامج (SDK) مثل قسم "التنقل" حزمة تطوير برامج (SDK) تعمل على تشغيل الخدمات التي تعمل في المقدّمة بشكل مستقل عن التطبيق الخاصة بها بشكل مستمر ومستقل، ما يجعل من الصعب دمجها. لمعالجة هذه المشكلات، قدم الإصدار 1.11 من حزمة تطوير البرامج (SDK) للتنقل واجهة برمجة تطبيقات بسيطة المساعدة في إدارة الإشعارات الدائمة على مستوى التطبيق، بما في ذلك الإشعارات داخل حزمة تطوير البرامج (SDK)

دمج الإشعارات المستمرة

المكونات

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


تحتوي حزمة SDK للتنقل على طرق ثابتة لإعداد ضربة "ForegroundServiceManager" المفردة. لا يمكن إعداد هذا المفرد سوى مرة واحدة في عمر حزمة SDK للتنقل. وبالتالي، إذا كنت تستخدم إحدى (initForegroundServiceManagerMessageAndIntent() أو initForegroundServiceManagerProvider())، عليك أن تحيط مع كتلة تجربة في حالة إعادة إدخال هذا المسار. حزمة SDK للتنقّل تعرض استثناء بيئة تشغيل إذا قمت باستدعاء إحدى الطريقتين أكثر من مرة إلا إذا عليك أولاً محو جميع الإشارات إلى ForegroundServiceManager ثم الاتصال clearForegroundServiceManager() قبل كل مكالمة لاحقة.

المعلمات الأربع لـ initForegroundServiceManagerMessageAndIntent() هي application وnotificationId وdefaultMessage وresumeIntent إذا كانت تكون المعلمات الثلاث الأخيرة فارغة، فإن الإشعار هو المعيار إشعار حزمة تطوير البرامج (SDK) للتنقّل لا يزال من الممكن إخفاء المقدّمة الأخرى في التطبيق وراء هذا الإشعار. المَعلمة notificationId معرّف الإشعار الذي يجب استخدامه للإشعار. إذا كان null، فسيتم استخدام قيمة عشوائية. يمكنك تعيينه بشكل صريح للعمل على يتعارض مع إشعارات أخرى، مثل الإشعارات الواردة من حزمة تطوير برامج (SDK) أخرى. تشير رسالة الأشكال البيانية defaultMessage هو سلسلة يتم عرضها عندما لا يكون النظام التنقل. النوع resumeIntent هو هدف يتم تنشيطه عند تلقّي الإشعار. النقر عليه. إذا لم يتم تحديد قيمة للسمة resumeIntent، يتم النقر على الإشعار. وتجاهلها.

معلمات initForegroundServiceManagerProvider() الثلاث هي application وnotificationId وnotificationProvider إذا كانت النتيجة النهائية تكون هناك معلمتان فارغتان، فإن الإشعار هو حزمة SDK القياسية للتنقل . تحدّد المعلَمة notificationId معرّف الإشعار الذي المرصود في الإشعار. إذا كانت القيمة خالية، فإن القيمة العشوائية هي استخدام البيانات المختلفة. يمكنك تعيينه بشكل صريح لتفادي التعارضات مع مثل الإشعارات التي تصلك من حزمة تطوير برامج (SDK) أخرى إذا كانت قيمة السمة notificationProvider هي فإن المزود مسئول دائمًا عن إنشاء الإشعار ليتم عرضه.

تعرض طريقة حزمة SDK للتنقل getForegroundServiceManager() مدير الخدمة التي تعمل في المقدّمة في سينغلتون. إذا لم تكن قد أنشأت واحدًا بعد، فحينئذٍ ويعادل ذلك استدعاء initForegroundServiceManagerMessageAndIntent() ذات معلمات فارغة للعناصر notificationId وdefaultMessage resumeIntent

تتوفر ثلاث طرق بسيطة في ForegroundServiceManager. أولهما من أجل نقل خدمة من وإلى المقدّمة، ويتم استدعاؤها عادةً من ضمن الخدمة التي تم إنشاؤها. يضمن استخدام هذه الطرق الخدمات المرتبطة بالإشعار المشترَك الدائم. المباراة النهائية updateNotification()، تُعلم المدير بأن الإشعار بتغييره ويجب إعادة عرضه.

إذا كنت بحاجة إلى التحكّم الكامل في الإشعار الدائم المشترَك، عندها توفّر واجهة برمجة التطبيقات واجهة NotificationContentProvider لتحديد مزوّد خدمة الإشعارات، الذي يحتوي على طريقة واحدة لتلقّي الإشعارات مع المحتوى الحالي. كما أنه يوفر فئة أساسية يمكنك يمكنك استخدامها اختياريًا للمساعدة في تحديد المزود. وأحد أهم فوائد هي أنه يوفر طريقة لطلب البيانات بـ updateNotification() بدون يحتاج إلى الوصول إلى ForegroundServiceManager. إذا كنت تستخدم مثيلاً للدالة بمزود الإشعارات لتلقي رسائل إشعارات جديدة، يمكنك الاتصال بهذا طريقة داخلية مباشرةً لعرض الرسالة في الإشعار.

سيناريوهات الاستخدام

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

إخفاء الإشعارات الدائمة للخدمات الأخرى التي تعمل في المقدّمة
أسهل سيناريو هو الحفاظ على السلوك الحالي، واستخدام إشعار دائم لعرض معلومات حزمة تطوير البرامج (SDK) للتنقل خدمات أخرى يمكنه إخفاء المحتوى خلف هذا الإشعار باستخدام مدير الخدمات التي تعمل في المقدّمة. startForeground() وstopForeground() طريقة.
إخفاء الإشعارات الدائمة للخدمات الأخرى التي تعمل في المقدّمة داخل التطبيق، ولكن مع ضبطها النص التلقائي الذي يتم عرضه أثناء عدم التنقّل
ثاني أسهل سيناريو هو الحفاظ على السلوك الحالي واستخدام الإشعار المستمر لعرض معلومات حزمة تطوير البرامج (SDK) للتنقل، باستثناء عندما لا يتنقل النظام. عندما لا يتنقل النظام، فإن تم تقديم سلسلة إلى initForegroundServiceManagerMessageAndIntent() بدلاً من سلسلة حزمة تطوير البرامج (SDK) التلقائية للتنقّل التي تشير إلى "خرائط Google". كما يمكنك استخدام هذا الطلب لتحديد قصد من الاستئناف الذي يتم تنشيطها عند النقر على الإشعار.
يمكنك التحكّم بشكل كامل في عرض الإشعار الدائم.
يتطلّب السيناريو النهائي تحديد مزوِّد خدمة للإشعارات وإنشائه. وتمريره إلى ForegroundServiceManager باستخدام initForegroundServiceManagerProvider() يمنحك هذا الخيار تحكمًا كاملاً في ما يتم عرضه في الإشعار لإلغاء ربط معلومات إشعارات حزمة تطوير البرامج (SDK) للتنقل وبالتالي إزالة الطلبات المفصّلة المفيدة التي تظهر في . ولا توفر Google وسيلة بسيطة لاسترداد هذا المعلومات وإدراجها في الإشعار.

مثال على مزوِّد خدمة الإشعارات

يوضح مثال الرمز التالي كيفية إنشاء وإرسال إشعارات باستخدام موفّر محتوى إشعارات بسيط.

public class NotificationContentProviderImpl
   extends NotificationContentProviderBase
   implements NotificationContentProvider {
 private String channelId;
 private Context context;
 private String message;

 /** Constructor */
 public NotificationContentProviderImpl(Application application) {
   super(application);
   message = "-- uninitialized --";
   channelId = null;
   this.context = application;
 }

 /**
  * Sets message to display in the notification. Calls updateNotification
  * to display the message immediately.
  *
  * @param msg The message to display in the notification.
  */
 public void setMessage(String msg) {
   message = msg;
   updateNotification();
 }

 /**
  * Returns the notification as it should be rendered.
  */
 @Override
 public Notification getNotification() {
   Notification notification;

   if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
     Spanned styledText = Html.fromHtml(message, FROM_HTML_MODE_LEGACY);
     String channelId = getChannelId(context);
     notification =
         new Notification.Builder(context, channelId)
             .setContentTitle("Notifications Demo")
             .setStyle(new Notification.BigTextStyle()
                 .bigText(styledText))
             .setSmallIcon(R.drawable.ic_navigation_white_24dp)
             .setTicker("ticker text")
             .build();
   } else {
     notification = new Notification.Builder(context)
         .setContentTitle("Notification Demo")
         .setContentText("testing non-O text")
         .build();
   }

   return notification;
 }

 // Helper to set up a channel ID.
 private String getChannelId(Context context) {
   if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
     if (channelId == null) {
       NotificationManager notificationManager =
           (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
       NotificationChannel channel = new NotificationChannel(
           "default", "navigation", NotificationManager.IMPORTANCE_DEFAULT);
       channel.setDescription("For navigation persistent notification.");
       notificationManager.createNotificationChannel(channel);
       channelId = channel.getId();
     }
     return channelId;
   } else {
     return "";
   }
 }
}

بعد إنشاء "NotificationContentProviderImpl"، عليك ربط حزمة SDK للتنقل إليها باستخدام الرمز التالي:

ForegroundServiceManager f = NavigationApi.getForegroundServiceManager(getApplication());
mNotification = new NotificationContentProviderImpl(getApplication());
NavigationApi.clearForegroundServiceManager();
NavigationApi.initForegroundServiceManagerProvider(getApplication(), null, mNotification);

محاذير وخطط مستقبلية

  • احرص على الاتصال بـ initForegroundServiceManagerMessageAndIntent() أو initForegroundServiceManagerProvider() مبكرًا لكي سيناريو الاستخدام المتوقع محدد جيدًا. يجب استدعاء هذه الطريقة قبل إنشاء مستكشف جديد.
  • تأكد من التعرف على الاستثناءات من المكالمات إلى initForegroundServiceManagerMessageAndIntent() أو initForegroundServiceManagerProvider() في حال كان مسار الرمز تم إدخاله أكثر من مرة. في الإصدار 2.0 من حزمة SDK للتنقل، يؤدي استدعاء هذه الطريقة تطرح مرات متعددة استثناء محدّد بدلاً من استثناء بيئة تشغيل.
  • ربما لا يزال يتعين على Google بذل جهد للحصول على تصميم متسق على مدار مدة بقاء الإشعار الذي يتطابق مع نمط العنوان.
  • عند تحديد مزوِّد خدمة الإشعارات، يمكنك التحكّم في سلوك ميزة "إنذار الانتباه أثناء السير". مع الأولوية.
  • لا توفّر Google وسيلة بسيطة لاسترداد الصفحات المفصّلة. المعلومات التي قد يدرجها مقدم خدمة الإشعار في الإشعار.