Mobil bildirimleri birleştirme

Android API düzeyi 26'dan itibaren ön plan hizmetlerini kullanabilirsiniz. Bu şart, gizlenmenizi önlemek için dahil olmak üzere sistem kaynaklarına aşırı talep her zaman fayda var. Bu şart potansiyel bir sorun oluşturur: Bir uygulama birden fazla ön plan hizmetinin bildirimi dikkatli bir şekilde yönetmemesi birden fazla kalıcı öğe olabilir. Bu durumda, kapatılamayan bildirimlerle, bunların aktif listesinde istenmeyen karmaşaya bildirimleri etkinleştirebilirsiniz.

Gezinme gibi SDK'ları kullandığınızda bu sorun daha zorlaşır. ön plan hizmetlerini çalıştıran uygulamalardan bağımsız olarak Bu da birleştirmeyi zorlaştıran bağımsız kalıcı bildirimlere sahip. Gezinme SDK'sı v1.11, bu sorunları gidermek için kullanıcıları SDK içindekiler de dahil olmak üzere uygulama genelinde kalıcı bildirimlerin yönetilmesine yardımcı olur.

Kalıcı bildirimleri birleştirme

Bileşenler

Ön plan hizmet yöneticisi, Android ön planı etrafında bir sarmalayıcı sağlar hizmet sınıfı ve kalıcı bildirim sınıfı bulunur. Bu sarmalayıcının ana işlevi, Bildirim Kimliği'nin yeniden kullanılmasını zorunlu kılarak bildirimin tüm ön plan hizmetlerinde paylaşılabilir.


Gezinme SDK'sı, ilk kullanıma hazırlayıp almak için statik yöntemler içerir. ForegroundServiceManager single'ı. Bu singleton yalnızca başlatılabilir Gezinme SDK'sının ömrü içinde bir kez. Sonuç olarak, başlatma çağrıları (initForegroundServiceManagerMessageAndIntent() veya initForegroundServiceManagerProvider()), ardından olma ihtimaline karşı bir deneme yakalama bloğuyla birlikte gönderir. Gezinme SDK'sı yöntemden herhangi birini birden çok kez çağırırsanız bir çalışma zamanı istisnası atar. önce ForegroundServiceManager ve çağrının tüm referanslarını temizleyin Sonraki her aramadan önce clearForegroundServiceManager().

initForegroundServiceManagerMessageAndIntent() işlevinin dört parametresi application, notificationId, defaultMessage ve resumeIntent. Öğe son üç parametre null ise bildirim, standart Gezinme SDK'sı bildirimi. Diğer ön planı gizlemeye devam edebilirsiniz geri bildirim gönderebileceksiniz. notificationId parametresi bildirim için kullanılması gereken bildirim kimliğini belirtir. Eğer null ise rastgele bir değer kullanılır. Bu sorunu özel olarak çözmek için diğer bildirimlerle (örneğin, başka bir SDK'dan gelen bildirimler) çakışmalıdır. İlgili içeriği oluşturmak için kullanılan defaultMessage, sistem şu koşulları sağlamadığında görüntülenen bir dizedir: gidilir. resumeIntent, bildirim yapıldığında tetiklenen bir niyettir tıklanır. resumeIntent null ise bildirimi tıklar yok sayılır.

initForegroundServiceManagerProvider() işlevinin üç parametresi application, notificationId ve notificationProvider. Son iki parametre null ise bildirim, standart Gezinme SDK'sı bildirimi görürsünüz. notificationId parametresi, bildirim için kullanılmalıdır. Null ise rastgele bir değer kullanılır. Bunu açıkça, diğer tedarikçilerle çakışmaları gidermek için diğer SDK'lardan gelen bildirimler gibi. notificationProvider bir sağlayıcı hazırladıysa, bildirimi oluşturmalarını sağlar.

Gezinme SDK'sı getForegroundServiceManager() yöntemi, ön plan hizmet yöneticisi teklileridir. Henüz bir dönüşüm izlemediyseniz bu, initForegroundServiceManagerMessageAndIntent() çağrısına eşdeğer notificationId, defaultMessage ve için boş parametrelerle resumeIntent.

ForegroundServiceManager, üç basit yöntem kullanır. İlk ikisi bir hizmeti ön plana alıp ön plandan çıkarır ve bu işlem genellikle daima farkında olmasını sağlayın. Bu yöntemlerin kullanılması hizmetleri, paylaşılan kalıcı bildirimle ilişkilendirilir. Son yöntemi (updateNotification()), bildirimin yapıldığı yöneticiyi işaretler. değiştirilmiştir ve yeniden oluşturulması gerekir.

