Sono in esecuzione di un servizio in background che legge GPS/posizione di rete e ha bisogno di fare quanto segue:Servizio Android e compito ripetitivo in esecuzione in discussioni
eseguito in background senza interruzioni al riavvio app e tenerlo vivo il più possibile senza essere uccisi (Questa è risolto con l'aiuto di commento muggito di Merlino)
su una nuova posizione ricevuta, chiamare un servizio web e inviare la posizione di lettura
hanno un repeti attività in esecuzione ogni 60 secondi e inviare nuovamente l'ultima posizione al servizio web. Ciò aiuterà nel caso in cui l'utente rimanga nella stessa posizione.
Ci sono alcune cose che ho considerato e non sono sicuro di aver capito bene. Il servizio viene eseguito nello stesso thread dell'app principale, pertanto l'invio della posizione al server sullo stesso thread del thread dell'interfaccia utente potrebbe causare il blocco dell'interfaccia utente e ciò non è corretto. Inoltre, non sono sicuro che gli ascoltatori GPS/rete abbiano i loro thread o utilizzano lo stesso thread dell'app.
Ecco un codice abbreviata del servizio per rendere le cose più chiare:
public class GPSLoggerService extends Service {
@Override
public void onCreate() {
locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 50, locationListenerNetwork);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 50, locationListenerGps);
scheduleTaskExecutor = Executors.newScheduledThreadPool(5);
scheduleTaskExecutor.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
updateLocation(lastLocation);
}, 60, 60, TimeUnit.SECONDS);
return START_STICKY;
}
LocationListener locationListenerGps = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
updateLocation(location);
}
...
}
LocationListener locationListenerNetwork = new LocationListener() {
@Override
public void onLocationChanged(Location location) {
updateLocation(location);
}
...
}
private void updateLocation(Location readLocation) {
//web service call
String response = WebServiceCalls.updateLocation(readLocation);
//log data in a local Sqlite database
saveLocation(readLocation)
}
La mia preoccupazione principale è come gestire la chiamata updateLocation e farlo in un thread separato dal thread applicazione principale. Il planningTaskExecutor credo che non sia la strada da percorrere. A volte, anche dopo aver chiamato stopService() il servizio rimane attivo, anche se dico a TaskExecutor di shutDown. Non riesco a trovare un'altra spiegazione per la quale il servizio non si stia fermando. Quindi per ricapitolare: ho bisogno di inviare la posizione ogni volta che gli ascoltatori ricevono una nuova posizione e la rinvia ogni 60 secondi. Devo anche essere in grado di interrompere il servizio rapidamente con la cancellazione dei thread attivi.
Come mi consiglieresti a gestire il mio caso?
hai bisogno per avviarlo appiccicoso? – Merlin