studio programacion para moviles edición desarrollo desarrollar arquitectura arquitectos aprende apps aplicaciones android service android-service android-lifecycle

para - manual de programacion android pdf



La mejor arquitectura para un servicio de larga duración en Android (1)

Tengo una aplicación que hace algo muy similar. Me aseguro de que el servicio se siga ejecutando, convirtiéndolo en una tarea de primer plano. Cuando estoy listo para comenzar a correr, llamo a esta función, que también configura una notificación:

void fg() { Notification notification = new Notification(R.drawable.logstatus, "Logging On", System.currentTimeMillis()); Intent notificationIntent = new Intent(this, LoggerActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); notification.setLatestEventInfo(this, "Logger","Logger Running", pendingIntent); startForeground(1, notification); }

y luego, para dejar el modo de primer plano cuando finalice el registro:

stopForeground(true);

Agradecería alguna orientación sobre cómo lidiar con el sistema operativo matando a un servicio a largo plazo.

Escenario empresarial:

La aplicación registra una pista BTT que puede durar varias horas. También puede mostrar la pista en el mapa junto con estadísticas relevantes.

La interfaz de usuario de la aplicación permite al usuario iniciar / detener la grabación de la pista y ver la pista en tiempo real en un mapa.

Después de iniciar el registro, el usuario puede salir de la aplicación y apagar la pantalla (para ahorrar energía), y solo un servicio seguirá funcionando para mantener la actualización de la grabación en la base de datos (se muestra la notificación), hasta que el usuario vuelva a iniciar la actividad y solicite detener la grabación. , lo que resulta en la terminación del servicio.

Problema:

Después de un tiempo variable, que se extiende de 40 minutos a 1 hora y media, el servicio de grabación muere sin previo aviso. Como las salidas de BTT pueden durar varias horas, esto puede resultar en una grabación incompleta.

Alguna información adicional:

El servicio se inicia con START_STICKY y adquiere un PARTIAL_WAKE_LOCK , y se ejecuta en el mismo proceso que la actividad principal.

Las nuevas ubicaciones se adquieren (y se registran) a una velocidad definida por el usuario desde 1 segundo hasta varios minutos. Sé por la documentación de Android que este es el comportamiento esperado del sistema operativo para los servicios de larga ejecución.

Pregunta:

¿Cuál es el mejor enfoque de diseño de arquitectura para tener una aplicación de buen comportamiento que pueda satisfacer los requisitos del escenario empresarial?

Puedo pensar en un par de opciones (y no me gustan en ninguna de ellas), pero me gustaría que alguien me ayudara a resolver el problema similar:

  • ¿Usar el receptor de difusión (idealmente conectado a Location Manager si es posible) para que el servicio solo se ejecute cuando se adquiere una nueva ubicación?
  • ¿No permite que el usuario abandone la actividad principal (que se traduce en una experiencia de usuario vertida)?
  • ¿Tiene un receptor de alarma que reinicie el servicio si es necesario?

Gracias a todos los que pudieron compartir algo de sabiduría sobre este tema.