C'è un modo per impedire il riavvio automatico del mio servizio da parte di ActivityManager dopo che si "blocca"? In alcuni scenari, chiudo con forza il mio servizio all'uscita del programma, ma non voglio che Android continui a riavviarlo.Android: come impedire al servizio di riavviarsi dopo un arresto anomalo?
risposta
Il servizio può memorizzare un valore in SharedPreferences. Ad esempio è possibile memorizzare qualcosa di simile ogni volta che si avvia il servizio: store ("serviceStarted", 1);
Quando il servizio termina regolarmente (si invia un messaggio per farlo) si sostituisce questo valore: store ("serviceStarted", 0);
Quando la volta successiva che il servizio si riavvia, rileva che il valore di servizioStarted è "1", ovvero che il servizio non è stato arrestato regolarmente e si è riavviato automaticamente. Quando rilevi questo il tuo servizio può chiamare: stopSelf(); cancellare se stesso.
Per maggiori informazioni: http://developer.android.com/reference/android/app/Service.html#ServiceLifecycle
Questo comportamento è definito dal valore di ritorno della onStartCommand()
nel vostro Service
implementazione. La costante START_NOT_STICKY
indica a Android di non riavviare il servizio se è in esecuzione mentre il processo è "ucciso". In altre parole:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// We don't want this service to continue running if it is explicitly
// stopped, so return not sticky.
return START_NOT_STICKY;
}
HTH
Anche se non contrassegnato come soluzione accettata, questa è la risposta corretta – scooterman
Non funzionerà se ci sono intenti in sospeso. Ho questo problema e l'approccio sopra non funziona. L'approccio sotto potrebbe essere un'alternativa migliore ma non l'ho ancora implementato. Ho provato altri approcci suggeriti nello stack overflow ma non hanno ancora avuto successo. –
@BrianReinhold il tuo problema suona come se avesse una svolta specifica in questa domanda, hai pubblicato uno dei tuoi spiegando il tuo caso d'uso e i problemi che hai osservato? Sarei interessato a esaminarlo di più. – Devunwired
Ecco la soluzione mi è venuta in caso potrebbe aiutare qualcun altro. La mia app è stata riavviata anche con START_NOT_STICKY
. Così, invece, controllo se l'intento è null
, il che significa che il servizio è stato riavviato dal sistema.
@Override
public int onStartCommand(@Nullable Intent intent, int flags, int startId) {
// Ideally, this method would simply return START_NOT_STICKY and the service wouldn't be
// restarted automatically. Unfortunately, this seems to not be the case as the log is filled
// with messages from BluetoothCommunicator and MainService after a crash when this method
// returns START_NOT_STICKY. The following does seem to work.
Log.v(LOG_TAG, "onStartCommand()");
if (intent == null) {
Log.w(LOG_TAG, "Service was stopped and automatically restarted by the system. Stopping self now.");
stopSelf();
}
return START_STICKY;
}
Grazie! Avevo bisogno di recuperare frequenti aggiornamenti di posizione e inviarlo al server dal servizio. servizio di foreground basato sulla notifica, ma ha smesso di ricevere gli aggiornamenti di posizione, ogni volta che l'applicazione è stata chiusa. Dopo 2 giorni di conflitto, ho raggiunto la risposta e ottimizzato il codice. Prima di 'stopSelf()', ho configurato il riavvio dello stesso servizio utilizzando 'AlarmManager' dopo un ritardo di dire 10 secondi per ora.E questo ha funzionato molto bene, ora ottenendo continuamente aggiornamenti di posizione dal servizio. Molte grazie! – manoj
- 1. Come impedire "Pianificazione del riavvio del servizio in arresto anomalo"?
- 2. Arresto anomalo di Parse.com - android
- 3. Come impedire al gancio di arresto di ottenere un deadlock?
- 4. Come interpretate un rapporto di arresto anomalo Android deoffuscato?
- 5. Come si invia un rapporto di arresto anomalo al servizio Web quando l'applicazione si arresta in modo anomalo?
- 6. Arresto anomalo di Android su ListPreference
- 7. Arresto anomalo di un'app in Android
- 8. Impedire che un servizio Android venga distrutto dopo uno smantellamento
- 9. ALAssetsLibrary - arresto anomalo dopo la ricezione di ALAssetsLibraryChangedNotification
- 10. Arresto anomalo del server
- 11. Come estrarre informazioni di debug da un arresto anomalo
- 12. Arresto anomalo di Android. Come interpretare questa eccezione?
- 13. Arresto anomalo del distruttore
- 14. Semplice arresto anomalo dell'applicazione
- 15. Semplice arresto anomalo del programma
- 16. Servizio di arresto Android all'uscita dall'app
- 17. Debug di un arresto anomalo dopo l'uscita? (Dopo la restituzione del main)
- 18. Arresto anomalo dei dati principali con _Unwind_SjLj_Resume dopo la migrazione
- 19. java.lang.UnsatisfiedLinkErrore arresto anomalo di alcuni dispositivi
- 20. C# File.Replace protezione da un arresto anomalo
- 21. ZBar - Scanner di codici QR, arresto anomalo in Android Studio
- 22. Come si legge un rapporto di arresto anomalo Xcode?
- 23. L'emulatore Android Accelerated continua a riavviarsi
- 24. Arresto di un servizio Android da una discussione
- 25. Arresto di un servizio Windows multithreading
- 26. Arresto anomalo dell'applicazione su HttpLoggingInterceptor
- 27. Avviso di arresto anomalo impedendo l'esecuzione di Apache?
- 28. Arresto anomalo di iOS libobjc.A.dylib objc_msgSend
- 29. Arresto anomalo dell'app Android senza un'utile traccia dello stack
- 30. Spring Batch dopo arresto JVM
Mostra la tua implementazione scheletrica del servizio. –
È un servizio regolare o un IntentService? –