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

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

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

В его onResume

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, иногда в классе фрагментов.

Я предполагаю, что есть что-то делать с частью резьбы.


person J.E.Y    schedule 11.06.2016    source источник


Ответы (1)


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

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

  1. Действия onCreate()
  2. Действия onStart()
  3. Действия onResume()
  4. Фрагмент onCreateView()
  5. Фрагмент onStart()
  6. Фрагмент onResume()

Пояснение :

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

person Janki Gadhiya    schedule 11.06.2016