Serviço android em primeiro plano mínimo morto no telefone topo de linha

Estou tentando criar um aplicativo que permita aos usuários registrar rotas (locais / GPS). Para garantir que os locais sejam registrados mesmo quando a tela estiver desligada, criei umforeground service para o log de localização. Eu guardo os locais em umRoom Database que é injetado em meu serviço usandoDagger2.

No entanto, este serviço é eliminado pelo Android, o que obviamente não é bom. Eu poderia assinar avisos de pouca memória, mas isso não resolve o problema subjacente do meu serviço ser morto após ~ 30 minutos em um telefone moderno e moderno com Android 8.0

Eu criei um projeto mínimo com apenas uma atividade "Hello world" e o serviço:https://github.com/RandomStuffAndCode/AndroidForegroundService

O serviço é iniciado no meuApplication classe e o log de rota é iniciado por meio de umBinder:

// Application
@Override
public void onCreate() {
    super.onCreate();
    mComponent = DaggerAppComponent.builder()
            .appModule(new AppModule(this))
            .build();

    Intent startBackgroundIntent = new Intent();
    startBackgroundIntent.setClass(this, LocationService.class);
    startService(startBackgroundIntent);
}

// Binding activity
bindService(new Intent(this, LocationService.class), mConnection, Context.BIND_AUTO_CREATE | Context.BIND_IMPORTANT);
// mConnection starts the route logging through `Binder` once connected. The binder calls startForeground()

Eu provavelmente não preciso doBIND_AUTO_CREATE flag, eu tenho testado diferentes flags na tentativa de não matar meu serviço - sem sorte até agora.

Usando o criador de perfil, parece que não tenho nenhum vazamento de memória, o uso da memória é estável em ~ 35mb:

Usandoadb shell dumpsys activity processes > tmp.txt eu posso confirmar issoforegroundServices=true e meu serviço está listado em 8º na lista LRU:

Proc # 3: prcp F/S/FGS trm: 0 31592:com.example.foregroundserviceexample/u0a93 (fg-service)

Parece que não é possível criar um serviço em primeiro plano no qual você possa confiar para não ser morto. Então o que nós podemos fazer? Bem...

Coloque o serviço em um processo separado, na tentativa de permitir que o Android mate a interface do usuário / atividades enquanto deixa o serviço em paz. Provavelmente ajudaria, mas não parece uma garantiaPersistirtudo no serviço em p. um banco de dados da sala. Todas as variáveis, todas as classes personalizadas, todas as vezes que alguma das alterações e, em seguida, iniciam o serviço comSTART_STICKY. Isso parece um desperdício e não leva a um código muito bonito, mas provavelmente funcionaria ... um pouco. Dependendo de quanto tempo o Android leva para recriar o serviço após matá-lo, uma grande parte dos locais pode ser perdida.

Esse é realmente o estado atual de fazer coisas em segundo plano no Android? Não existe uma maneira melhor?

EDIT: A lista de permissões do aplicativo para otimização da bateria (desativá-lo) não impede que meu serviço seja interrompido

EDIT: UsandoContext.startForegroundService() iniciar o serviço não melhora a situação

EDIT: Então isso realmente ocorre apenas emalguns dispositivos, mas ocorre de forma consistente neles. Eu acho que você tem que optar por não suportar um grande número de usuários ou escrever um código realmente feio. Impressionante.

questionAnswers(3)

yourAnswerToTheQuestion