Mulai Android API level 26, notifikasi persisten diperlukan untuk dan layanan latar depan. Persyaratan ini dimaksudkan untuk mencegah Anda menyembunyikan layanan yang mungkin memberikan tuntutan berlebihan pada sumber daya sistem, termasuk pada baterai. Persyaratan ini menimbulkan potensi masalah: Jika aplikasi dengan beberapa layanan latar depan tidak mengelola notifikasi dengan hati-hati sehingga server tersebut digunakan bersama di semua layanan, maka akan ada beberapa notifikasi yang tidak dapat ditutup, yang menyebabkan kekacauan yang tidak diinginkan dalam daftar aktif notifikasi.
Masalah ini menjadi lebih menantang saat Anda menggunakan SDK seperti Navigation
SDK, yang menjalankan layanan latar depan secara terpisah dari aplikasi yang
notifikasi persisten yang independen, sehingga sulit untuk digabungkan.
Untuk mengatasi masalah ini, Navigation SDK v1.11 memperkenalkan API sederhana untuk
membantu mengelola notifikasi persisten di seluruh aplikasi, termasuk dalam SDK.
Komponen
Pengelola layanan latar depan menyediakan wrapper di sekitar latar depan Android dan kelas notifikasi persisten. Fungsi utama wrapper ini adalah untuk memberlakukan penggunaan kembali ID Notifikasi sehingga notifikasi dibagikan di semua layanan latar depan menggunakan pengelola.
Navigation SDK berisi metode statis untuk menginisialisasi dan mendapatkan
singleton ForegroundServiceManager
. Singleton ini hanya dapat diinisialisasi
sekali seumur hidup Navigation SDK. Karenanya, jika Anda menggunakan salah satu
panggilan inisialisasi (initForegroundServiceManagerMessageAndIntent()
atau
initForegroundServiceManagerProvider()
), Anda harus mengelilingi
dengan blok {i>try-catch<i} jika jalur
itu dimasukkan kembali. Navigation SDK
menampilkan pengecualian runtime jika Anda memanggil salah satu metode lebih dari sekali kecuali
pertama, hapus semua referensi ke ForegroundServiceManager
, lalu panggil
clearForegroundServiceManager()
sebelum setiap panggilan berikutnya.
Keempat parameter initForegroundServiceManagerMessageAndIntent()
adalah
application
, notificationId
, defaultMessage
, dan resumeIntent
. Jika
tiga parameter terakhir adalah {i>null<i}, maka notifikasi itu adalah
Notifikasi Navigation SDK. Masih ada kemungkinan untuk menyembunyikan latar depan
layanan web di aplikasi di belakang notifikasi ini. Parameter notificationId
menentukan ID notifikasi yang harus digunakan untuk notifikasi. Jika ya
null, maka nilai arbitrer akan digunakan. Anda dapat menetapkannya secara
eksplisit untuk mengatasi
bentrok dengan notifikasi lain, seperti notifikasi dari SDK lain. Tujuan
defaultMessage
adalah string yang ditampilkan saat sistem tidak
menavigasi. resumeIntent
adalah intent yang diaktifkan saat notifikasi
diklik. Jika resumeIntent
adalah null, Anda akan mengklik notifikasi
akan diabaikan.
Tiga parameter initForegroundServiceManagerProvider()
adalah
application
, notificationId
, dan notificationProvider
. Jika hasil akhirnya
dua parameter adalah null, maka notifikasinya adalah Navigation SDK standar
notifikasi. Parameter notificationId
menentukan ID notifikasi yang
yang harus digunakan untuk notifikasi. Jika itu null, maka nilai arbitrer
data Anda dapat menetapkannya secara eksplisit untuk mengatasi konflik dengan
notifikasi, seperti notifikasi dari SDK lain. Jika notificationProvider
adalah
maka penyedia selalu
bertanggung jawab untuk
menghasilkan notifikasi yang akan dirender.
Metode getForegroundServiceManager()
Navigation SDK akan menampilkan
singleton pengelola layanan latar depan. Jika Anda belum membuatnya,
hal ini sama seperti memanggil initForegroundServiceManagerMessageAndIntent()
dengan parameter null untuk notificationId
, defaultMessage
, dan
resumeIntent
.
ForegroundServiceManager
memiliki tiga metode sederhana. Dua yang pertama adalah untuk
memindahkan layanan ke dalam dan ke luar
latar depan, dan biasanya dipanggil dari
dalam layanan yang telah dibuat. Menggunakan metode ini memastikan bahwa
layanan dikaitkan dengan notifikasi persisten bersama. Final
updateNotification()
, menandai pengelola bahwa notifikasi memiliki
diubah, dan harus dirender ulang.
Jika Anda memerlukan kontrol penuh atas pemberitahuan
bersamaan tersebut, maka
API menyediakan antarmuka NotificationContentProvider
untuk menentukan
penyedia notifikasi, yang berisi satu metode untuk mendapatkan notifikasi
dengan konten saat ini. Class ini juga menyediakan class dasar, yang bisa Anda
digunakan secara opsional untuk
membantu menentukan penyedia. Salah satu class utama
tujuannya adalah memberikan cara untuk memanggil updateNotification()
tanpa
perlu mengakses ForegroundServiceManager
. Jika Anda menggunakan instance
penyedia notifikasi untuk menerima pesan notifikasi baru, Anda dapat memanggilnya
internal secara langsung untuk merender pesan dalam notifikasi.
Skenario penggunaan
Bagian ini menjelaskan skenario penggunaan untuk menggunakan persistensi bersama notifikasi.
- Menyembunyikan notifikasi persisten dari layanan latar depan aplikasi lainnya
- Skenario termudah adalah mempertahankan perilaku saat ini, dan hanya menggunakan
notifikasi persisten untuk merender informasi Navigation SDK. Layanan lainnya
dapat bersembunyi di balik notifikasi ini dengan menggunakan pengelola layanan latar depan
Metode
startForeground()
danstopForeground()
. - Sembunyikan notifikasi persisten dari layanan latar depan aplikasi lainnya, tetapi setel teks default yang ditampilkan saat tidak melakukan navigasi
- Skenario termudah kedua adalah mempertahankan perilaku saat ini, dan hanya menggunakan
notifikasi persisten untuk merender informasi Navigation SDK, kecuali
saat sistem tidak melakukan navigasi. Saat sistem tidak sedang melakukan navigasi,
string yang diberikan ke
initForegroundServiceManagerMessageAndIntent()
ditampilkan, bukan string Navigation SDK default yang menyebutkan "Google Maps". Anda juga bisa menggunakan panggilan ini untuk menyetel intent resume yang diaktifkan saat notifikasi diklik. - Kontrol penuh rendering notifikasi persisten
- Skenario terakhir mengharuskan penentuan dan pembuatan penyedia notifikasi
dan meneruskannya ke
ForegroundServiceManager
menggunakaninitForegroundServiceManagerProvider()
. Opsi ini memberi Anda memiliki kontrol penuh atas apa yang dirender dalam notifikasi, memutuskan sambungan informasi notifikasi Navigation SDK dari yang sama, sehingga menghapus petunjuk belokan demi belokan yang berguna yang ditampilkan di notifikasi. Google tidak menyediakan cara mudah untuk mengambil data ini informasi dan memasukkannya ke dalam notifikasi.
Contoh penyedia notifikasi
Contoh kode berikut menunjukkan cara membuat dan menampilkan notifikasi menggunakan penyedia konten notifikasi sederhana.
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 "";
}
}
}
Setelah membuat NotificationContentProviderImpl
, Anda menghubungkan
Navigation SDK menggunakan kode berikut:
ForegroundServiceManager f = NavigationApi.getForegroundServiceManager(getApplication());
mNotification = new NotificationContentProviderImpl(getApplication());
NavigationApi.clearForegroundServiceManager();
NavigationApi.initForegroundServiceManagerProvider(getApplication(), null, mNotification);
Peringatan dan rencana mendatang
- Pastikan untuk menelepon
initForegroundServiceManagerMessageAndIntent()
atauinitForegroundServiceManagerProvider()
lebih awal agar skenario penggunaan yang diharapkan telah didefinisikan dengan baik. Anda harus memanggil metode ini sebelum membuat Navigator baru. - Pastikan untuk menangkap pengecualian dari panggilan ke
initForegroundServiceManagerMessageAndIntent()
atauinitForegroundServiceManagerProvider()
jika jalur kode adalah dimasukkan lebih dari sekali. Di Navigation SDK v2.0, memanggil metode ini beberapa kali memunculkan pengecualian yang dicentang, bukan pengecualian runtime. - Google mungkin masih harus melakukan pekerjaan lain untuk mendapatkan gaya visual yang konsisten selama notifikasi yang cocok dengan gaya header.
- Saat menentukan penyedia notifikasi, Anda bisa mengontrol perilaku peringatan dini dengan prioritas.
- Google tidak menyediakan cara mudah untuk mengambil belokan demi belokan informasi yang mungkin dimasukkan oleh penyedia notifikasi ke dalam notifikasi.