Mobil bildirimleri birleştirme

Android API düzeyi 26'dan itibaren ön plan hizmetleri için kalıcı bildirimler gereklidir. Bu gereksinimin amacı, özellikle pil dahil olmak üzere sistem kaynakları üzerinde aşırı talep oluşturabilecek hizmetleri gizlemenizi önlemektir. Bu gereklilik potansiyel bir sorun yaratır: Birden fazla ön plan hizmeti olan bir uygulama, bildirimi tüm hizmetlerde paylaşılacak şekilde dikkatli bir şekilde yönetmezse birden fazla kalıcı ve kapatılamayan bildirim bulunabilir. Bu durum, etkin bildirim listesinde istenmeyen karışıklıklara yol açabilir.

Gezinme SDK'sı gibi, kendi bağımsız kalıcı bildirimleri olan uygulamadan bağımsız olarak ön plan hizmetlerini çalıştıran SDK'lar kullandığınızda bu sorun daha zor hale gelir ve bunların birleştirilmesini zorlaştırır. Bu sorunları çözmek için Navigation SDK v1.11, SDK içindekiler de dahil olmak üzere uygulama genelinde kalıcı bildirimlerin yönetilmesine yardımcı olacak basit bir API'yi kullanıma sundu.

Kalıcı bildirimleri birleştirme

Bileşenler

Ön plan hizmet yöneticisi, Android ön plan hizmet sınıfı ve kalıcı bildirim sınıfı için bir sarmalayıcı sağlar. Bu sarmalayıcının ana işlevi, bildirim kimliğinin yönetici kullanılarak tüm ön plan hizmetlerinde paylaşılabilmesi için Bildirim Kimliğinin yeniden kullanılmasını zorunlu kılmaktır.


Gezinme SDK'sı, ForegroundServiceManager tekilleştirmesini başlatmak ve almak için statik yöntemler içerir. Bu tekil değişken, Navigasyon SDK'sının kullanım süresi içinde yalnızca bir kez başlatılabilir. Sonuç olarak, ilk kullanıma hazırlama çağrılarından (initForegroundServiceManagerMessageAndIntent() veya initForegroundServiceManagerProvider()) birini kullanırsanız bu yolun yeniden girilmesi olasılığına karşı bir deneme yakalama bloğuyla çevrelemeniz gerekir. Öncelikle tüm ForegroundServiceManager başvurularını temizlemediğiniz ve sonraki her çağrıdan önce clearForegroundServiceManager() yöntemini çağırmadığınız sürece, iki yöntemden birini birden fazla kez çağırırsanız Gezinme SDK'sı bir çalışma zamanı istisnası atar.

initForegroundServiceManagerMessageAndIntent() öğesinin dört parametresi application, notificationId, defaultMessage ve resumeIntent'dir. Son üç parametre boşsa bildirim, standart Gezinme SDK'sı bildirimidir. Uygulamada, bu bildirimin arkasındaki diğer ön plan hizmetlerini gizlemek hâlâ mümkündür. notificationId parametresi, bildirim için kullanılması gereken bildirim kimliğini belirtir. Boş ise rastgele bir değer kullanılır. Bu ayarı, SDK'dan gelen bildirimler gibi diğer bildirimlerle olan çakışmaları gidermek için de açıkça ayarlayabilirsiniz. defaultMessage, sistem gezinmediğinde görüntülenen bir dizedir. resumeIntent, bildirim tıklandığında tetiklenen bir amaçtır. resumeIntent null ise bildirimin tıklanması dikkate alınmaz.

initForegroundServiceManagerProvider() için üç parametre application, notificationId ve notificationProvider şeklindedir. Son iki parametre boşsa bildirim, standart Gezinme SDK'sı bildirimi olur. notificationId parametresi, bildirim için kullanılması gereken bildirim kimliğini belirtir. Boş ise rastgele bir değer kullanılır. Bunu açıkça, başka bir SDK'dan gelen bildirimler gibi diğer bildirimlerle çakışmaları gidermek için ayarlayabilirsiniz. notificationProvider ayarlanırsa oluşturulacak bildirimin oluşturulmasından, her zaman sağlayıcı sorumludur.

Gezinme SDK'sı getForegroundServiceManager() yöntemi, ön plan hizmet yöneticisi tekilini döndürür. Henüz bir parametre oluşturmadıysanız notificationId, defaultMessage ve resumeIntent için boş parametrelerle initForegroundServiceManagerMessageAndIntent() çağırmakla eş değerdir.

