איחוד התראות בנייד

החל מרמת 26 של API ל-Android, נדרשות התראות קבועות עבור שירותים שפועלים בחזית. מטרת הדרישה הזו היא למנוע מכם להסתיר שעלולים ליצור ביקוש גבוה מדי למשאבי המערכת, כולל במיוחד הסוללה. הדרישה הזו יוצרת בעיה פוטנציאלית: אם אפליקציה שימוש במספר שירותים שפועלים בחזית לא מנהל את ההתראה בקפידה, שמשותף בין כל השירותים, אז יכולות להיות התראות שלא ניתן לסגור, שמובילות לבלגן לא רצוי ברשימה הפעילה של התראות.

הבעיה הזו הופכת למאתגרת יותר כשמשתמשים בערכות SDK כמו ניווט ערכות SDK, שמפעילות שירותים שפועלים בחזית בלי קשר לאפליקציה התראות קבועות ועצמאיות, שמקשות על איחודן. כדי לפתור בעיות אלה, SDK לניווט v1.11 הוסיפה ממשק API פשוט עוזרות לנהל התראות קבועות בכל האפליקציה, כולל בתוך ה-SDK.

איחוד התראות קבועות

רכיבים

השירות שפועל בחזית מספק wrapper לחזית של Android סוג השירות (service class) וסיווג ההתראות הקבועות. הרכיב הראשי של ה-wrapper הזה היא לאכוף שימוש חוזר במזהה ההתראה כדי שההתראה שמשותף בכל השירותים שפועלים בחזית באמצעות חשבון הניהול.


ה-SDK לניווט מכיל שיטות סטטיות לאתחול ולקבלת סינגלטון ForegroundServiceManager. ניתן לאתחל את הסינגלטון הזה רק פעם אחת בכל משך החיים של SDK לניווט. לכן, אם משתמשים באחד קריאות אתחול (initForegroundServiceManagerMessageAndIntent() או initForegroundServiceManagerProvider()), עליך להקיף את העכבר אותו באמצעות בלוק ניסוי למקרה שנתיב זה מזינים מחדש. SDK לניווט גורמת לחריגה בסביבת זמן הריצה אם מפעילים את אחת מהשיטות האלה יותר מפעם אחת, אלא אם קודם כל מוחקים את כל ההפניות אל ForegroundServiceManager וקוראים clearForegroundServiceManager() לפני כל שיחה הבאה.

ארבעת הפרמטרים של initForegroundServiceManagerMessageAndIntent() הם application, notificationId, defaultMessage וגם resumeIntent. אם שלושת הפרמטרים הסופיים הם null, אז ההתראה היא ברירת המחדל הודעת SDK של ניווט. עדיין אפשר להסתיר חזית אחרת השירותים באפליקציה שההודעה הזו מתייחסת אליהם. הפרמטר notificationId מציין את מזהה ההתראה שיש להשתמש בו להודעה. אם הוא null, אז המערכת תשתמש בערך שרירותי. אפשר להגדיר אותו באופן מפורש כדי לעקוף את הבעיה מתנגשת עם התראות אחרות, כמו התראות מ-SDK אחר. defaultMessage הוא מחרוזת שמוצגת כשהמערכת לא יכולה בניווט. resumeIntent הוא אובייקט מסוג Intent שמופעל כשההתראה לוחצים עליו. אם הערך resumeIntent הוא null, אז לוחצים על ההתראה המערכת מתעלמת ממנו.

שלושת הפרמטרים של initForegroundServiceManagerProvider() הם application, notificationId וגם notificationProvider. אם באימון יש שני פרמטרים שהם null, אז ההתראה היא ערכת ה-SDK הרגילה של ניווט התראה. הפרמטר notificationId מציין את מזהה ההתראה ש צריך לשמש את ההתראה. אם הוא null, אז ערך שרירותי הוא בשימוש. ניתן להגדיר אותו באופן מפורש כדי לעקוף התנגשויות עם התראות, כמו התראות מ-SDK אחר. אם notificationProvider הוא אז הספק תמיד אחראי שמייצרים את ההתראה שצריך לעבד.

ה-method getForegroundServiceManager() של ה-SDK לניווט מחזירה את הערך סינגלטון של מנהל שירות שפועל בחזית. אם עדיין לא יצרתם חשבון, היא מקבילה לקריאה ל-initForegroundServiceManagerMessageAndIntent() עם פרמטרים null עבור notificationId, defaultMessage resumeIntent

יש שלוש שיטות פשוטות בשדה ForegroundServiceManager. השניים הראשונים מיועדים העברה של שירות לחזית ומחוץ לו, ובדרך כלל נקראים בתוך השירות שנוצר. השימוש בשיטות האלה מבטיח משויכים להתראה המתמשכת המשותפת. המשחק הסופי method, updateNotification(), מסמנת את המנהל שיש בהתראה וצריך לעבד אותו מחדש.

אם דרושה לכם שליטה מלאה בהתראה המשותפת המתמשכת, ה-API מספק ממשק NotificationContentProvider להגדרת ספק התראות, שכולל שיטה יחידה לקבלת התראות עם התוכן הנוכחי. היא גם מספקת מחלקה בסיסית, שאפשר כדי להגדיר את הספק. אחד ממחלקות הבסיס במחלקה הבסיסית היא מספקת דרך לקרוא ל-updateNotification() ללא צריכים גישה אל ForegroundServiceManager. אם משתמשים במופע של כדי לקבל הודעות חדשות, אפשר להתקשר למספר הזה שיטה פנימית ישירות לעיבוד ההודעה בהתראה.

תרחישי שימוש

בקטע הזה מתוארים תרחישי השימוש של שימוש קבוע משותף התראות.

הסתרת התראות קבועות לגבי שירותים שפועלים בחזית של אפליקציות
התרחיש הקל ביותר הוא לשמר את ההתנהגות הנוכחית ולהשתמש רק התראה קבועה לעיבוד המידע של ה-Navigation SDK. שירותים נוספים אפשר להסתתר מאחורי ההתראה הזו באמצעות שימוש במנהל השירות שפועל בחזית startForeground() ו-stopForeground().
הסתרת התראות קבועות לגבי שירותים שפועלים בחזית של אפליקציות, אבל הגדרה טקסט ברירת המחדל שמוצג כשלא מתבצע ניווט
התרחיש השני הקל ביותר הוא לשמור על ההתנהגות הנוכחית, ולהשתמש רק ההתראה הקבועה לעיבוד מידע מה-Navigation 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() מוקדם כדי תרחיש השימוש הצפוי מוגדר היטב. צריך להפעיל את ה-method הזה לפני שיוצרים ניווט חדש.
  • חשוב לשים לב לחריגים משיחות אל initForegroundServiceManagerMessageAndIntent() או initForegroundServiceManagerProvider() במקרה שנתיב הקוד הוא שהזנתם יותר מפעם אחת. ב-Navigation SDK v2.0, ביצוע קריאה לשיטה זו פעמים רבות גורמת לחריגה שנבדקת במקום חריג בסביבת זמן הריצה.
  • יכול להיות ש-Google עדיין תצטרך לעבוד כדי לשמור על סגנון עקבי משך החיים של ההתראה שתואמת לעיצוב הכותרת.
  • כשמגדירים ספק התראות, אפשר לשלוט בהתנהגות של התצוגה המקדימה. בעדיפות גבוהה.
  • Google לא מספקת אמצעי פשוט לאחזור מסלול מפורט. מידע שספק ההתראות עשוי להוסיף להודעה.