implement - intent service android
Usar ResultReceiver en Android (5)
Fundamentalmente, me gustaría establecer una devolución de llamada a una actividad de un servicio intencionado. Mi pregunta es muy similar a la que se responde aquí:
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.
Es necesario que la clase de receptor de resultados personalizada se extienda desde ResultReceiver
luego implementa la interfaz receptora de resultados en su actividad
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.
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
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) {
...
}
}
});
para uso Resulteceiver en android
Crear SomeResultReceiver se extiende desde resultReceiver
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
create someService extiende IntentService y utiliza someresultReceiver.send () método para enviar resultados del servicio a alguna clase One (ej: MyActivity)
Implementar algún receptor en la actividad
6.instantiation algúnResultReceiver en la clase MyActivity y setreceiver
- startService con Intent y putExtra someResultreceiver instanse
para más detalles, clase de receptor de resultados, ver ingresar la descripción del enlace aquí