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
- Vinculación / desvinculación a un servicio en una aplicación
- ¿Por qué utilizar un servicio Android?
- Android: El servicio se detiene cuando la actividad está cerrada
- No se puede llamar a runOnUiThread en un subproceso desde dentro de un servicio
- ¿Hay alguna forma de punto de ruptura dentro de las clases probadas?
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.
- Android: Cómo enviar la solicitud http a través del servicio cada 10 segundos
- ¿Cuándo debo usar unbindService (), y cómo debo usarlo correctamente para desvincularme de un servicio remoto que está utilizando una interfaz AIDL?
- El servicio android se reinicia en la aplicación matado
- Servicio de intención nunca se llama
- Envíe la solicitud a la parte posterior y traiga a frente
- Cómo tener varias instancias de Servicio en Android
- Servicio de primer plano que se está matando en el clic de notificación
- ¿Cómo implementar callbacks usando IntentService en Android?
-
Necesita hacer que la clase resultreceiver personalizada se extienda desde ResultReceiver
-
Luego implementa la interfaz resultreceiver en su actividad
-
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
-
Create SomeResultReceiver se extiende desde resultReceiver
-
Crear interface someReceiver con el método on por ejemplo onReceivResult (int resultCode, Bundle resultData);
3.utilice algunosReceiver en algunosResultreceiver
-
Create someService extends IntentService y utiliza el método someresultReceiver.send () para enviar el resultado del servicio a la clase someOne (por ejemplo: MyActivity)
-
Implementar un receptor en la actividad
6.instantiation someResultReceiver en la clase MyActivity y setreceiver
- StartService con Intent y putExtra someResultreceiver instanse
Para obtener más detalles ResultReceiver Clase ver introducir la descripción del enlace aquí
- Obtener el nombre de actividad lanzable del paquete de adb
- Java.lang.ClassNotFoundException en la aplicación de trabajo