Когда экземпляр LifecycleRegistry начинает прослушивать изменения жизненного цикла LifecycleOwner?

Я начал изучать компоненты архитектуры, но ничего не нашел.

LifecycleFragment просто создает новый LifecycleRegistry, который не начинает отслеживать жизненный цикл фрагмента.

Я предполагаю, что объект LifecycleRegistry начинает отслеживать жизненный цикл фрагмента, когда мы, например, помещаем его в LiveData.observe() в качестве первого параметра, но я не нашел доказательств это в исходном коде.

Вопрос. Когда и как объект LifecycleRegistry начинает наблюдать жизненный цикл фрагмента и обновить LifecycleRegistry.mState?


person Gogi Bobina    schedule 16.06.2017    source источник


Ответы (4)


Существует ContentProvider под названием LifecycleRuntimeTrojanProvider, который объединен с приложением AndroidManifest.xml. В своем методе onCreate он инициализирует синглтон с именем LifecycleDispatcher, который отвечает за обновление всех экземпляров LifecycleRegistry.

LifecycleDispatcher использует Application.registerActivityLifecycleCallbacks метод, который существует с API 14, чтобы получать уведомления при создании нового действия. В этот момент он вводит экземпляр ReportFragment в активность. ReportFragment использует обратные вызовы жизненного цикла Fragment для обновления LifecycleRegistry активности, если это необходимо, например так:

@Override
public void onStop() { // Showing onStop as example
    super.onStop();
    dispatch(Lifecycle.Event.ON_STOP);
}

private void dispatch(Lifecycle.Event event) {
    if (getActivity() instanceof LifecycleRegistryOwner) {
        ((LifecycleRegistryOwner) getActivity()).getLifecycle().handleLifecycleEvent(event);
    }
}

Если новым действием является FragmentActivity, LifecycleDispatcher вызывает FragmentManager.registerFragmentLifecycleCallbacks, чтобы получать уведомления о событиях жизненного цикла фрагментов активности. Он передает обратные вызовы onFragmentCreated, onFragmentStarted и onFragmentResumed в LifecycleRegistry в случае, если фрагмент является LifecycleRegistryOwner, так же, как и раньше.

Обратные вызовы onFragmentPaused, onFragmentStopped и onFragmentDestroyed вызываются после того, как соответствующие обратные вызовы вызываются для фрагмента, но обратные вызовы LifecycleObserver должны быть вызваны до этого. Поэтому всякий раз, когда создается фрагмент, LifecycleDispatcher внедряет в него экземпляр LifecycleDispatcher.DestructionReportFragment. Обратные вызовы жизненного цикла DestructionReportFragment используются для обновления реестра для событий паузы, остановки и уничтожения.

Я не могу дать ссылку на код, потому что он еще не выпущен, но вы можете просмотреть его в Android Studio после того, как добавите библиотеку в свой проект.

person Samuel Peter    schedule 15.08.2017

Как сказал Мордаг, на данный момент и LifecycleActivity, и LifecycleFragment еще не реализованы. В своей документации Google говорит:

Любой пользовательский фрагмент или активность можно превратить в LifecycleOwner путем реализации встроенного интерфейса LifecycleRegistryOwner (вместо расширения LifecycleFragment или LifecycleActivity).

Однако это только половина истории, потому что, естественно, вы используете эти компоненты Lifecycle Aware, чтобы иметь возможность реагировать на ваши жизненные циклы Activity/Fragment, и с их фрагментом кода это просто не работает, потому что инициализация LifecycleRegistry с помощью Activity/Fragment как это

LifecycleRegistry lifecycleRegistry = new LifecycleRegistry(this);

получает только жизненный цикл в состоянии ИНИЦИАЛИЗИРОВАНО.

Короче говоря, для того, чтобы это работало прямо сейчас (ДО их выпуска 1.0), именно вы должны реализовать жизненный цикл действия/фрагмента, который реализует LifecycleRegistry. Итак, для каждого обратного вызова Activity/Fragment вам нужно сделать это:

public class ScoreMasterFragment extends Fragment
                                 implements LifecycleRegistryOwner {


    private LifecycleRegistry lifecycle;

    @Override
    public LifecycleRegistry getLifecycle() {
        return lifecycle;
    }

    public ScoreMasterFragment(){
         lifecycle = new LifecycleRegistry(this);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //more code here
        lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
    }

    @Override
    public void onStart() {
        super.onStart();
        //more code here
        lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_START);

    }

    @Override
    public void onResume() {
        super.onResume();
        //more code here
        lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
    }

    @Override
    public void onPause() {
        super.onPause();
        //more code here
        lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);
    }

    @Override
    public void onStop() {
        super.onStop();
        //more code here
        lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        //more code here
        _lifecycle.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
    }

Скорее всего, это будет в коде будущих LifecycleActivity и LifecycleFragment, но до тех пор, если вы поместите свои действия/фрагменты, наблюдающие за каким-либо объектом LifecycleAware (например, LiveData), вам придется это сделать.

В случае LiveData, потому что он не будет уведомлять своих наблюдателей, если они не находятся, по крайней мере, в состоянии STARTED, а в других случаях, потому что другие компоненты LifecycleAware не могут реагировать на жизненный цикл, если его единственное состояние — INITIALIZED.

person CarlosGoncalves    schedule 29.06.2017
comment
Спасибо за ответ, но нет, мне не нужно делать все эти обратные вызовы, это работает прямо сейчас. Вам нужно только определить LifecycleRegistry и реализовать LifecycleOwner - person Gogi Bobina; 30.06.2017
comment
Тогда я, вероятно, неправильно понял ваш вопрос. Но то, что я написал, в основном определяет LifecycleRegistry, который, как я полагаю, вам понадобится при наблюдении за LiveData. Разве не это вы искали? - person CarlosGoncalves; 30.06.2017
comment
Карлос, я ищу, как активность или фрагмент отправляют информацию об изменении жизненного цикла в объект LifecycleRegistry - person Gogi Bobina; 30.06.2017
comment
И не могли бы вы отредактировать свой вопрос с помощью кода, чтобы было немного понятнее, что вы пытаетесь сделать? Спасибо. - person CarlosGoncalves; 30.06.2017

LifecycleFragment и LifecycleActivity в настоящее время реализованы не полностью. Эти классы будут реализованы, когда библиотека достигнет версии 1.0. В настоящее время вы можете использовать эти LifecycleRegistry для наблюдения за объектами LiveData. Эти объекты основаны на будущем результате, который мог бы, например. быть объектом из вашей базы данных.

Официальную документацию можно найти здесь: https://developer.android.com/topic/libraries/architecture/index.html

Официальное заявление относительно двух упомянутых вами классов:

Фрагмент жизненного цикла и ActivityCompat в библиотеке поддержки еще не реализуют интерфейс LifecycleOwner. Они появятся, когда архитектурные компоненты достигнут версии 1.0.0.

person Mordag    schedule 28.06.2017

Интерфейсы LifecycleActivity, LifecycleFragment и LifecycleRegistryOwner устарели на уровне API 1.0.0. Вместо него используйте android.support.v7.app.AppCompatActivity и android.support.v4.app.Fragment. Официальная документация здесь LifecycleActivity LifeCycleFragment

person Nidhin    schedule 10.11.2017