我面临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()
。
现在,解决动态通知内容问题的正确方法是什么?