Como faço para cancelar todas as intents pendentes que estão na fila para o serviço de intent
-
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
}
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.
- 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
- 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.
- 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