Servicio mínimo de Android en primer plano asesinado en un teléfono de gama alta

Estoy tratando de crear una aplicación que permita a los usuarios registrar rutas (ubicaciones / GPS). Para garantizar que las ubicaciones se registren incluso cuando la pantalla está apagada, he creado unforeground service para el registro de ubicación. Almaceno las ubicaciones en unRoom Database que se inyecta en mi servicio usandoDagger2.

Sin embargo, este servicio es eliminado por Android, lo que, por supuesto, no es bueno. Podría suscribirme a advertencias de poca memoria, pero eso no resuelve el problema subyacente de que mi servicio sea asesinado después de ~ 30 minutos en un teléfono moderno de gama alta con Android 8.0

He creado un proyecto mínimo con solo una actividad de "Hola mundo" y el servicio:https://github.com/RandomStuffAndCode/AndroidForegroundService

El servicio se inicia en miApplication clase, y el registro de ruta se inicia a través de unBinder:

// 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()

Probablemente no necesito elBIND_AUTO_CREATE bandera, he estado probando diferentes banderas en un intento de que no se elimine mi servicio, hasta ahora no he tenido suerte.

Al usar el generador de perfiles, no parece que tenga pérdidas de memoria, el uso de la memoria es estable en ~ 35mb:

Utilizandoadb shell dumpsys activity processes > tmp.txt puedo confirmar esoforegroundServices=true y mi servicio aparece en el octavo lugar en la lista de LRU:

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

Parece que no es posible crear un servicio en primer plano en el que pueda confiar para que no lo maten. Entonces, ¿qué podemos hacer? Bien...

Ponga el servicio en un proceso separado, en un intento de dejar que Android elimine la UI / Actividades mientras deja el servicio solo. Probablemente ayudaría, pero no parece una garantíaPersistirtodo en el servicio en p. una base de datos de habitaciones. Cada variable, cada clase personalizada, cada vez que alguno de los cambios y luego iniciar el servicio conSTART_STICKY. Esto parece un poco despilfarrador y no conduce a un código muy hermoso, pero probablemente funcionaría ... de alguna manera. Dependiendo de cuánto tiempo le toma a Android volver a crear el servicio después de eliminarlo, se puede perder una gran parte de las ubicaciones.

¿Es este realmente el estado actual de hacer cosas en segundo plano en Android? ¿No hay una mejor manera?

EDITAR: la lista blanca de la aplicación para la optimización de la batería (deshabilitándola) no impide que mi servicio se cierre

EDITAR: UsandoContext.startForegroundService() iniciar el servicio no mejora la situación

EDITAR: Entonces, de hecho, esto solo ocurre enalgunos dispositivos, pero ocurre constantemente en ellos. Supongo que tienes que elegir entre no admitir una gran cantidad de usuarios o escribir código realmente feo. Increíble.

Respuestas a la pregunta(3)

Su respuesta a la pregunta