¿Cómo cancelo todos los intentos pendientes que se preguntan para el servicio de intención?

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

  •  27-10-2019
  •  | 
  •  

Pregunta

Tengo un servicio intensivo que el usuario lo pregunta y mi aplicación automáticamente. Necesito poder matar todos los intentos pendientes que se preguntan cuando el usuario cierre la sesión de mi aplicación, pero parece que no puedo hacer que eso funcione. He probado StopService () y StopSelf (), pero los intentos continúan disparando el servicio intensivo después de que el usuario se haya registrado. Intentaría obtener la identificación de la intención, pero eso es difícil ya que cada vez que comienza el servicio intensivo, la variable que contiene las ID de intención está vacía. Aquí está mi código de servicio 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
}
¿Fue útil?

Solución

Desafortunadamente, no creo que sea posible lograr eso con los métodos de servicio intensivo estándar, ya que no ofrece una forma de interrumpirlo mientras ya va.

Hay algunas opciones en las que se me ocurre que pueda tratar de ver si satisfacen sus necesidades.

  1. Copie el código IntentService para realizar sus propias modificaciones que le permitan eliminar los mensajes pendientes. Parece que alguien tuvo cierto éxito con eso aquí: Android: Intentservice, cómo aborta o omite una tarea en la cola de mango
  2. En lugar de copiar todo el código de servicio Intentservice, también puede vincularse a él como un servicio normal (ya que IntentService extiende el servicio) para que pueda escribir su propia función para eliminar los mensajes pendientes. Este también se menciona en ese enlace.
  3. Reescribe el servicio Intentservice como un servicio regular. Con esta opción, tendría más control sobre la adición y eliminación de mensajes.

Tenía lo que suena como una situación similar en la que estaba usando un servicio Intentservice, y finalmente lo convertí en un servicio. Eso me permitió ejecutar las tareas simultáneamente y también cancelarlas cuando necesitaba borrarlas.

Otros consejos

Aquí¿Cuándo debo liberar las manijas nativas (Android NDK)? es el HangAroundIntentService clase que tiene el método cancelQueue(). La clase también tiene el método

public static Intent markedAsCancelIntent(Intent intent)

que convierte una intención en una intención de cancelación, y

public static boolean isCancelIntent(Intent intent).

La clase se basa en el código de Google de código abierto.

Solo un pensamiento, pero dentro de su OnHandleIntent, ¿puede tener un argumento que verifica si la aplicación se está ejecutando si no, entonces no ejecute el código? ejemplo. Al comienzo de su aplicación, podría tener una var estática

boolean appRunning;

A continuación, en su avance de la intención, cuando establece la apertura en falso, después de una onma o una actividad de actividad, puede envolver el código OnHandleIntent en un booleano:

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

Solo un pensamiento

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top