Olá pessoal,
Temos um aplicativo Android que roda uma sincronização em background de tempos em tempos utilizando IntentService (http://www.phaneronsoft.com.br/2018/08/10/iniciar-intentservice-android-com-alarmmanager-e-broadcastreceiver).
Este aplicativo inicialmente foi desenvolvido para rodar até a versão 7 do Android.
Quando o Android 8 foi liberado, migramos o SDK para a versão 27. Feito isso, quando o aplicativo estava em primeiro plano, estava tudo normal. Porém notamos que nos aparelhos com versão 8, quando o aplicativo não está rodando, o serviço de sincronização parou de iniciar automaticamente e gerando a exception java.lang.IllegalStateException: Not allowed to start service Intent.
Após algumas pesquisas, vi que a maneira como o serviço estava sendo iniciado foi alterado para a versão 8, como mostra a documentação de mudanças: https://developer.android.com/about/versions/oreo/android-8.0-changes.
Então foi só ajustar o código para o novo formato que funcionou corretamente.
Formato anterior :
Intent intentService = new Intent(context, SyncIntentService.class); startService(intentService);
Ajuste para Android 8:
Intent intentService = new Intent(context, SyncIntentService.class); // Valida a versão do Android. A partir do 8, usar startForegroundService. if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { ContextCompat.startForegroundService(context, intentService); } else { startService(intentService); }
Espero ter ajudado!
Comentários são bem-vindos.