Autore Topic: Evitare che un Service venga killato  (Letto 957 volte)

Offline noodles

  • Utente junior
  • **
  • Post: 130
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus One
  • Sistema operativo:
    Mac OS X Snow Leopard
Evitare che un Service venga killato
« il: 14 Marzo 2011, 11:54:45 CET »
0
Salve ragazzi,
sto cercando di fare un app di prova per monitorare alcune informazioni dell'utente, tra cui anche la sua posizione, ma questi sono dettagli.
Ho di fatto implementato una sola activity che permette di lanciare un Service Locale che logga su sd card tutte le info di cui necessito oltre ad inviarle ad un server remoto.
L'app quando in background lancia anche delle notifiche sulla notification bar.

Dai log mi sono reso conto che il servizio facendo vari test non sopravvive quanto sperassi, l'altra sera per esempio è morto dopo 6 ore circa in background. C'è un modo per evitare che questo accada? So che è impossibile impedire che sopravviva indefinitamente, ma un modo per tenerlo in piedi a lungo o ristartalo se cade ci sarà, immagino.

fatemi sapere :)

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Evitare che un Service venga killato
« Risposta #1 il: 14 Marzo 2011, 12:55:26 CET »
+1
Premetto che non ho mai usato veramente i Service, però ho letto un po' qua e là come funzionano.

Di importante avevo letto che i long-running service possono effettivamente essere killati, se il sistema ha bisogna di recuperare memoria. Però vengono automaticamente fatti ripartire quando le risorse sono nuovamente disponibili, ammesso che sia stato implementato il corretto riavvio del tutto.

Ti riporto per comodità dove lo avevo letto, così valuti se è il tuo caso:
Services | Android Developers
Citazione
The Android system will force-stop a service only when memory is low and it must recover system resources for the activity that has user focus. If the service is bound to an activity that has user focus, then it's less likely to be killed, and if the service is declared to run in the foreground (discussed later), then it will almost never be killed. Otherwise, if the service was started and is long-running, then the system will lower its position in the list of background tasks over time and the service will become highly susceptible to killing—if your service is started, then you must design it to gracefully handle restarts by the system. If the system kills your service, it restarts it as soon as resources become available again (though this also depends on the value you return from onStartCommand(), as discussed later). For more information about when the system might destroy a service, see the Processes and Threading document.
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline noodles

  • Utente junior
  • **
  • Post: 130
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus One
  • Sistema operativo:
    Mac OS X Snow Leopard
Re:Evitare che un Service venga killato
« Risposta #2 il: 14 Marzo 2011, 13:02:13 CET »
0
Anche io ci ho lavorato poco, mai usati veramente per long-running work, tipo ora... ecco forse c'è da trattare il restrarting, senza farlo essere per forza in foreground.
Devo verificare il ritorno nella onStartCommand, probabile sia li il trucco :)

Grazie. Se risolvo vi faccio sapere.

Se qualcuno ci ha già sbattuto la testa mi faccia sapere. ;)

Offline noodles

  • Utente junior
  • **
  • Post: 130
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus One
  • Sistema operativo:
    Mac OS X Snow Leopard
Re:Evitare che un Service venga killato
« Risposta #3 il: 14 Marzo 2011, 13:07:39 CET »
+2
bastava leggere la documentazione... tipico esempio di pigrizia da non imitare :D

Citazione
Notice that the onStartCommand() method must return an integer. The integer is a value that describes how the system should continue the service in the event that the system kills it (as discussed above, the default implementation for IntentService handles this for you, though you are able to modify it). The return value from onStartCommand() must be one of the following constants:

START_NOT_STICKY
If the system kills the service after onStartCommand() returns, do not recreate the service, unless there are pending intents to deliver. This is the safest option to avoid running your service when not necessary and when your application can simply restart any unfinished jobs.
START_STICKY
If the system kills the service after onStartCommand() returns, recreate the service and call onStartCommand(), but do not redeliver the last intent. Instead, the system calls onStartCommand() with a null intent, unless there were pending intents to start the service, in which case, those intents are delivered. This is suitable for media players (or similar services) that are not executing commands, but running indefinitely and waiting for a job.
START_REDELIVER_INTENT
If the system kills the service after onStartCommand() returns, recreate the service and call onStartCommand() with the last intent that was delivered to the service. Any pending intents are delivered in turn. This is suitable for services that are actively performing a job that should be immediately resumed, such as downloading a file.
For more details about these return values, see the linked reference documentation for each constant.


ho modificato il codice, vediamo se funziona la cosa.

Offline noodles

  • Utente junior
  • **
  • Post: 130
  • Respect: +8
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus One
  • Sistema operativo:
    Mac OS X Snow Leopard
Re:Evitare che un Service venga killato
« Risposta #4 il: 16 Marzo 2011, 11:53:30 CET »
0
Allora è difficile fare test a riguardo, ma ci ho provato. Sembrerebbe che abbia funzionato, ma non come sperassi.
Il servizio è rimasto in esecuzione per circa 5 ore, poi è stato killato ed è ripartito da solo dopo 6 ore... usando il flag START_REDELIVER_INTENT. Positivo, ma inaccettabile, troppo tempo...

Non capisco, come altri servizi di altre app, rimangano quasi sempre su o cmq non mi pare siano inattivi per tutto questo tempo. Se fosse ripartito anche dopo un ora poteva anche andare bene, ma 6 ore sono troppe. Qualcuno ha avuto comportamenti simili?

Ci potrebbero essere altre soluzioni?

Non ho mai usato un AlarmManager, forse potrebbe essere una possibile alternativa... abbono il servizio e ad ogni ora (per esempio) rifaccio una startService(), se il servizio sarà su non succederà nulla, altrimenti ripartirà.

Offline Gioce90

  • Nuovo arrivato
  • *
  • Post: 17
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows 7
Re:Evitare che un Service venga killato
« Risposta #5 il: 25 Settembre 2012, 22:47:33 CEST »
0
hai risolto poi?