Come posso annullare tutti gli intenti in sospeso che vengono interrotti per il servizio di intenti

StackOverflow https://stackoverflow.com/questions/8358190

  •  27-10-2019
  •  | 
  •  

Domanda

Ho un servizio intenzionale che viene interrotto dall'utente e dalla mia app automaticamente. Devo essere in grado di uccidere tutti gli intenti in sospeso che vengono interrotti quando l'utente disconnette la mia applicazione, ma non riesco a farlo funzionare. Ho provato StopService () e StopSelf (), ma gli intenti continuano a sparare dall'intentService dopo che l'utente si è disconnesso. Cercherei di ottenere l'ID dell'intento, ma è difficile come inizia ogni volta che l'intentService, la variabile che tiene gli ID intenti è vuota. Ecco il mio codice intenstervice:

public class MainUploadIntentService extends IntentService {
private final String TAG = "MAINUPLOADINTSER";
private GMLHandsetApplication app = null;
private SimpleDateFormat sdf = null;
public boolean recStops = true;

public MainUploadIntentService() {
    super("Main Upload Intent Service");

    GMLHandsetApplication.writeToLogs(TAG,
            "GMLMainUploadIntentService Constructor");

}

@Override
protected void onHandleIntent(Intent intent) {
GMLHandsetApplication.writeToLogs(TAG, "onHandleIntent Started");
if (app == null) {
    app = (GMLHandsetApplication) getApplication();
}
uploadData(app);
    GMLHandsetApplication.writeToLogs(TAG, "onHandleIntent Finished");
}

@Override
public void onDestroy() {
GMLHandsetApplication.writeToLogs(TAG, "onDestroy Started");
app = null;
    stopSelf();
    GMLHandsetApplication.writeToLogs(TAG, "onDestroy completed");
}

public void uploadData(GMLHandsetApplication appl) {
    //All of my code that needs to be ran
}
È stato utile?

Soluzione

Sfortunatamente, non credo che sia possibile farlo con i metodi di intenzione standard poiché non offre un modo per interromperlo mentre sta già andando.

Ci sono alcune opzioni a cui riesco a pensare che puoi provare a vedere se si adattano alle tue esigenze.

  1. Copia il codice intenstervice per apportare le proprie modifiche ad esso che consentirebbe di rimuovere i messaggi in sospeso. Sembra che qualcuno abbia avuto un po 'di successo con quello qui: Android: intenstervice, come abortire o saltare un'attività nella coda manubrio
  2. Invece di copiare tutto il codice intenstervice, potresti anche essere in grado di legarlo come un servizio normale (poiché intenstervice estende il servizio) in modo da poter scrivere la propria funzione per rimuovere i messaggi in sospeso. Questo è anche menzionato in quel collegamento.
  3. Riscrivi invece l'intentService come servizio regolare. Con questa opzione, avresti un maggiore controllo sull'aggiunta e la rimozione dei messaggi.

Avevo quella che suonava come una situazione simile in cui stavo usando un intenservizio e alla fine l'ho appena convertito in un servizio. Questo mi ha permesso di eseguire le attività contemporaneamente e anche a annullarli quando avevo bisogno di cancellarli.

Altri suggerimenti

QuiQuando dovrei liberare le maniglie native (Android NDK)? è il HangAroundIntentService Classe che ha il metodo cancelQueue(). La classe ha anche il metodo

public static Intent markedAsCancelIntent(Intent intent)

Ciò converte un intento in un intento di annullamento e

public static boolean isCancelIntent(Intent intent).

La classe si basa sul codice di Google di origine aperta.

Solo un pensiero ma all'interno del tuo HandleIntent puoi avere un argomento che controlla se l'app è in esecuzione in caso contrario, non eseguire il codice? esempio. All'inizio della tua app potresti avere un var statico

boolean appRunning;

Successivamente nel tuo intento, quando si imposta l'apprunzione su False, dopo un onpause o un ondestroy di attività, è possibile avvolgere il codice onhandleintent in un booleano:

 protected void onHandleIntent(final Intent intent) {
     if(MainActivity.appRunning){
       ...
     }
}

Solo un pensiero

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top