รวมการแจ้งเตือนในอุปกรณ์เคลื่อนที่

เริ่มตั้งแต่ API ของ Android ระดับ 26 จำเป็นต้องมีการแจ้งเตือนอย่างต่อเนื่องสำหรับ บริการที่ทำงานอยู่เบื้องหน้า ข้อกำหนดนี้มีไว้เพื่อป้องกันไม่ให้คุณซ่อน บริการที่อาจต้องใช้ทรัพยากรระบบมากเกินไป ซึ่งรวมถึง โดยเฉพาะอย่างยิ่งแบตเตอรี่ ข้อกำหนดนี้อาจทำให้เกิดปัญหาที่อาจเกิดขึ้น: หากแอป สำหรับบริการที่ทำงานอยู่เบื้องหน้าหลายรายการ ไม่ได้จัดการการแจ้งเตือนอย่างระมัดระวัง มีการใช้ร่วมกันในทุกบริการ ก็อาจเป็นไปได้ว่า การแจ้งเตือนที่ปิดไม่ได้ ซึ่งนำไปสู่รายการที่ไม่เป็นระเบียบในรายการที่ใช้งานอยู่ การแจ้งเตือน

ปัญหานี้มีความท้าทายมากขึ้นเมื่อคุณใช้ SDK เช่น การนำทาง SDK ที่เรียกใช้บริการที่ทำงานอยู่เบื้องหน้าโดยไม่ขึ้นอยู่กับแอปที่มีบริการ การแจ้งเตือนต่อเนื่องอิสระ ซึ่งทำให้รวบรวมได้ยาก เพื่อแก้ไขปัญหาเหล่านี้ Navigation SDK v1.11 ได้แนะนำ API แบบง่ายสำหรับ ช่วยจัดการการแจ้งเตือนตลอดเวลาในแอป รวมถึงภายใน SDK ด้วย

รวมการแจ้งเตือนถาวร

คอมโพเนนต์

ตัวจัดการบริการที่ทำงานอยู่เบื้องหน้าจัดเตรียม Wrapper ไว้รอบๆ เบื้องหน้าของ Android คลาสบริการและคลาสการแจ้งเตือนถาวร แท็กหลักของ Wrapper นี้ คือการบังคับใช้รหัสการแจ้งเตือนซ้ำเพื่อให้การแจ้งเตือน ที่แชร์ในบริการที่ทำงานอยู่เบื้องหน้าทั้งหมดที่ใช้เครื่องมือจัดการ


Navigation SDK มีวิธีแบบคงที่สำหรับการเริ่มต้นและรับ ForegroundServiceManager ซิงเกิล Singleton นี้สามารถเริ่มต้นได้เท่านั้น ครั้งเดียวตลอดอายุการใช้งานของ Navigation SDK ดังนั้น หากคุณใช้หนึ่งใน การเรียกการเริ่มต้น (initForegroundServiceManagerMessageAndIntent() หรือ initForegroundServiceManagerProvider()) คุณควรจะล้อมรอบ ด้วยบล็อกทดสอบในกรณีที่มีการป้อนเส้นทางนั้นอีกครั้ง Navigation SDK จะแสดงข้อผิดพลาดรันไทม์หากคุณเรียกใช้เมธอดใดเมธอดหนึ่งมากกว่า 1 ครั้ง เว้นแต่ ก่อนอื่น ให้ล้างการอ้างอิงถึง ForegroundServiceManager ทั้งหมดและการเรียก clearForegroundServiceManager() ก่อนการโทรครั้งต่อๆ ไป

