Нормально ли для метода activity.onCreate() вызывать несколько раз

У меня есть код в методе onCreate Activity и заметил, что он вызывается три раза. Это нормальное поведение? Спасибо.

Ответы

Ответ 1

Возможно, вам захочется прочитать документацию по жизненному циклу активности.

OnCreate будет вызываться только один раз для каждого жизненного цикла Activity. Однако существует ряд ситуаций, которые могут привести к тому, что ваша деятельность будет убита и возвращена к жизни. Таким образом, onCreate будет вызываться снова.

Чтобы поддерживать это правильно, вы можете сохранять информацию о состоянии в onSaveInstanceState и восстанавливать ее из пакета состояний, в который вы входите, для создания.

Ответ 2

Кроме ожидаемых случаев, я заметил, что только те действия (onCreate) вызываются дважды, которые создают новый Thread или Runnable. (Я считаю, что это ошибка в Android).

Решение прост (хотя вам может и не понравиться: p)

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

        if(savedInstanceState == null){
            // everything else that doesn't update UI
        }
    }

Ответ 3

Вы также можете самостоятельно обрабатывать изменения конфигурации, задав в AndroidManifest следующую инструкцию в конфигурации активности:

android:configChanges="orientation|keyboardHidden"

Для получения дополнительной информации вы можете посмотреть официальную документацию

Ответ 4

Ниже приведен сценарий, с которым я столкнулся (и решил), который создает поведение, которое вы описываете:

Есть 3 события, которые вызывают OnTouch - 1. android.view.MotionEvent.ACTION_UP 2. android.view.MotionEvent.ACTION_DOWN 3. android.view.MotionEvent.ACTION_MOVE.

Часто все три из этих событий срабатывают одновременно, чтобы вызвать прослушиватель OnTouch. Когда этот прослушиватель используется для запуска активности (через Intent, переданный в startActivity()), вы можете воспроизвести это поведение, которое вызовет OnCreate в Activity несколько раз (3 в этом примере).

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