ForegroundServiceManager, üç basit yönteme sahiptir. İlk ikisi bir hizmeti ön plana taşımak ve ön plandan taşımak içindir ve genellikle oluşturulan hizmet içinden çağrılır. Bu yöntemlerin kullanılması, hizmetlerin paylaşılan kalıcı bildirimle ilişkilendirilmesini sağlar. Son yöntem olan updateNotification(), bildirimin değiştiğini ve yeniden oluşturulması gerektiğini bildirerek yöneticiyi işaretler.

Paylaşılan kalıcı bildirimin tam kontrolüne ihtiyacınız varsa API, geçerli içerikle ilgili bildirim almak için tek bir yöntem içeren bildirim sağlayıcı tanımlamak için NotificationContentProvider arayüzü sunar. Ayrıca, sağlayıcıyı tanımlamanıza yardımcı olması için isteğe bağlı olarak kullanabileceğiniz bir temel sınıf da sağlar. Temel sınıfın ana amaçlarından biri, ForegroundServiceManager erişimine gerek kalmadan updateNotification() yöntemini çağırmaktır. Yeni bildirim mesajlarını almak için bildirim sağlayıcının bir örneğini kullanıyorsanız, bildirimdeki mesajı oluşturmak için doğrudan bu dahili yöntemi çağırabilirsiniz.

Kullanım senaryoları

Bu bölümde, paylaşılan kalıcı bildirimlerin kullanımıyla ilgili kullanım senaryoları açıklanmaktadır.

Diğer uygulama ön plan hizmetlerinin kalıcı bildirimlerini gizle
En kolay senaryo, mevcut davranışı korumak ve Navigation SDK bilgilerini oluşturmak için yalnızca kalıcı bildirimi kullanmaktır. Diğer hizmetler, ön plan hizmet yöneticisi startForeground() ve stopForeground() yöntemlerini kullanarak bu bildirimin arkasına gizlenebilir.
Diğer uygulama ön plan hizmetlerinin kalıcı bildirimlerini gizle, ancak gezinme sırasında gösterilen varsayılan metni ayarla
İkinci en kolay senaryo, mevcut davranışı korumak ve sistemin gezinmediği durumlar haricinde, yalnızca Navigation SDK bilgilerini oluşturmak için kalıcı bildirimi kullanmaktır. Sistem gezinmediğinde, "Google Haritalar" ifadesini içeren varsayılan Gezinme SDK'sı dizesi yerine initForegroundServiceManagerMessageAndIntent() için sağlanan dize görüntülenir. Bu çağrıyı, bildirim tıklandığında tetiklenen devam ettirme amacını ayarlamak için de kullanabilirsiniz.
Kalıcı bildirimin oluşturulması üzerinde tam kontrol sahibi olun
Son senaryo, bir bildirim sağlayıcı tanımlayıp oluşturmayı ve initForegroundServiceManagerProvider() kullanarak bunu ForegroundServiceManager öğesine iletmeyi gerektirir. Bu seçenek size bildirimde ne oluşturulacağına ilişkin tam kontrol sağlar, ancak aynı zamanda Gezinme SDK'si bildirim bilgilerinin bildirimle bağlantısını keserek bildirimde gösterilen yararlı adım adım istemleri kaldırır. Google, bu bilgileri almak ve bildirime eklemek için basit bir yöntem sağlamaz.

Örnek bildirim sağlayıcı

Aşağıdaki kod örneğinde, basit bir bildirim içeriği sağlayıcısı kullanarak bildirimlerin nasıl oluşturulacağı ve döndürüleceği gösterilmektedir.

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 oluşturduktan sonra, aşağıdaki kodu kullanarak Navigasyon SDK'sını SDK'ya bağlarsınız:

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

Uyarılar ve gelecek planları

  • Beklenen kullanım senaryosunun iyi tanımlanması için initForegroundServiceManagerMessageAndIntent() veya initForegroundServiceManagerProvider() yöntemini erkenden çağırdığınızdan emin olun. Yeni bir Gezgin oluşturmadan önce bu yöntemi çağırmalısınız.
  • Kod yolu birden fazla kez girilirse initForegroundServiceManagerMessageAndIntent() veya initForegroundServiceManagerProvider() çağrılarına yönelik istisnaları yakaladığınızdan emin olun. Gezinme SDK'sı 2.0 sürümünde, bu yöntemin birden çok kez çağrılması, çalışma zamanı istisnası yerine işaretli istisna döndürür.
  • Bildirimin kullanım süresi boyunca, başlık stiliyle eşleşen stilin tutarlı olması için Google'ın üzerinde çalışmalar olabilir.
  • Bir bildirim sağlayıcı tanımladığınızda, uyarı davranışını öncelik sırasına göre kontrol edebilirsiniz.
  • Google, bir bildirim sağlayıcısının bildirime ekleyebilecekleri ayrıntılı bilgileri almak için basit bir yol sağlamaz.