转载自:https://blog.csdn.net/legend12300/article/details/106413359
开机自启的服务出现的问题。
以下为原文:
解决context.startforegroundservice() did not then call service.startforeground()
原因:
- Android 8.0 系统不允许后台应用创建后台服务,故只能使用
Context.startForegroundService()
启动服务 - 创建服务后,应用必须在5秒内调用该服务的
startForeground()
显示一条可见通知,声明有服务在挂着,不然系统会停止服务 + ANR 套餐送上。 - Notification 要加 Channel,系统的要求。
解决步骤:
Service.java 中
-
@Override
-
public void onCreate() {
-
super.onCreate();
-
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.O) {
-
startFG();
-
}
-
}
-
private void startFG() {
-
NotificationBuilder builder = new NotificationBuilder(this);
-
final Notification notification = builder.buildNotification();
-
startForeground(NotificationBuilder.NOTIFICATION_ID, notification);
-
}
NotificationBuilder.java
-
public final class NotificationBuilder {
-
public static final String NOTIFICATION_CHANNEL_ID = "com.demo.CHANNEL_ID";
-
public static final int NOTIFICATION_ID = 0xD660;
-
private final Context mContext;
-
private final NotificationManager mNotificationManager;
-
public NotificationBuilder(Context context) {
-
mContext = context;
-
mNotificationManager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
-
}
-
public Notification buildNotification() {
-
if (shouldCreateNowPlayingChannel()) {
-
createNowPlayingChannel();
-
}
-
NotificationCompat.Builder builder = new NotificationCompat.Builder(mContext, NOTIFICATION_CHANNEL_ID);
-
return builder.setSmallIcon(R.drawable.all_app_takeaway_icon)
-
.setContentTitle("")
-
.setContentTitle("")
-
.setOnlyAlertOnce(true)
-
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
-
.build();
-
}
-
@RequiresApi(api = Build.VERSION_CODES.O)
-
private boolean nowPlayingChannelExists() {
-
return mNotificationManager.getNotificationChannel(NOTIFICATION_CHANNEL_ID) != null;
-
}
-
private boolean shouldCreateNowPlayingChannel() {
-
return Build.VERSION.SDK_INT >= Build.VERSION_CODES.O && !nowPlayingChannelExists();
-
}
-
@RequiresApi(api = Build.VERSION_CODES.O)
-
private void createNowPlayingChannel() {
-
final NotificationChannel channel = new NotificationChannel(
-
NOTIFICATION_CHANNEL_ID,
-
"当前播放",
-
NotificationManager.IMPORTANCE_LOW);
-
channel.setDescription("当前播放的电台");
-
mNotificationManager.createNotificationChannel(channel);
-
}
-
}
还要注意:
AndroidManifest.xml 中配置permission
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
启动Service方法:
-
//后台启动service
-
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.O) {
-
Intent serviceIntent = new Intent(this, DemoService.class);
-
startForegroundService(serviceIntent);
-
} else {
-
Intent serviceIntent = new Intent(this, DemoService.class);
-
startService(serviceIntent);
-
}