startForegroundService()在应用BOOT_COMPLETED

时间:2018-10-31 10:30:18

标签: android service illegalstateexception foreground-service

我拥有的应用程序(在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及更高版本中遇到过类似的问题吗?

2 个答案:

答案 0 :(得分:2)

您必须从已启动的服务中调用startForeground(),位于文档中:

  

创建服务后,服务必须在五秒钟内调用其startForeground()方法。

Source

例如,您需要从您的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()。