Передо мной стоит небольшая дилемма с новыми требованиями к обслуживанию переднего плана, представленными в Android O.
У меня есть служба переднего плана, которая создает уведомление переднего плана во время onCreate()
, например:
public class FooService extends Service {
@Override
public void onCreate() {
NotificationManager nm = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
nm.createNotificationChannel(new NotificationChannel("channel", "channel", IMPORTANCE_LOW));
startForeground(42, new NotificationCompat.Builder(this, "channel")
.setContentTitle("Foo")
.setContentText("Bar")
.setOngoing(true)
.setSmallIcon(android.R.drawable.ic_popup_sync)
.build());
}
}
Однако возникает проблема: что делать, если мне нужно динамически передать данные в уведомление, например.установить форматированный заголовок?Примерно так:
startForeground(42, new NotificationCompat.Builder(this, "channel")
.setContentTitle(getString(R.string.formatted_title, intent.getStringExtra("Foobar")))
...
Не существует идиоматического способа передачи аргумента уведомлению, поскольку нет намерения, переданного onCreate()
.Есть метод onStartCommand()
, который получает намерение в качестве аргумента, но есть ловушка: startForeground()
должен быть вызван в течение пяти секунд после запуска службы, но не гарантируется, что onStartCommand()
будет вызван до пятисекундного пределаударилЯ экспериментировал с этим некоторое время, и это происходит примерно в 10% случаев.Похоже, что единственный способ - это позвонить startForeground()
во время onCreate()
.
Теперь, как правильно подходить к проблеме содержимого динамического уведомления?