我拥有的应用程序(在Android O中)将在设备重启后启动服务。重新启动设备后,在广播接收器的onReceive()方法中,它将服务调用为startForegroundService()(适用于Android OS 8及更高版本)。
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(intent);
} else {
context.startService(intent);
}
在服务类内部,它是通过onStartCommand()方法启动通知的。
但是它仍然抛出IllegalStateException。有人在Android OS 8及更高版本中遇到过类似的问题吗?
答案 0 :(得分:2)
您必须从已启动的服务中调用startForeground()
,位于文档中:
创建服务后,服务必须在五秒钟内调用其startForeground()方法。
例如,您需要从您的Service
类中进行此操作:
@Override
public void onCreate() {
super.onCreate();
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
String CHANNEL_ID = "channel_01";
String CHANNEL_NAME = "Channel Name";
NotificationChannel channel = new NotificationChannel(CHANNEL_ID, CHANNEL_NAME, NotificationManager.IMPORTANCE_DEFAULT);
channel.setSound(null, null);
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.createNotificationChannel(channel);
Builder notification = new Builder(this, CHANNEL_ID).setSound(null).setVibrate(new long[]{0});
notification.setChannelId(CHANNEL_ID);
startForeground(1, notification.build());
}
}
答案 1 :(得分:1)
即使应用程序在后台,系统仍允许应用程序调用Context。 startForegroundService ()。但是,应用必须在创建服务后的五秒钟内调用该服务的 startForeground ()方法。
如下所示编写服务的onCreate。
@Override
public void onCreate() {
super.onCreate();
if (Build.VERSION.SDK_INT >= 26) {
String CHANNEL_ID = "my_channel_01";
NotificationChannel channel = new NotificationChannel(CHANNEL_ID,
"Channel human readable title",
NotificationManager.IMPORTANCE_DEFAULT);
((NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE)).createNotificationChannel(channel);
Notification notification = new NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("")
.setContentText("").build();
startForeground(1, notification);
}
}
以便可以在启动服务后的5秒钟内调用startForeground()。