¿Cómo comunicarse entre el servicio de mensajería Firebase y la actividad? Androide

Sé que la pregunta sobre cómo comunicarse entre un servicio y una actividad ha sido respondida muchas veces, pero también quiero que se revise mi propia forma de hacerlo y saber si es una forma aceptable y correcta de hacer esto y cuáles son inconvenientes de cómo lo manejé. Primero expondré el enunciado del problema con el mayor detalle posible.

Tengo que crear una aplicación donde estoy usando el servicio de mensajería Firebase para comunicarme entre dos dispositivos. Digamos que es un sistema similar a Uber. Una aplicación es para el proveedor de servicios (conductor) y otra para el cliente (pasajero). Cuando el pasajero solicita viajar con su ubicación, los conductores en un radio determinado recibirán una notificación push con una carga útil utilizando Firebase. El servicio Firebase se ejecuta en segundo plano. Cuando el servicio recibe una notificación push,onMessageReceived Se invoca el método. Se genera un evento. No estoy usando Firebase aquí para generar notificaciones, pero en realidad transfiero datos entre dispositivos cuando necesito usar eldata campo de notificación push de Firebase. Ahora la aplicación de controladores recibirá las coordenadas de dónde quiere el usuario el automóvil en la carga útil de la notificación push de Firebase. Simplemente puedo comenzar una actividad con estos datos en los extras y mostrarle al conductor que se recibió una solicitud.

Ahora del lado del cliente, después de que el cliente envía la solicitud, se los lleva a la siguiente actividad donde se les muestra una especie de pantalla de carga que les dice que esperen a que uno de los conductores acepte su solicitud. Cuando uno de los controladores acepta la solicitud de este usuario, este recibirá una notificación push de Firebase con la información del controlador designado en la carga de la notificación push. Nuevamente, el propósito no es generar notificaciones, sino transferir datos entre dispositivos.

Ahora que comprende el caso de uso, pasaré al problema.

El problema surge cuando el usuario envía la solicitud y pasa a la siguiente pantalla de espera donde se le muestra una pantalla de carga que le dice que espere mientras la solicitud está esperando ser aceptada por uno de los conductores. Cuando un conductor acepta la solicitud, como dije, el usuario recibirá una notificación push de Firebase con la información del conductor en la carga útil de la notificación push. ¿Cómo me comunico entre el servicio y la Actividad, para indicarle a la actividad que deje de mostrar la pantalla de carga y llene los TextView con los datos recibidos en la carga de la notificación push?

Así es como he manejado esto. Supongamos que tengo una actividad con el nombreAwaitingDriver, que tiene TextView para ser llenado por los datos del controlador. Pero actualmente la actividad muestra una pantalla de carga porque la solicitud aún no ha sido aceptada. Ahora el usuario recibe una notificación push con la información del controlador en el servicio que se ejecuta en segundo plano, no conectado a la actividad de ninguna manera. Aquí está mionMessageReceived método

    @Override
    public void onMessageReceived(RemoteMessage remoteMessage){
        SharedPreferences rideInfoPref = getSharedPreferences(getString(R.string.rideInfoPref), MODE_PRIVATE);
        SharedPreferences.Editor rideInfoPrefEditor = rideInfoPref.edit();
        String msgType = remoteMessage.getData().get("MessageType");
        if (msgType.equals("RequestAccepted")){                
            rideInfoPrefEditor.putBoolean(getString(R.string.is_request_accepted), true);
            rideInfoPrefEditor.putString(getString(R.string.driver_phone), remoteMessage.getData().get("DriverPhone"));
            rideInfoPrefEditor.putString(getString(R.string.driver_lat), remoteMessage.getData().get("DriverLatitude"));
            rideInfoPrefEditor.putString(getString(R.string.driver_lng), remoteMessage.getData().get("DriverLongitude"));

            rideInfoPrefEditor.commit();
            AwaitingDriver.requestAccepted(); // A static method in AwaitingDriver Activity
        }            
    }

Aquí,AwaitingDriver.requestAccepted() es un método estático deAwaitingDriver actividad. Dentro deAwaitingDriver actividad en sí, que muestra un cuadro de diálogo de progreso para indicarle al cliente que espere, este es el métodoAwaitingDriver.requestAccepted() está haciendo.

public static void requestAccepted(){
    try{
        awaitingDriverRequesting.dismiss(); //ProgressDialog for telling user to wait
    }catch (Exception e){
        e.printStackTrace();
    }        
    if (staticActivity != null){
        staticActivity.new TaskFindSetValues().execute();
    }
}

aquístaticActivity es un objeto estático deAwaitingDriver clase de actividad declarada dentro de esta clase. Estoy estableciendo su valor enonResume yonPause métodos Es decir, si la actividad está en el frente, que se muestra en la pantalla, solo entonces el valor destaticActivity no seasnull. Aquí están losonResume yonPause métodos

@Override
public void onResume(){
    super.onResume();
    staticActivity = this;
    Boolean accepted = rideInfoPref.getBoolean(getString(R.string.is_request_accepted), false);
    if (accepted){        
       new TaskFindSetValues().execute();            
    }
}
@Override
protected void onPause(){
    super.onPause();
    staticActivity = null;
}

Aquí,TaskFindSetValues es una AsyncTask definida dentroAwaitingDriver clase de actividad Aquí está el código paraTaskFindSetValues

public class TaskFindSetValues extends AsyncTask<String, Void, String>{
    String phone;
    String lat;
    String lng;
    @Override
    protected void onPreExecute(){
        SharedPreferences pref = getSharedPreferences(getString(R.string.rideInfoPref), MODE_PRIVATE);            
        phone = pref.getString(getString(R.string.driver_phone), "");
        lat = pref.getString(getString(R.string.driver_lat), "");
        lng = pref.getString(getString(R.string.driver_lng), "");
    }
    @Override
    protected String doInBackground(String... arg0){
        return null;
    }

    @Override
    protected void onPostExecute(String returnValue){            
        awaitingDriverPhone.setText(phone); //setting values to the TextViews
        awaitingDriverLat.setText(lat);
        awaitingDriverLng.setText(lng);
    }
}

Revise este código y cuénteme los inconvenientes de hacer esto en lugar de las otras soluciones y si también pudiera explicar la forma sugerida con el mismo ejemplo, estaría muy agradecido.

Respuestas a la pregunta(4)

Su respuesta a la pregunta