Хорошо, это имеет смысл.

ю, что на вопрос о том, как общаться между службой и деятельностью, много раз отвечали, но я также хочу, чтобы мой собственный способ сделать это был пересмотрен и узнать, является ли это приемлемым и правильным способом сделать это, и каковы Недостатки того, как я справился с этим. Сначала я изложу постановку задачи настолько подробно, насколько смогу.

Мне нужно создать приложение, в котором я использую Firebase Messaging Service для связи между двумя устройствами. Скажем, это Uber-подобная система. Одно приложение предназначено для поставщика услуг (водителя), а другое - для клиента (пассажира). Когда пассажир просит отправиться в путешествие по месту своего нахождения, водители в определенном радиусе получат push-уведомление с полезной нагрузкой с использованием Firebase. Служба Firebase работает в фоновом режиме. Когда служба получает push-уведомление,onMessageReceived метод вызывается. Событие генерируется. Я не использую здесь Firebase для генерации уведомлений, но на самом деле передаю данные между устройствами, когда мне нужно использоватьdata поле Firebase push-уведомлений. Теперь приложение для водителей будет получать координаты, где пользователь хочет автомобиль в полезной нагрузке push-уведомления Firebase. Я могу просто начать действие с этими данными в дополнениях и показать водителю, что запрос получен.

Теперь на стороне клиента, после того, как клиент отправляет запрос, он переходит к следующему действию, где ему показывается своего рода экран загрузки, предлагающий ему подождать, пока один из водителей не примет его запрос. Когда один из драйверов принимает запрос этого пользователя, этот пользователь теперь получает push-уведомление Firebase с информацией о назначенном драйвере в полезной нагрузке push-уведомления. Опять же, цель не в том, чтобы генерировать какие-либо уведомления, а в том, чтобы передавать данные между устройствами.

Теперь, когда вы понимаете вариант использования, я перейду к проблеме.

Проблема возникает, когда пользователь отправляет запрос и переходит к следующему экрану ожидания, где ему показывается экран загрузки, предлагающий ему подождать, пока запрос не будет принят одним из водителей. Когда водитель принимает запрос, как я уже сказал, пользователь получит push-уведомление Firebase с информацией о драйвере в полезной нагрузке push-уведомления. Как мне связаться между службой и действием, чтобы заставить действие перестать показывать экран загрузки и заполнить TextView данными, полученными в полезной нагрузке push-уведомления.

Вот как я справился с этим. Предположим, что у меня есть активность с именемAwaitingDriver, который имеет TextView для заполнения данными драйвера. Но в настоящее время активность показывает экран загрузки, потому что запрос еще не принят. Теперь пользователь получает push-уведомление с информацией о драйвере в сервисе, работающем в фоновом режиме, никак не связанном с активностью. Вот мойonMessageReceived метод

    @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
        }            
    }

Вот,AwaitingDriver.requestAccepted() статический методAwaitingDriver деятельность. ВнутриAwaitingDriver само действие, которое показывает диалог прогресса, чтобы сказать клиенту ждать, вот какой методAwaitingDriver.requestAccepted() делается.

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();
    }
}

ВотstaticActivity является статическим объектомAwaitingDriver класс активности объявлен внутри этого класса. Я устанавливаю его значение вonResume а такжеonPause методы. Это означает, что если активность находится впереди, отображается на экране, только тогда значениеstaticActivity будь неnull, ВотonResume а такжеonPause методы.

@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;
}

Вот,TaskFindSetValues AsyncTask определен внутриAwaitingDriver класс деятельности. Вот код дляTaskFindSetValues

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);
    }
}

Пожалуйста, просмотрите этот код и расскажите мне о недостатках такого решения вместо других решений, и если бы вы также могли объяснить предложенный способ тем же примером, я был бы очень благодарен.

Ответы на вопрос(4)

Ваш ответ на вопрос