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
Come evitare il servizio di abbattimento del sistema quando l'applicazione/attività viene interrotta
risposta
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.
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
@Salivan: Hah, stavo solo aggiungendo un aggiornamento per quanto riguarda questo - vedi la risposta modificata. – CommonsWare
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
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;
}
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
Si potrebbe provare 'startForeground'. – Sipka
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
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()).
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
- 1. Il primo carattere viene interrotta quando viene utilizzato BufferedReader
- 2. Come gestire EINTR (chiamata di sistema interrotta)
- 3. Errore emulatore Android: "L'interfaccia utente del sistema è stata interrotta"
- 4. Arresta il servizio quando l'app viene chiusa
- 5. Perché il servizio di arresto del sistema viene eseguito immediatamente dopo l'avvio?
- 6. Sfortunatamente l'interfaccia utente del sistema è stata interrotta
- 7. Cosa accade in IIS/C# quando una richiesta viene interrotta
- 8. Perché chiamare base.OnStop() quando il servizio di Windows viene arrestato?
- 9. Posizione utente in background quando l'app viene interrotta/sospesa
- 10. Notifica il servizio WCF quando il database viene aggiornato
- 11. Perché la mia istanza AWS EC2 termina quando viene interrotta?
- 12. Il sistema Unix fork() chiama quando viene eseguito?
- 13. PGError: ERRORE: la transazione corrente viene interrotta
- 14. NSTextField contenuto del font non di sistema ritagliato quando viene utilizzato il valore SingleSingleLineMode
- 15. chiamata di sistema interrotta con coda di elaborazione
- 16. Come evitare di chiamare suCreateView quando il pulsante indietro viene premuto in un frammento in Android
- 17. La mia legenda matplotlib.pyplot viene interrotta
- 18. Come evitare il cast non controllato quando la variabile generica viene risolta in fase di runtime?
- 19. Come aggiungere un servizio di sistema a Android Framework
- 20. CreateFileMapping, MapViewOfFile, come evitare di sollevare la memoria di sistema
- 21. Sistema di moduli prisma dal servizio WCF?
- 22. Rileva l'attesa del sistema/sospensione/ibernazione dal servizio Windows .NET?
- 23. MPMusicPlayerController: l'iPod interrompe l'invio di notifiche, quando l'app iPod viene interrotta in background
- 24. Come evitare di denominare le collisioni all'interno del sistema dei moduli di Python?
- 25. Come posso eliminare le chiamate del sistema Perl quando lo script principale viene ucciso?
- 26. Il sistema operativo avvia i processi di uccisione quando viene eseguito il processo Python multi-thread
- 27. Suggerimenti per evitare la sindrome del secondo sistema
- 28. Come gestisco con garbo un servizio Android che viene ucciso dal sistema operativo?
- 29. Come evitare il messaggio di modifica del rifiuto del compositore
- 30. Come viene utilizzato il BIOS da un sistema operativo moderno?
Sei sicuro di non distruggere il servizio in onDestroy o da qualche parte nel codice attività? –
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
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