Вопрос по android – Обновление Активности от BroadcastReceiver

3

Этот вопрос поднял интересную проблему.

У OP есть приложение, которое отображает карту, и эта карта должна быть обновлена с помощью маркеров местоположения, полученных с помощью SMS-сообщений. Отдельные шаги довольно просты: SMS-сообщения могут быть полученыBroadcastReceiverмаркеры могут отображатьсяItemizedOverlay на вершинеMapView, Сложнее всего, чтобы принимающая часть связывалась с основной частью приложения.

  • What happens if the app has an active MapActivity, and then its BroadcastReceiver is invoked as a response to an incoming SMS? Is the MapActivity suspended while the BroadcastReceiver code is executed in the same process? If so, is it safe for BroadcastReceiver to access the MapActivity via a static reference (which is set by the activity's onCreate method?

  • Conversely, is an app's BroadcastReceiver executed in a separate process, and would therefore need some other way to communicate with the app's activty?

Ваш Ответ

3   ответа
1

BroadcastReceiver должен работать в том же процессе.BroadcastReceiver разработан, чтобы быть недолгим. Как таковой он может выполняться без какого-либо реального беспокойства о приостановке переднего планаActivity, Вы можете получить доступ кActivity непосредственно через статическую ссылку, если вы проверили случай, когдаActivity еще не был создан. Тем не менее, это может иметь больше смысла для общения через интенты.

0

как отмечали другие, заключается в создании отдельного намерения, которое является частным для приложения. Вместо того, чтобы объявлять его в манифесте, действие регистрирует его всякий раз, когда оно активно.Этот ответ объясняет как это.

ПубликаBroadcastReceiver (который объявлен в манифесте и обрабатываетandroid.provider.Telephony.SMS_RECEIVED) должен затем вызвать это специфическое для приложения намерение.

4

похоже, что BroadcastReceiver выполняется в другом процессе, хотя я не уверен на 100% (Жизненный цикл BroadcastReceiver)

A process that is currently executing a BroadcastReceiver (that is, currently running the code in its onReceive(Context, Intent) method) is considered to be a foreground process

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

Примите во внимание, что Activity также может действовать как BroadcastReceiver, то есть вы должны контролировать, когда в своем жизненном цикле он активно прослушивает события. Таким образом, вы можете подписаться в onResume (код, извлеченный из проекта ZXing)

 public void onResume(){
    activity.registerReceiver(powerStatusReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
    [...]
  }

  public void onPause() {
    [...]
    activity.unregisterReceiver(powerStatusReceiver);
  }

И вы определяете BroadcastReceiver как закрытый класс внутри публичного класса

final class InactivityTimer {

[onResume, onPause, rest of the stuff ...]

    private final class PowerStatusReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent){
          if (Intent.ACTION_BATTERY_CHANGED.equals(intent.getAction())) {
            // 0 indicates that we're on battery
            // In Android 2.0+, use BatteryManager.EXTRA_PLUGGED
            int batteryPlugged = intent.getIntExtra("plugged", -1);
            if (batteryPlugged > 0) {
              InactivityTimer.this.cancel();
            }
          }
        }
      }
}

Таким образом, BroadcastReceiver всегда должен сохранять новые маркеры (через Сервис, а не внутриonReceive) И он должен уведомить потенциально активную MapActivity о том, что были добавлены новые маркеры, которые будут прослушивать, если он активен.

Или, что еще проще, Activity и BroadcastReceiver прослушивают одно и то же SMS-намерение. В то время как последний сохраняет это, первый обновляет карту, хотя я просто догадываюсь, что я попробую.

Похожие вопросы