Como faço para cancelar todas as intents pendentes que estão na fila para o serviço de intent

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

  •  27-10-2019
  •  | 
  •  

Pergunta

Tenho um serviço interno que é solicitado pelo usuário e pelo meu aplicativo automaticamente.Preciso ser capaz de eliminar todos os intents pendentes que ocorrem quando o usuário efetua logout do meu aplicativo, mas não consigo fazer isso funcionar.Tentei stopService () e stopself (), mas os intents continuam a disparar o intentservice depois que o usuário faz logout.Eu tentaria obter o id do intent, mas isso é difícil, pois sempre que o intentservice é iniciado, a variável que contém o id do intent está vazia.Aqui está o meu código de serviço intentservice:

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
}
Foi útil?

Solução

Infelizmente, não acho que seja possível fazer isso com os métodos IntentService padrão, uma vez que não oferece uma maneira de interrompê-lo enquanto ele já está em andamento.

Existem algumas opções em que posso pensar que você pode tentar para ver se atendem às suas necessidades.

  1. Copie o código IntentService para fazer suas próprias modificações que permitiriam a você remover mensagens pendentes. Parece que alguém teve algum sucesso com isso aqui: Android: intentservice, como abortar ou pular uma tarefa na fila do manipulador
  2. Em vez de copiar todo o código IntentService, você também pode ser capaz de vinculá-lo como um serviço normal (já que IntentService estende o serviço) para que você possa escrever sua própria função para remover mensagens pendentes. Este também é mencionado naquele link.
  3. Reescreva o IntentService como um serviço regular. Com essa opção, você teria mais controle sobre a adição e remoção de mensagens.

Tive o que parece ser uma situação semelhante em que estava usando um IntentService e acabei convertendo-o em um serviço. Isso me permitiu executar as tarefas simultaneamente e também cancelá-las quando precisei limpá-las.

Outras dicas

aqui Quando devo liberar as alças nativas (Android NDK)? é a classe HangAroundIntentService que possui o método cancelQueue(). A classe também tem o método

public static Intent markedAsCancelIntent(Intent intent)

que converte uma intent em uma intenção de cancelamento e

public static boolean isCancelIntent(Intent intent).

A aula é baseada no código de código aberto do Google.

Apenas uma ideia, mas dentro de seu onhandleintent, você pode ter um argumento que verifique se o aplicativo está em execução; se não, então não execute o código?exemplo.No início do seu aplicativo, você poderia ter uma var estática

boolean appRunning;

Em seguida, em seu onhandle do intent, ao definir appRunning como false, após um onPause ou onDestroy de atividade, você poderia envolver o código onhandleintent em um booleano:

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

Apenas uma ideia

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top