2011-09-11 20 views
6

Tengo un IntentService que pone en cola las llamadas al servicio web que se realizarán. Paso un entero como Extra con cada Intención que define el tipo de llamada de servicio web que se realizará.Capturar IntenService Intents before onHandleIntent

Me gustaría crear una situación en la que, si se transfiere una intención de realizar un servicio web concreto a IntentService y ya existe una intención para ese mismo servicio web en la cola IntentService, la intención no se procesa. Idealmente, descartaría el Intento, pero también podría agregarle un Extra que le permita al código saber omitir el Intento una vez que se maneje. A medida que ingresen las Intenciones, podría hacer un seguimiento de cuáles están en la cola en algún objeto que agregue a IntentService.

Sin embargo, no veo un lugar para interceptar el derecho de intención cuando se pasa a IntentService. Por lo que puedo decir, solo puedo tocarlo cuando se llame aHandleIntent y eso sería demasiado tarde.

¿Alguna idea?

Respuesta

5

No es aconsejable en sentido estricto, pero me gustaría sugerir algo como esto:

public int onStartCommand (Intent intent, int flags, int startId) 
{ 
    // do your intent modification here 
    //if(intentIsDuplicate(intent)) 

    // make sure you call the super class to ensure everything performs as expected 
    return super.onStartCommand(intent, flags, startId); 
} 

Quiero saber si funciona.

+0

Vi este método en la documentación de IntentService, pero no estaba muy seguro de cuándo se llama. También noté que no debe ser anulado. ¿Alguna idea de por qué? – Andrew

+0

Básicamente, la llamada interna 'onStartCommand' probablemente maneja la puesta en cola: si la sobreescribe y se asegura de que realmente llama al método de la superclase, DEBERÍA estar bien. – Femi

+0

Esto parece estar funcionando bien. Guardo un mapa donde la clave es un entero que representa el tipo de servicio web que se llama y el valor es un booleano que representa si existe o no un intento para esa llamada en la cola. En onStartCommand veo si el Intent entrante es para una llamada que ya existe en la cola. Si lo hace, agrego un extra llamado "skip". En onHandleIntent, compruebo "saltar" y omito cualquier código si existe. Pero antes de dejar onHandleIntent, actualizo el mapa y establezco el valor de esa clave en falso. – Andrew