Il servizio non verrà ucciso, non importa cosa
-
22-12-2019 - |
Domanda
Ho un problema piuttosto curioso. Ho un servizio non rilegato che chiamo usando il codice seguente dalla mia attività principale quando l'app è aperta.
//some code checks if the service is awake. if not then the code below is called
Intent serviceIntent = new Intent(this, SMS_Listener_Service.class);
startService(serviceIntent);
.
Quando un nuovo SMS arriva nel servizio attende 3 secondi tramite un timer per garantire che l'osservatore del contenuto abbia salvato i dati sul DB SMS interno. Dopo di che è una chiamata a un intentuservice per fare il sollevamento pesante.
Per ragioni sconosciute, il servizio a volte si bloccherà e rimane bloccato su "Riavvio (vedi immagine)"
La cosa curiosa è che anche il tentativo di forzare l'arresto del servizio nella sezione Applicazioni non funziona. Scompare momentaneamente e quindi appare di nuovo con lo stesso messaggio. Anche l'utilizzo di StopService nel codice non funziona e il metodo OnDestroy all'interno del servizio non viene mai chiamato. L'unico modo per aggirarlo è quello di riavviare il telefono.
Problema è che quando è in questo stato non funziona. (È pensato per analizzare i messaggi SMS in entrata)
Sto correndo su una galassia nota 3 con Android 4.3
""
Il mio sospetto è che gli intentussertvice che fa il parsing effettivo non completano e quindi la chiamata per il servizio di smettere di sé non viene mai chiamato.
La mia domanda è, c'è un modo per costringere un intentuservice che ha appeso a fermarsi?
Questo è il codice in StartCommand nel servizio
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
if (!blnAutoSyncisEnabled) {
stopSelf();
return 0;
} else {
return START_STICKY;
}
}
.
Vista più dettagliata della stessa domanda qui https://stackoverflow.com/posts/21077517/edit
Soluzione
Questa potrebbe non essere una soluzione molto elegante, ma è possibile chiamare stopSelf()
direttamente nel metodo onCreate()
del servizio e gestire l'azione effettiva in è onDestroy()
prima di chiamare super.onDestroy()
.
Ho avuto un problema simile che ho risolto in questo modo.Forse questo risolverà anche il tuo problema.In bocca al lupo.;)