2015-05-29 27 views
10

Voglio mantenere uno IntentService in esecuzione in background anche quando l'app viene uccisa. E per "ucciso" intendo stampa casa-pulsante per un lungo periodo di tempo ->vedi tutte le applicazioni in esecuzione ->colpo la mia app da parte ->app ucciso O premere il back-pulsante per un lungo periodo di tempo ->app uccisaAndroid: mantieni servizio in esecuzione quando l'app viene uccisa

Il mio codice è il seguente. Nel mio MainActivity:

Intent intent = new Intent(this, MyService.class); 
this.startService(intent); 

Nel mio MyService:

public class MyService extends IntentService { 

@Override 
protected void onHandleIntent(Intent intent) { 
    System.out.println("MyService started"); 
    run(); 
} 

private void run() { 
    while (true){ 
     System.out.println("MyService still running"); 
     doSomething(); 
     waitSomeTime(); 
    } 
} 

} 

vedo che il servizio è in esecuzione quando l'applicazione è aperta . È ancora in esecuzione quando I minimizza l'app tramite il pulsante Home. È ancora in esecuzione quando I chiude l'app tramite il pulsante Indietro. Ma si fermerà se lo ucciderò come menzionato sopra. Come lo risolvo?

+0

è possibile fare riferimento a questo. http://androidtrainningcenter.blogspot.in/2013/05/how-to-make-android-service-unstoppable.html –

+0

ho provato (scaricato l'esempio): sì, il servizio sopravvive un kill via task manager, ma non sopravvive al "premere indietro per molto tempo" uccidere. hai qualche idea? – user2078872

risposta

3

all'interno comando OnStart messo START_STICKY ... Questo servizio non uccidere a meno che non sta facendo troppo compito e kernel vuole uccidere per essa ...

@Override 
     public int onStartCommand(Intent intent, int flags, int startId) { 
      Log.i("LocalService", "Received start id " + startId + ": " + intent); 
      // We want this service to continue running until it is explicitly 
      // stopped, so return sticky. 
      return START_STICKY; 
     } 
+0

lavora per l'uccisione tramite task manager, ma il servizio non sopravvive un "back-pulsante per un lungo periodo" kill:/ – user2078872

+0

può essere se START_STICKY non funziona, niente funziona ... – kiturk3

3

La ragione di questo è che si stanno cercando di utilizzare un IntentService. Qui è la linea dal API Docs

L'IntentService esegue le seguenti operazioni:

interrompe il servizio, dopo tutto l'inizio richieste sono state gestite, in modo da mai di chiamare stopSelf().

Pertanto, se si desidera eseguire il servizio a tempo indeterminato, si consiglia di estendere la classe di servizio. Tuttavia, ciò non garantisce che il servizio verrà eseguito a tempo indeterminato. Il tuo servizio avrà comunque una possibilità di essere ucciso dal kernel in uno stato di memoria insufficiente se è a bassa priorità. Quindi hai due opzioni:
1) Continua a farlo in primo piano chiamando il metodo startForeground().
2) Riavviare il servizio se viene ucciso. Ecco una parte della esempio dai documenti dove si parla di riavviare il servizio dopo che è stato ucciso

public int onStartCommand(Intent intent, int flags, int startId) { 
     Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show(); 

     // For each start request, send a message to start a job and deliver the 
     // start ID so we know which request we're stopping when we finish the job 
     Message msg = mServiceHandler.obtainMessage(); 
     msg.arg1 = startId; 
     mServiceHandler.sendMessage(msg); 

     // If we get killed, after returning from here, restart 
     return START_STICKY; 
    } 
11

Se il servizio viene avviato dalla vostra applicazione poi effettivamente il servizio è in esecuzione sul processo principale. quindi, quando l'app viene uccisa, anche il servizio verrà interrotto. Che cosa si può fare è, invio broadcast da onTaskRemoved metodo del servizio nel seguente modo:

Intent intent = new Intent("com.android.ServiceStopped"); 
sendBroadcast(intent); 

e disporre di un ricevitore di broadcast che sarà di nuovo avviare un servizio. L'ho provato il servizio riprende da tutti i tipi di uccisioni.

+6

questa è la risposta giusta . Ho scritto un semplice esempio in un [blog] (http://fabcirablog.weebly.com/blog/creating-a-never-ending-background-service-in-android) – FabioC

+0

plz dimmi che cosa mi scrivere in media intenti "com.android.ServiceStopped" ciò significa che l'intento ho chiamato nel metodo sendBroadcast è creare un nuovo intento di arrestare il servizio –

+0

@AhmadJoyia si può plz chiarire questione ur. Non sono sicuro di dove esattamente tu abbia problemi. – BhendiGawaar

2

È possibile utilizzare android:stopWithTask="false" in manifest come sotto, Ciò significa che anche se l'utente uccide l'app rimuovendola dall'elenco attività, il servizio non si interromperà.

<service android:name=".service.StickyService" 
        android:stopWithTask="false"/> 
+0

È falso di default !! –