Два приемника андроида LocalBroadcast, один в MainActivity, другой во фрагменте

В приложении для Android я зарегистрировал получателя в onCreate MainActivity

IntentFilter mFilter = new IntentFilter("Action");
LocalBroadcastManager.getInstance(this).registerReceiver(mReceiver, mFilter);

В своем резюме

new Thread(new Runnable() {
        @Override
        public void run() {
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                  Intent i = new Intent("Action");
                  LocalBroadcastManager.getInstance(MainActivity.this).sendBroadcast(i);
                }
            });
        }
    }).start();

Честно говоря, я не уверен, почему мы хотели использовать поток как таковой (я скопировал код откуда-то без его полного переваривания).

Это приложение поддерживает ViewPager, таким образом, в onCreate его связанного фрагмента

    IntentFilter mFilter = new IntentFilter("Action");
    LocalBroadcastManager.getInstance(getActivity()).registerReceiver(mReceiver, mFilter);

И в классе MainActivity, и в классе Fragment приемник выглядит следующим образом:

    private BroadcastReceiver mReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
         ...
    }

Только то, что внутри onReceive, отличается в обоих классах.

Я не знаю слишком много, как работает LocalBroadcast, я ожидал, что оба обработчика получателя будут запущены, как только будет отправлено широковещательное сообщение. Вместо этого я заметил, что в большинстве случаев работает только приемник в MainActivity, иногда в классе фрагментов.

Я догадываюсь, что есть какое-то отношение к части потока.

1 ответ

Решение

Причиной такого поведения может быть жизненный цикл как деятельности, так и фрагмента:

Согласно моему опыту, как методы вызываются, когда у вас есть Activity+Fragment:

  1. данный вид деятельности onCreate()
  2. данный вид деятельности onStart()
  3. данный вид деятельности onResume()
  4. осколком onCreateView()
  5. осколком onStart()
  6. осколком onResume()

Пояснение:

Поскольку ваш фрагмент еще не инициализирован, когда вы вещаете из onResume() в Деятельности он не мог быть сначала получен Фрагментом, но только получен Активностью. После этого, после инициализации фрагмента, фрагмент будет также принят фрагментом.

Другие вопросы по тегам