Uso de ResultReceiver en Android

Fundamentalmente, me gustaría establecer una devolución de llamada a una actividad de un IntentService. Mi pregunta es muy similar a la respuesta aquí:

Servicio de API relajante

Sin embargo, en el código de respuesta, se considera que el código de actividad implementa un ResultReceiver. A menos que me falte algo, ResultReceiver es en realidad una clase, por lo que no puede realizar esta implementación.

Así que esencialmente, estoy preguntando cuál sería la manera correcta de conectar un ResultReceiver a ese servicio. Me confundo con los conceptos de Handler y ResultReceiver con respecto a esto. Cualquier código de muestra de trabajo sería apreciado.

  1. Necesita hacer que la clase resultreceiver personalizada se extienda desde ResultReceiver

  2. Luego implementa la interfaz resultreceiver en su actividad

  3. Pase el objeto resultreceiver personalizado a intentService y en intentservice solo busque el objeto receptor y llame a la función receiver.send () para enviar algo a la actividad de llamada en el objeto Bundle.

    Aquí es customResultReceiver clase:

    public class MyResultReceiver extends ResultReceiver { private Receiver mReceiver; public MyResultReceiver(Handler handler) { super(handler); // TODO Auto-generated constructor stub } public interface Receiver { public void onReceiveResult(int resultCode, Bundle resultData); } public void setReceiver(Receiver receiver) { mReceiver = receiver; } @Override protected void onReceiveResult(int resultCode, Bundle resultData) { if (mReceiver != null) { mReceiver.onReceiveResult(resultCode, resultData); } } } 

Implementa la interfaz Myresultreceiver.receiver en su actividad, crea una variable de clase

 Public MyResultReceiver mReceiver; 

Inicializar esta variable en onCreate:

 mReceiver = new MyResultReceiver(new Handler()); mReceiver.setReceiver(this); 

Pase este mReceiver a la intentionService a través de:

 intent.putExtra("receiverTag", mReceiver); 

Y buscar en IntentService como:

 ResultReceiver rec = intent.getParcelableExtra("receiverTag"); 

Y envíe cualquier cosa a la actividad usando rec como:

 Bundle b=new Bundle(); rec.send(0, b); 

Esto será recibido en onReceiveResult de la actividad. Puede ver el código completo en: IntentService: Proporcionar datos a la actividad

Editar: Debe llamar a setReceiver (this) en onResume y setReceiver (null) en onPause () para evitar fugas.

Anula un método mediante subclase. No tiene que ser una interfaz para hacer eso.

Por ejemplo:

 intent.putExtra(StockService.REQUEST_RECEIVER_EXTRA, new ResultReceiver(null) { @Override protected void onReceiveResult(int resultCode, Bundle resultData) { if (resultCode == StockService.RESULT_ID_QUOTE) { ... } } }); 

He creado un ejemplo simple que demuestra cómo utilizar ResultReceiver .

MainActivity :

 public class MainActivity extends AppCompatActivity { private final static String TAG = MainActivity.class.getSimpleName(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Intent serviceIntent = new Intent(this, MyService.class); serviceIntent.putExtra("logName", "MAIN_ACTIVITY"); serviceIntent.putExtra(MyService.BUNDLED_LISTENER, new ResultReceiver(new Handler()) { @Override protected void onReceiveResult(int resultCode, Bundle resultData) { super.onReceiveResult(resultCode, resultData); if (resultCode == Activity.RESULT_OK) { String val = resultData.getString("value"); Log.i(TAG, "++++++++++++RESULT_OK+++++++++++ [" + val + "]"); } else { Log.i(TAG, "+++++++++++++RESULT_NOT_OK++++++++++++"); } } }); startService(serviceIntent); } } 

MyService :

 public class MyService extends Service { private final static String TAG = MyService.class.getSimpleName(); public final static String BUNDLED_LISTENER = "listener"; @Override public void onCreate() { super.onCreate(); } @Override public int onStartCommand(Intent intent, int flags, int startId) { String logName = intent.getStringExtra("logName"); ResultReceiver receiver = intent.getParcelableExtra(MyService.BUNDLED_LISTENER); Bundle bundle = new Bundle(); bundle.putString("value", "30"); receiver.send(Activity.RESULT_OK, bundle); return Service.START_NOT_STICKY; } @Nullable @Override public IBinder onBind(Intent intent) { return null; } } 

Para uso Resulteceiver en android

  1. Create SomeResultReceiver se extiende desde resultReceiver

  2. Crear interface someReceiver con el método on por ejemplo onReceivResult (int resultCode, Bundle resultData);

3.utilice algunosReceiver en algunosResultreceiver

  1. Create someService extends IntentService y utiliza el método someresultReceiver.send () para enviar el resultado del servicio a la clase someOne (por ejemplo: MyActivity)

  2. Implementar un receptor en la actividad

6.instantiation someResultReceiver en la clase MyActivity y setreceiver

  1. StartService con Intent y putExtra someResultreceiver instanse

Para obtener más detalles ResultReceiver Clase ver introducir la descripción del enlace aquí

  • Context.startService (intento) o startService (intención)
  • Android: no se puede iniciar la intención de servicio: ¿no se encuentra?
  • Desactivar ocultar una presentación (pantalla secundaria)
  • Reinicio automático de la aplicación tras la actualización del mercado
  • Android: Transmisión de datos entre servicio y actividad
  • ¿Debo usar PendingIntent.getService () o getBroadcast con AlarmManager?
  • ¿Por qué el servicio Android falla con NullPointerException?
  • Cómo iniciar el servicio en android sin actividad
  • Android: envía los datos de la ubicación en segundo plano periódicamente (cada 30 segundos) y solicita al servidor nuevos datos
  • AlarmManager o Servicio
  • Servicio de grabación / procesamiento de llamadas! - Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.