я занимался этой темой в течение последних 3 дней. Наконец, я прочитал об ограничении фонового обслуживания для Android 8 на веб-сайте разработчика Android, и важно только одно, если вы хотите запускать свой сервис в фоновом режиме, вы должны показать уведомление в своем приложении.в течение 5 секунд в противном случае вы получите недопустимое исключение. Вот реализация
@Override
public void onCreate() {
super.onCreate();
startInForeground();
}
private void startInForeground() {
Intent notificationIntent = new Intent(this, SplashScreenActivity.class);
PendingIntent pendingIntent=PendingIntent.getActivity(this,0,notificationIntent,0);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this,"some_channel_id")
.setSmallIcon(R.drawable.ic_motion_new)
.setContentTitle("Sure")
.setContentText("Local call notification")
.setTicker("TICKER")
.setContentIntent(pendingIntent);
Notification notification=builder.build();
NotificationChannel channel = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
channel = new NotificationChannel("local_call_notification", "Local Call", NotificationManager.IMPORTANCE_MIN);
channel.setDescription("Local Call Notification");
NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.createNotificationChannel(channel);
}
startForeground(2, notification);
NotificationManager notificationManager= (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.cancel(2);
}
Запуск службы
Intent startServiceIntent = new Intent (context, xyz.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
context.startForegroundService(startServiceIntent);
} else {
context.startService(startServiceIntent);
}