Два приемника андроида 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:
- данный вид деятельности
onCreate()
- данный вид деятельности
onStart()
- данный вид деятельности
onResume()
- осколком
onCreateView()
- осколком
onStart()
- осколком
onResume()
Пояснение:
Поскольку ваш фрагмент еще не инициализирован, когда вы вещаете из
onResume()
в Деятельности он не мог быть сначала получен Фрагментом, но только получен Активностью. После этого, после инициализации фрагмента, фрагмент будет также принят фрагментом.