2014-04-13 10 views
5

Ho un'app con uno activity e uno service. Se uccido il activity mentre è in esecuzione lo service, anche questo viene ucciso. È molto importante per me che il servizio non venga ucciso. Come farlo quando il sistema uccide (o lo uccido cancellando l'elenco "App recenti") activity lo service rimane attivo fino a quando non termina il suo lavoro? Grazie in anticipo!Come evitare il servizio di abbattimento del sistema quando l'applicazione/attività viene interrotta

+0

Sei sicuro di non distruggere il servizio in onDestroy o da qualche parte nel codice attività? –

+0

Sì, sono sicuro perché vedo nei registri che il 'servizio' è in esecuzione e quando cancello l'elenco" App recenti "il' servizio' viene immediatamente ucciso e quindi riavviato perché ho impostato il tag 'START_STICKY'. – Salivan

+0

Oh, ti ho preso, mi stavi chiedendo di una cosa diversa. Ma sì, ne sono sicuro anche io. Non lo distruggo manualmente nel codice di 'attività'. D'altro canto, il mio 'attività' non ha nemmeno un metodo' onDestroy() 'sovrascritto, quindi forse è impostato per uccidere tutti i servizi correlati di default in quel metodo? – Salivan

risposta

1

E 'molto importante per me che il servizio non venga ucciso

I suoi processi possono essere uccisi in qualsiasi momento, per qualsiasi motivo, in base all'attività dell'utente (elenco attività recenti, task manager di terze parti, "Arresto forzato" in Impostazioni, ecc.) o in base alle esigenze del sistema operativo (la RAM del sistema si sta esaurendo). Non puoi impedirlo.

si può prendere alcune misure per ridurre al minimo le probabilità del sistema operativo di decidere da solo di sospendere l'processo, come l'utilizzo di startForeground() sul servizio, ma questo fa bloccare l'utente dal fare ciò che l'utente vuole con le procedure della tua app.

Sto visualizzando una finestra da tale servizio, quindi se il servizio si interrompe, la finestra scompare.

Presumibilmente, l'utente vuole vostra finestra a scomparire se l'utente è esplicitamente sbarazzarsi della vostra applicazione tramite la recente elenco delle attività, un task manager, ecc Siete certamente benvenuti ad informare gli utenti nella documentazione di eventuali effetti negativi che questo avrà.

Siete inoltre invitati a sperimentare che il servizio sia in un processo separato. La mia comprensione è che questo non sarà di aiuto con l'elenco delle attività recenti su Android 4.4, anche se potrebbe accadere nelle versioni precedenti di Android. Il fatto che questo aiuti con i task manager di terze parti dipende probabilmente dal gestore, e questo non dovrebbe essere d'aiuto con "Force Stop" dalle impostazioni. Significa anche che dovrai occuparti di IPC, maggiore consumo di RAM del sistema mentre i tuoi processi principali e di servizio sono entrambi in esecuzione, ecc.

+0

Ok, posso avviare il servizio in un altro processo in modo che quando l'utente interrompe il processo della mia domanda il mio processo di servizio rimane intatto? – Salivan

+0

@Salivan: Hah, stavo solo aggiungendo un aggiornamento per quanto riguarda questo - vedi la risposta modificata. – CommonsWare

+0

La finestra ha un pulsante di chiusura in modo che l'utente possa sbarazzarsi di quella finestra premendola. Questo arresta anche il servizio. Ma c'è un modo per far sì che il servizio rimanga in vita dopo che l'attività è stata uccisa dall'utente? – Salivan

2

Si può provare il ritorno START_STICKY dal onStartCommand nel vostro servizio:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    handleCommand(intent); 
    // We want this service to continue running until it is explicitly 
    // stopped, so return sticky. 
    return START_STICKY; 
} 
+0

L'ho già fatto ma questo non aiuta affatto perché ho bisogno che il 'servizio' non si fermi. Sto visualizzando una finestra da quel 'servizio', quindi se il' servizio' si ferma, la finestra scompare. Non ha senso ricreare la finestra. Ho bisogno che rimanga sullo schermo anche se l'attività viene uccisa, quindi ho bisogno di mantenere quel 'servizio' intatto fino a quando la finestra non viene chiusa. – Salivan

+1

Si potrebbe provare 'startForeground'. – Sipka

+0

Non penso che questo possa essere d'aiuto perché voglio evitare che il 'servizio' venga ucciso quando l'utente cancella l'elenco" App recenti ". Non dal sistema. – Salivan

0

Stai eseguendo un servizio associato? In tal caso, il sistema lo ucciderà quando l'ultima attività del client si disconnette (termina). Ecco la fascetta dal reference page:

Quando l'ultimo cliente slega dal servizio, il sistema distrugge il servizio (a meno che il servizio è stato avviato anche da StartService()).

+0

Servizio non associato e non sistema. Voglio che il servizio rimanga in vita dopo che l'UTENTE ha cancellato l'elenco "App recenti" e ha interrotto l'attività. – Salivan

Problemi correlati