Saltar al contenido

¿Cómo usar PendingIntent para comunicarse desde un Servicio a un cliente/Actividad?

Investigamos en todo internet para así brindarte la respuesta para tu duda, si tienes alguna duda puedes dejarnos tu comentario y te contestaremos con gusto.

La pregunta se hizo hace unos meses, pero en caso de que alguien todavía esté buscando una respuesta, espero poder ayudar.

En el siguiente ejemplo, tenemos un servicio local, responsable de realizar algunas operaciones que consumen mucho tiempo. La actividad realiza las solicitudes al servicio, pero no se vincula a él, solo envía la intención con la solicitud. Además, Activity incluye la información de BroadcastReceiver que debe devolverse cuando se realiza el servicio con la tarea solicitada. La información se pasa por PendingIntent. El servicio maneja la tarea en segundo plano y cuando finaliza la tarea, el servicio transmite el BroadcastReceiver con una respuesta.

1. Cree la subclase BroadcastReceiver:

public class DataBroadcastReceiver extends BroadcastReceiver 
   static Logger log = LoggerFactory.getLogger(DataRequestService.class);   
   @Override
   public void onReceive(Context context, Intent intent) 
      log.info(" onReceive");
   

Este receptor de transmisión será notificado desde el servicio, cuando se complete la tarea.

2. Crear servicio

public class DataRequestService extends Service {

   private final class ServiceHandler extends Handler 
      public ServiceHandler(Looper looper) 
         super(looper);
      

      @Override
      public void handleMessage(Message msg) 
         log.info("handleMessage");
         //... performing some time-consuming operation         
         Bundle bundle = msg.getData();
         PendingIntent receiver = bundle.getParcelable("receiver");
         // Perform the operation associated with PendingIntent
         try             
            //you can attach data from the operation in the intent.
            Intent intent = new Intent();
            Bundle b = new Bundle();
            //b.putString("key", value);
            intent.putExtras(b);
            receiver.send(getApplicationContext(), status, intent);
          catch (CanceledException e)          
         e.printStackTrace();
                  
      
   
   
   @Override
   public void onStart(Intent intent, int startId) 
      Bundle bundle = intent.getExtras();
      Message msg = mServiceHandler.obtainMessage();
      msg.setData(bundle);
      mServiceHandler.sendMessage(msg);
   

Bueno, la parte más importante está en el método handleMessage(). El servicio simplemente realiza la operación de transmisión para entregar resultados al receptor de transmisión.

3. También debe registrar su receptor de transmisión y servicio en Manifest.xml


   ....
       
       
    

4. Y finalmente, haga una solicitud a su servicio desde Actividad:

Intent serviceIntent = new Intent(context, DataRequestService.class);   
   @Override
   public void onClick(View v) 
      //this is the intent that will be broadcasted by service.
      Intent broadcastReceiverIntent = new Intent(context, DataBroadcastReceiver.class);      
      //create pending intent for broadcasting the DataBroadcastReceiver
      PendingIntent pi = PendingIntent.getBroadcast(context, 0, broadcastReceiverIntent, 0);      
      Bundle bundle = new Bundle();            
      bundle.putParcelable("receiver", pi);
      //we want to start our service (for handling our time-consuming operation)
      Intent serviceIntent = new Intent(context, DataRequestService.class);
      serviceIntent.putExtras(bundle);
      context.startService(serviceIntent);
   

5. Entrega de respuesta al cliente/actividad original.

Puede tener una actividad abstracta a partir de la cual se extenderán todas sus actividades. Esta actividad abstracta puede registrarse o darse de baja automáticamente como oyente de respuesta en el receptor de transmisión. No hay muchas opciones aquí en realidad, pero es importante que si sigues static referencias a su actividad, debe eliminar la referencia cuando se destruya la actividad.

Saludos,
rampas

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags :

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *