2012-10-02 14 views
17

Gradirei alcune indicazioni su come affrontare il SO uccidendo un servizio a lungo termine.La migliore architettura per un servizio di lunga durata su Android

scenario di business:

applicazione registra un brano BTT che può durare per diverse ore. Può anche mostrare la traccia sulla mappa insieme alle statistiche pertinenti.

L'interfaccia utente dell'applicazione consente all'utente di avviare/interrompere la registrazione della traccia e visualizzare la traccia in tempo reale su una mappa.

Dopo l'avvio della registrazione, l'utente può uscire dall'applicazione e disattivare lo schermo (per risparmiare energia), e solo un servizio rimarrà in esecuzione per mantenere l'aggiornamento della registrazione nel database (notifica mostrata), finché l'utente non riavvia l'attività e chiedere la registrazione stop, che si traduce in interruzione del servizio.

Problema:

Dopo un tempo variabile, che va da 40 minuti a 1 ora e mezza, il servizio di registrazione viene ucciso senza alcun preavviso. Poiché le uscite BTT possono richiedere diverse ore, questo risultato risulta incompleto nella registrazione della traccia.

Alcune informazioni aggiuntive:

servizio viene avviato con START_STICKY e acquista un PARTIAL_WAKE_LOCK, e viene eseguito nello stesso processo come l'attività principale.

Nuove posizioni vengono acquisite (e registrate) a una velocità definita dall'utente da 1 secondo a diversi minuti. So dalla documentazione di Android che questo è il comportamento del sistema operativo previsto per servizi a lunga esecuzione.

Domanda:

Qual è il miglior approccio di progettazione dell'architettura di avere un'applicazione ben educati che potesse soddisfare le esigenze dello scenario di business?

mi viene in mente un paio di opzioni (e non mi piace nessuno di loro), ma vorrei una guida da qualcuno come hanno già affrontato e risolto problema simile:

  • ricevitore Usa broadcast (idealmente collegato a Location Manager se è possibile) per far funzionare il servizio solo quando viene acquisita una nuova posizione ?
  • Non consentire all'utente di abbandonare l'attività principale (con conseguente esperienza utente)?
  • Avere un ricevitore di trasmissione allarme che riavvia il servizio se necessario?

Grazie a tutti coloro che potrebbero condividere un po 'di saggezza su questo argomento.

risposta

9

Ho un'app che fa una cosa molto simile. Mi assicuro che il servizio continui a funzionare rendendolo un'attività in primo piano.Quando sono pronti per iniziare a correre, io chiamo questa funzione, che stabilisce anche una notifica:

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); 
} 

e poi per uscire dalla modalità primo piano quando si accede è finito:

stopForeground(true); 
+0

Grazie Michael. Vado a testarlo e ti farò sapere il risultato. – Luis

+0

Ha funzionato per ore senza fermarsi. È risolto :-) Grazie a Michael. – Luis

+0

Felice di aiutare! – Michael

Problemi correlati