พารามิเตอร์ 4 ตัวของ initForegroundServiceManagerMessageAndIntent() ได้แก่ application, notificationId, defaultMessage และ resumeIntent หาก พารามิเตอร์สามตัวสุดท้ายเป็นค่าว่าง การแจ้งเตือนจะเป็นค่ามาตรฐาน การแจ้งเตือน SDK การนำทาง คุณยังคงซ่อนเบื้องหน้าอื่นๆ ได้ บริการในแอปที่อยู่เบื้องหลังการแจ้งเตือนนี้ พารามิเตอร์ notificationId ระบุรหัสการแจ้งเตือนที่ควรใช้สำหรับการแจ้งเตือน หากใช่ null แล้วจะใช้ค่าที่กำหนดเอง คุณสามารถตั้งค่าอย่างชัดแจ้งให้หลีกเลี่ยง ขัดแย้งกับการแจ้งเตือนอื่นๆ เช่น การแจ้งเตือนจาก SDK อื่น defaultMessage เป็นสตริงที่แสดงเมื่อระบบไม่ การนำทาง resumeIntent เป็น Intent ที่จะเริ่มทำงานเมื่อมีการแจ้งเตือน ที่มีการคลิก หาก resumeIntent เป็นค่าว่าง ให้คลิกการแจ้งเตือน จะถูกละเว้น

พารามิเตอร์ทั้ง 3 ของ initForegroundServiceManagerProvider() คือ application, notificationId และ notificationProvider หากขั้นสุดท้าย พารามิเตอร์สองตัวเป็นค่าว่าง การแจ้งเตือนจะเป็น SDK การนำทางมาตรฐาน การแจ้งเตือน พารามิเตอร์ notificationId ระบุรหัสการแจ้งเตือนที่ ควรใช้สำหรับการแจ้งเตือน หากเป็นค่าว่าง ค่าที่กำหนดเองจะเป็น คุณสามารถตั้งค่าอย่างชัดแจ้งให้หลีกเลี่ยงข้อขัดแย้งกับ เช่น การแจ้งเตือนที่มาจาก SDK อื่น หาก notificationProvider คือ ผู้ให้บริการจะเป็นผู้รับผิดชอบ การสร้างการแจ้งเตือนที่จะแสดงผล

เมธอด SDK การนำทาง getForegroundServiceManager() แสดงเมธอด Singleton ผู้จัดการบริการที่ทำงานอยู่เบื้องหน้า ถ้าคุณยังไม่ได้สร้าง เทียบเท่ากับการโทรหา initForegroundServiceManagerMessageAndIntent() ที่มีพารามิเตอร์ Null สำหรับ notificationId, defaultMessage และ resumeIntent

ForegroundServiceManager มีวิธีง่ายๆ 3 วิธี สองตัวเลือกแรกนั้นมีไว้สำหรับ การย้ายบริการไปยังและออกจากเบื้องหน้า และโดยทั่วไปจะมีการเรียก ภายในบริการที่สร้างขึ้น การใช้วิธีการเหล่านี้ช่วยให้มั่นใจได้ว่า บริการจะเชื่อมโยงกับการแจ้งเตือนถาวรที่แชร์ ขั้นสุดท้าย updateNotification() แจ้งผู้จัดการที่มีการแจ้งเตือนนั้น และควรแสดงผลอีกครั้ง

หากคุณต้องการควบคุมการแจ้งเตือนที่แชร์อย่างต่อเนื่อง ให้ทำดังนี้ API มีอินเทอร์เฟซ NotificationContentProvider สำหรับกำหนด ผู้ให้บริการการแจ้งเตือน ซึ่งมีวิธีรับการแจ้งเตือนแบบเดียว กับเนื้อหาปัจจุบัน นอกจากนี้ยังมีคลาสพื้นฐานที่คุณสามารถ (ไม่บังคับ) ใช้เพื่อช่วยกำหนดผู้ให้บริการ หนึ่งในคลาสพื้นฐาน มีจุดประสงค์เพื่อให้บริการเรียก updateNotification() โดยไม่มี จำเป็นต้องเข้าถึง ForegroundServiceManager หากคุณใช้อินสแตนซ์ของ จากผู้ให้บริการการแจ้งเตือน เพื่อรับข้อความแจ้งเตือนใหม่ คุณสามารถโทรหา ภายในการแสดงผลข้อความในการแจ้งเตือนโดยตรง

สถานการณ์การใช้งาน

