Задержки onStop для вызова при возобновлении активности - PullRequest
0 голосов
/ 29 октября 2018

При перезапуске действия, onStop() из предыдущего действия слишком сильно задерживает вызов.

Я использую этот код для возобновления своей активности PlayerActivity.java

Intent playerIntent = getIntent();
playerIntent.putExtra(Constants.VIDEO_ID, videoId);
playerIntent.putExtra(Constants.CATEGORY_ID, categoryId);
playerIntent.setFlags(Intent.FLAG_ACTIVITY_NO_ANIMATION);
finish();
startActivity(playerIntent);

Давайте назовем PreviousPlayerActivity и NewPlayerActivity , предыдущее действие и новое действие. (помня, что они одинаковые PlayerActivity).

Последовательность

При перезапуске приложение следует этому потоку в жизненном цикле действия.

PreviousPlayerActivity onPause() --> 
NewPlayerActivity onCreate() --> 
NewPlayerActivity onStart() --> 
NewPlayerActivity onResume() --> 
NewPlayerActivity performs a heavy operation --> 
PreviousPlayerActivity onStop() --> 
PreviousPlayerActivity onDestroy()

Что мне нужно

Мне нужно, чтобы PreviousPlayerActivity было уничтожено до запуска NewPlayerActivity. Тем не менее, onStop() вызывается только после тяжелой операции, поэтому задерживается примерно на 10 секунд.

Что я пробовал

Если я использую метод recreate(), он разрушает PreviousPlayerActivity перед вызовом NewPreviousActivity, но, вызывая recreate(), я не могу поместить Extras в новый экземпляр действия.

Вопросы

  1. Как полностью уничтожить PreviousActivity при перезапуске активности?
  2. Есть ли способ поставить экстрас при использовании recreate()?

Ответы [ 2 ]

0 голосов
/ 30 октября 2018

In Activity Lifecycle из руководства разработчика Android.

Координация деятельности

Когда одно действие начинает другое, они оба переживают жизненный цикл переходы. Первое действие перестает работать и входит в Приостановлено или Остановленное состояние, пока создается другое действие. Если эти мероприятия обмениваются данными, сохраненными на диске или в другом месте, важно понять, что первая деятельность не полностью остановлена ​​до второй создан. Скорее, процесс запуска второго один пересекается с процессом остановки первого.

Порядок обратных вызовов жизненного цикла четко определен, особенно когда эти два действия находятся в одном процессе (приложение), и одно начинается другой. Вот порядок операций, которые происходят, когда действие A начинает деятельность B:

  1. Выполнение метода A * onPause().
  2. Действия B onCreate(), onStart() и onResume() выполняются последовательно. (Занятие B теперь имеет фокус на пользователя.)
  3. Затем, если действие A больше не отображается на экране, выполняется его метод onStop().

Эта предсказуемая последовательность обратных вызовов жизненного цикла позволяет вам управлять переход информации из одного вида деятельности в другой.

Так что поведение, которое вы описываете, является ожидаемым или предсказуемым.

Вернуться к вашим вопросам.

1.Как полностью уничтожить PreviousActivity при перезапуске активности?

  • Использование воссоздание API, ограничение - работает только с API 11 или выше

2. Есть ли способ поставить Extras во время использования refreshate ()?

воссоздавать

public void recreate ()

Заставить эту активность воссоздать новый экземпляр. Это результаты по существу в том же потоке, что и при создании деятельности из-за изменение конфигурации - текущий экземпляр пройдет через жизненный цикл для onDestroy () и новый экземпляр, созданный после него.

Поскольку действие будет воссоздано, будут также вызваны onSaveInstanceState и onRestoreInstanceState . Как вы можете догадаться, идея заключается в том, чтобы сохранить данные в onSaveInstanceState и извлечь в onRestoreInstanceState или onCreate.

Шаг 1: Сохранить данные в onSaveInstanceState

// The key for saving and retrieving isActivityRecreated field.
private static final String KEY_IS_ACTIVITY_RECREATED = "KEY_IS_ACTIVITY_RECREATED";

/** true if this activity is recreated. */
private boolean isActivityRecreated = false;

// Call this method when you want to recreate this activity.
private void recreateActivity() {
    isActivityRecreated = true;
    recreate();
}

@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    outState.putBoolean(KEY_IS_ACTIVITY_RECREATED, isActivityRecreated);
    outState.putInt(Constants.VIDEO_ID, videoId);
    outState.putInt(Constants.CATEGORY_ID, categoryId);
}

Шаг 2: Получить данные в onRestoreInstanceState или onCreate

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if (savedInstanceState != null) {
        isActivityRecreated = savedInstanceState.getBoolean(KEY_IS_ACTIVITY_RECREATED);
        if (isActivityRecreated) {
            // This activity has been recreated.
            // Reset the flag
            isActivityRecreated = false;

            // Write your code when this activity recreated.
            int videoId = savedInstanceState.getInt(Constants.VIDEO_ID);
            int categoryId = savedInstanceState.getInt(Constants.CATEGORY_ID);
            ...   
        }
    }
}
0 голосов
/ 29 октября 2018

Вы можете сделать это, просто установив флаг noHistory как true в AndroidManifest.xml файле. Я думаю, что вам не нужно сохранять это состояние активности при минимизации в соответствии с вашими требованиями.

<activity
            android:name=".PlayerActivity"
            android:noHistory="true" />
...