Usar ResultReceiver en Android

Fundamentalmente, me gustaría establecer una callback a una actividad de un servicio intencionado. Mi pregunta es muy similar a la que se responde 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 falta algo, ResultReceiver es realmente una clase, por lo que no puede realizar esta implementación.

Entonces, esencialmente, estoy preguntando cuál sería la forma correcta de conectar un receptor de resultados a ese servicio. Me confunden los conceptos de Handler y ResultReceiver con respecto a esto. Se agradecerá cualquier código de muestra que funcione.

  1. Es necesario que la clase de receptor de resultados personalizada se extienda desde ResultReceiver

  2. luego implementa la interfaz receptora de resultados en su actividad

  3. Pasar el objeto receptor de resultados personalizado a intentService y en intentservice simplemente recuperar el objeto receptor y llamar a la función receiver.send () para enviar algo a la actividad de llamada en el objeto Bundle.

    aquí está la clase customResultReceiver:

    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 tu actividad, crea una variable de clase

 Public MyResultReceiver mReceiver; 

inicialice esta variable en onCreate:

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

Pase este mReceiver al intentService a través de:

 intent.putExtra("receiverTag", mReceiver); 

y buscar en IntentService como:

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

y enviar algo a la actividad utilizando rec como:

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

esto se recibirá en onReceiveResult de la actividad. Puede ver el código completo en: IntentService: Devolver datos a la Actividad

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

Sobreescribes un método subclasificando. 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 usar 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; } } 

Lo haría con EventBus hoy en día

https://github.com/google/guava/wiki/EventBusExplicado

para uso Resulteceiver en android

  1. Crear SomeResultReceiver se extiende desde resultReceiver

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

3.usar algún receptor en algún receptor de resultados

  1. create someService extiende IntentService y utiliza someresultReceiver.send () método para enviar resultados del servicio a alguna clase One (ej: MyActivity)

  2. Implementar algún receptor en la actividad

6.instantiation algúnResultReceiver en la clase MyActivity y setreceiver

  1. startService con Intent y putExtra someResultreceiver instanse

para más detalles, clase de receptor de resultados, ver ingresar la descripción del enlace aquí

    Intereting Posts