ส่วนนี้จะอธิบายถึงสถานการณ์การใช้งานสำหรับการใช้ที่แชร์แบบถาวร การแจ้งเตือน

ซ่อนการแจ้งเตือนถาวรของบริการที่ทำงานอยู่เบื้องหน้าอื่นๆ ของแอป
สถานการณ์ที่ง่ายที่สุดคือการรักษาพฤติกรรมปัจจุบันไว้ และใช้เฉพาะ การแจ้งเตือนตลอดเวลาสำหรับการแสดงผลข้อมูล Navigation SDK บริการอื่นๆ สามารถซ่อนไว้หลังการแจ้งเตือนนี้ได้โดยใช้ตัวจัดการบริการที่ทำงานอยู่เบื้องหน้า startForeground() และ stopForeground() เมธอด
ซ่อนการแจ้งเตือนถาวรของบริการที่ทำงานอยู่เบื้องหน้าของแอปอื่นๆ แต่ตั้งค่าไว้ ข้อความเริ่มต้นที่แสดงเมื่อไม่ได้นำทาง
สถานการณ์ที่ 2 ที่ง่ายที่สุดคือการรักษาลักษณะการทำงานในปัจจุบันไว้และใช้ การแจ้งเตือนถาวรสำหรับการแสดงผลข้อมูล SDK การนำทาง ยกเว้น เมื่อระบบไม่ได้มีการนำทาง เมื่อระบบไม่ได้มีการนำทาง ระบุสตริงให้กับ initForegroundServiceManagerMessageAndIntent() แสดงแทนสตริง Navigation SDK เริ่มต้นที่กล่าวถึง "Google Maps" คุณยังใช้การโทรนี้เพื่อกำหนด Intent ของเรซูเม่ที่ เริ่มทำงานเมื่อคลิกการแจ้งเตือน
ควบคุมการแสดงผลของการแจ้งเตือนถาวรได้อย่างเต็มที่
ในสถานการณ์สุดท้าย ต้องกำหนดและสร้างผู้ให้บริการการแจ้งเตือน และส่งไปยัง ForegroundServiceManager โดยใช้ initForegroundServiceManagerProvider() ตัวเลือกนี้จะให้ สามารถควบคุมสิ่งที่จะแสดงในการแจ้งเตือนได้อย่างเต็มที่ จะตัดการเชื่อมต่อข้อมูลการแจ้งเตือน Navigation 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 การนำทางไปยัง SDK ดังกล่าวโดยใช้โค้ดต่อไปนี้

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

ข้อควรระวังและแผนในอนาคต

  • โปรดโทรหา initForegroundServiceManagerMessageAndIntent() หรือ initForegroundServiceManagerProvider() ก่อนเวลา มีการกำหนดสถานการณ์การใช้งานที่คาดหวังไว้อย่างดี คุณต้องเรียกใช้เมธอดนี้ ก่อนสร้าง Navigator ใหม่
  • อย่าลืมจับข้อยกเว้นสำหรับการโทรถึง initForegroundServiceManagerMessageAndIntent() หรือ initForegroundServiceManagerProvider() ในกรณีที่เส้นทางของโค้ดคือ ป้อนมากกว่า 1 ครั้ง ใน Navigation SDK v2.0 การเรียกใช้เมธอดนี้ ส่งข้อยกเว้นที่ตรวจสอบแล้วหลายครั้งแทนที่จะเป็นข้อยกเว้นรันไทม์
  • Google ยังคงมีงานที่ต้องทำเพื่อให้สไตล์ อายุการใช้งานของการแจ้งเตือนที่ตรงกับการจัดรูปแบบส่วนหัว
  • เมื่อกำหนดผู้ให้บริการการแจ้งเตือน คุณจะควบคุมลักษณะการแจ้งเตือนล่วงหน้าได้ ลำดับความสำคัญ
  • Google ไม่ได้มีวิธีการง่ายๆ ในการเรียกข้อมูลแบบเลี้ยวต่อเลี้ยว ข้อมูลที่ผู้ให้บริการการแจ้งเตือนอาจแทรกลงในการแจ้งเตือน