Как общаться между Android и другим процессом, используя широковещательный приемник - PullRequest
0 голосов
/ 15 мая 2019

У меня проблема с регистрацией broadcastReceiver между моей Активностью и моей Службой, которая определена в другом процессе в моем манифесте.

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

Вот мой код в моей службе:

Intent locationIntent = new Intent("LocationIntent");
        locationIntent.setAction("updatedLocations");
        locationIntent.setClass(getApplicationContext(), MapBoxActivity.class);
        locationIntent.putExtra("list",updatedList);
        sendBroadcast(locationIntent);

, и я регистрирую его в OnCreate моей активности:

updatedLocationBroadcast = new BroadcastReceiver() {
            @Override
            public void onReceive(Context context, Intent intent) {
                Timber.tag("localB").d("registered!");
                if (intent != null && intent.getAction() != null && intent.getAction().equals("updatedLocations")) {
                    sawLocationsList = (HashMap<Integer, MarkerItem>)intent.getSerializableExtra("list");
                    Timber.tag("sawL").d("updated" + sawLocationsList.toString());
                }
            }
        };
registerReceiver(updatedLocationBroadcast , new IntentFilter("updatedLocations"));

Как я и ожидал, я хотелчтобы увидеть мои broadcastReceiver регистры и мои Timber журналы localB registered!, которые определены в моем приемнике, но не работают.

Итак, как лучше всего обмениваться данными между Activity и Service, определенными в другом process, и получать данные непрерывно ???

Примечание: моя служба получает данные с сервера, но сервер неrealTime, поэтому я проверяю данные, периодически запрашивая у сервера команду handlers.

1 Ответ

1 голос
/ 15 мая 2019

, но это не работает

Это потому, что вы переопределили свой Intent.Замените:

    Intent locationIntent = new Intent("LocationIntent");
    locationIntent.setAction("updatedLocations");
    locationIntent.setClass(getApplicationContext(), MapBoxActivity.class);
    locationIntent.putExtra("list",updatedList);
    sendBroadcast(locationIntent);

на:

    Intent locationIntent = new Intent("updatedLocations");
    locationIntent.putExtra("list",updatedList);
    sendBroadcast(locationIntent);

Обратите внимание, что любое приложение сможет прослушивать эту трансляцию.Подумайте об использовании setPackage() в Intent, чтобы ограничить доставку своим приложением.

Каков наилучший способ взаимодействия между Activity и Service, определенной в другом процессе, и непрерывного получения данных?

Если бы я был вынужден пойти на это разделение процессов, я бы рассмотрел Messenger.

, мой сервис получает данные с сервера, но сервер не realTime, поэтому я проверяю данные попериодический запрос к серверу с использованием обработчиков.

Это не было рекомендуемой моделью в течение многих лет.Пожалуйста, используйте WorkManager.Или используйте JobScheduler, если вы не можете принять WorkManager (так как он является частью AndroidX).В любом из этих подходов вы можете избавиться от второго процесса и значительно упростить свои коммуникации.

...