Android: muestra los datos recibidos de un servicio en primer plano en un MapView dentro de una actividad

4 minutos de lectura

Avatar de usuario de H.Karatsanov
H.Karatsanov

he implementado un foreground service por darme la ubicación actual cada 10 segundos. Con los datos recopilados quiero mostrar una ruta en el mapa.

Sin embargo, cuando se trata de seguimiento de ubicación y servicios, la pantalla del teléfono no estará siempre encendida debido al ahorro de batería. Entonces la actividad llamará onPause(), onStop() métodos y el punto más temprano para el MapView la actualizacion sera despues onResume(). Hasta este momento en cada transmisión a la actividad envío la lista de todos LatLng objetos, borre la ruta hasta este momento y vuelva a mostrar la ruta usando un Polyline

Hace el trabajo, pero de alguna manera lo encuentro muy ineficiente, hablando de recursos del sistema.

La alternativa estará en cada transmisión para guardar los objetos LatLng recibidos en una lista como List<LatLng> points=new ArrayList<LatLng>(); inicializados en la actividad, y para mostrar los datos, calcule la diferencia entre las coordenadas recibidas y las que ya están guardadas en la Lista de Actividades, y muestre solo aquellas al Polyline.

¿Qué piensas? ¿Hay también un mejor enfoque que estos dos?

  • ¿Dónde está exactamente la pregunta?

    – 0xA

    1 de mayo de 2020 a las 10:43

  • ¿Existe también una tercera alternativa en términos de recursos del sistema, mejor que estas dos?

    – H.Karatsanov

    1 de mayo de 2020 a las 10:48

  • ¿De cuántos puntos estás tratando de hacer un seguimiento? ¿Cuánto tiempo se ejecutará el servicio de primer plano?

    – 0xA

    1 mayo 2020 a las 10:55

  • Dependiendo del usuario. Si no detiene el servicio dentro de 2 horas, entonces 2 horas.

    – H.Karatsanov

    1 de mayo de 2020 a las 10:57

En primer lugar, debo mencionar que stackoverflow se trata de una pregunta sobre optimizaciones de código, errores, problemas de software y soluciones, no ideas.

Un servicio de primer plano cada 10 segundos será costoso con respecto a la CPU y la batería. Dicho esto, hay algunas maneras de evitar esto:

// Store data in somekind of database
1- SQLite (On the phone not recommended as writing and reading database values can take alot of time and be resource-extensive)
2- Firebase(Remote best option)
3- SharedPrefernces(On the phone but single key-value pairs works for your case )

Tutorial de base de fuego: https://www.androidauthority.com/create-a-gps-tracking-application-with-firebase-realtime-databse-844343/

//To minimize resource usages instead of a foreground service consider but try to increase your time between requests.
1-AlarmManger
2-setWindow
3-setExact

Por último, no elimine su antiguo polyline y cree uno nuevo ya que los gráficos son enemigos de la memoria y la batería. solo haz algo como:

LatLng somePoint = new LatLng(location.getLatitude(), location.getLongitude());

//Then add this point to the existing `polyline`:

List<LatLng> fullPointList = somePolyLine.getPoints();
fullPointList.add(somePoint);
somePolyLine.setPoints(fullPointList);

  • Mi error es la idea, soy relativamente nuevo en el desarrollo de Android y, en algunos casos, no estoy seguro de qué usar exactamente. Mencionó SharedPreferences, pero bajo “valor” ¿quiere decir solo una coordenada y no una lista de ellas?

    – H.Karatsanov

    1 de mayo de 2020 a las 11:41

  • Permíteme presentarte la documentación de Android de tu nuevo mejor amigo: desarrollador.android.com/docs Busque o navegue hasta SharedPreferences y compruébelo. No olvides aceptar la respuesta si te ayudó (:

    – 0xA

    1 de mayo de 2020 a las 11:47


Establezca la identificación única para su ruta actual. Cuando el servicio se está ejecutando, almacene los puntos en la base de datos. Luego transmita su evento (puede ser con su identificación de ruta actual) y cárguelos por separado de su Actividad para obtener los puntos.

  • Gracias por la idea, así que en lugar de usar estructuras de datos, ¿es mejor usar una base de datos?

    – H.Karatsanov

    1 de mayo de 2020 a las 10:54

  • Sí, por lo tanto, no necesita almacenarlos cuando cambia el estado de Actividad.

    – etomun

    1 de mayo de 2020 a las 11:06

  • Está bien, pero ¿cómo vas a actualizar el mapa? Quiero decir, el servicio se está ejecutando, guardamos los datos en la base de datos. Después de llamar a onResume() de la actividad, obtendremos los datos de la base de datos, pero después de que el servicio haya almacenado al mismo tiempo otra coordenada, no se mostrará en el mapa. Por lo tanto, funcionará solo si apagamos y encendemos la pantalla, pero en el caso de que la pantalla esté encendida continuamente.

    – H.Karatsanov

    1 de mayo de 2020 a las 11:13

  • Su servicio realiza dos tareas cada vez que recibe una actualización de ubicación, almacena el último punto en la base de datos y transmite el evento. La actividad debe observar esa transmisión.

    – etomun

    1 de mayo de 2020 a las 11:19


  • si está hablando de SQLite o algún tipo de base de datos interna (en el teléfono), no lo haga. será peor que lo que tienes actualmente.

    – 0xA

    1 de mayo de 2020 a las 11:21

¿Ha sido útil esta solución?