بدءًا من المستوى 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 وسيلة بسيطة لاسترداد الصفحات المفصّلة. المعلومات التي قد يدرجها مقدم خدمة الإشعار في الإشعار.