Paylaşılan kalıcı bildirimin tam kontrolüne ihtiyacınız varsa API, API'deki veri tanımlayıcılarını tanımlamak için bir NotificationContentProvider bildirim almak için tek bir yöntem içeren bildirim sağlayıcı güncel içeriğe göre kontrol edebilirsiniz. Ayrıca, kullanabileceğiniz isteğe bağlı olarak kullanabilirsiniz. Temel sınıfın ana sınıflarından biri amacı,updateNotification() ForegroundServiceManager için erişmesi lazım. Bir yeni bildirim mesajları alması için bildirim sağlayıcı, bunu çağırabilirsiniz dahili yöntemini kullanabilirsiniz.

Kullanım senaryoları

Bu bölümde, paylaşılan kalıcı öğe kullanımıyla ilgili kullanım senaryoları ayrıntılı olarak açıklanmaktadır. bildirimleri etkinleştirebilirsiniz.

Diğer uygulama ön plan hizmetlerinin kalıcı bildirimlerini gizle
En kolay senaryo mevcut davranışı korumak ve yalnızca Gezinme SDK'sı bilgilerinin oluşturulması için kalıcı bildirim. Diğer hizmetler ön plan hizmet yöneticisini kullanarak bu bildirimin arkasına gizlenebilir startForeground() ve stopForeground() yöntemleri.
Diğer uygulama ön plan hizmetlerinin kalıcı bildirimlerini gizle, ancak ayarla gezinirken gösterilen varsayılan metin
En kolay ikinci senaryo ise mevcut davranışı korumak ve yalnızca aşağıdakiler hariç olmak üzere, Gezinme SDK'sı bilgilerinin oluşturulmasıyla ilgili kalıcı bildirim: sistem gezinmeyi devre dışı bırakır. Sistem navigasyonu açmadığında initForegroundServiceManagerMessageAndIntent() işlevine sağlanan dize aşağıdakilerden bahseden varsayılan Gezinme SDK'sı dizesi yerine görüntülenir "Google Haritalar". Ayrıca, bu çağrıyı, ileride lansmana başlamadan önce ve bildirim tıklandığında etkinleşir.
Kalıcı bildirimin oluşturulma süreci üzerinde tam kontrol sahibi olma
Son senaryoda, bir bildirim sağlayıcısının tanımlanması ve oluşturulması gerekir. ve bunu kullanarak ForegroundServiceManager öğesine iletebilirsiniz. initForegroundServiceManagerProvider(). Bu seçenek size bildirimde nelerin oluşturulacağıyla ilgili tam kontrole sahiptir, ancak Navigasyon SDK'sı bildirim bilgilerinin Böylece, Güvenli Arama'da gösterilen faydalı adım adım istemleri bildirimi görürsünüz. Google, bu verileri almak için basit bir yol sağlamaz bildirime eklemeniz yeterli.

Örnek bildirim sağlayıcı

Aşağıdaki kod örneğinde, bildirimlerin nasıl oluşturulacağı ve geri gönderileceği gösterilmektedir bunun için basit bir bildirim içerik sağlayıcısı kullanabilirsiniz.

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ı:

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

Uyarılar ve gelecekteki planlar

  • initForegroundServiceManagerMessageAndIntent() veya initForegroundServiceManagerProvider() numaralı telefonu erkenden aramayı unutmayın. beklenen kullanım senaryosu iyi tanımlanmış olmalıdır. Bu yöntemi çağırmalısınız kontrol edin.
  • Kod yolunun şöyle olması durumunda initForegroundServiceManagerMessageAndIntent() veya initForegroundServiceManagerProvider() birden fazla kez girildi. Gezinme SDK'sı 2.0 sürümünde bu yöntemin çağrılması birden çok kez çalışma zamanı istisnası yerine işaretli bir istisna atar.
  • Google, genel olarak tutarlı bir stil oluşturmak için başlık stiliyle eşleşen bildirimin geçerlilik süresi.
  • Bir bildirim sağlayıcı tanımladığınızda uyarı davranışını kontrol edebilirsiniz. önceliklendirme.
  • Google, adım adım verileri almak için basit bir yol sağlamaz Bildirim sağlayıcı tarafından bildirime eklenebilir.