pregunta fue hecha hace unos meses, pero por si alguien todavía está buscando respuestas espero que pueda ayudar.
En el siguiente ejemplo tenemos el servicio local, responsable de realizar algunas operaciones que requieren mucho tiempo. La actividad realiza las solicitudes al servicio, pero no se vincula a ellas, solo envía el intento con la solicitud. Además, Activity incluye la información de BroadcastReceiver que se debe devolver cuando el servicio se realiza con la tarea solicitada. La información es pasada por PendingIntent. El servicio maneja la tarea en el hilo de fondo y cuando la tarea finaliza, el servicio transmite el BroadcastReceiver con una respuesta.
1. Crear BroadcastReceiver subclase:
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 radiodifusión será notificado del servicio, cuando la tarea se realiza.
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();
msg.setData(bundle);
mServiceHandler.sendMessage(msg);
}
Bueno, la parte más importante es en el método handleMessage(). El servicio simplemente realiza la operación de difusión para entregar resultados a Broadcast Receiver.
3. También es necesario registrar su receptor de radiodifusión y el servicio en Manifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.ramps.servicetest"
android:versionCode="1"
android:versionName="1.0" >
....
<service android:name=".service.DataRequestService" android:exported="false"/>
<receiver android:name=".service.DataBroadcastReceiver"></receiver>
</application>
</manifest><br>
4.Y, por último, hacer una petición al servicio de la 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. La entrega de respuesta a cliente original/actividad.
Puede tener una actividad abstracta a partir de la cual se extenderán todas sus actividades. Esta actividad absoluta puede registrarse/anularse automáticamente como un oyente de respuesta en el receptor de difusión. No hay muchas opciones aquí en realidad, pero es importante que si mantiene referencias estáticas a su actividad, entonces debe eliminar la referencia cuando se destruye la actividad.
Regards,
Rampas
Por qué no simplemente invocar el BroadcastReceiver de servicio. ¿Todo esto se hace para ocultar el nombre de BroadcastReceiver del servicio? – Kiran
¿Cuál es la necesidad de crear controlador aquí? .Podemos poner enviar transmisión en onStart() también. –
@RohitBandil 'Service's se ejecuta en el subproceso de la interfaz de usuario, por lo que hacer la operación de fondo allí y enviar el resultado después sería frustrante el propósito de tener un servicio en segundo plano. 'IntentService' fue diseñado para ocultar esta complejidad de Handler de usted; no estoy seguro de por qué @Ramps no usó eso. – TWiStErRob