Нормально ли для метода 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 в этом примере).
Если это не тот тип прослушивателя, который вы используете для запуска активности, вы можете захотеть просмотреть документацию о том, что какой-либо прослушиватель запускает вашу активность, чтобы увидеть, есть ли у вас похожий сценарий. Скорее всего, не только одно событие вызывает слушателя.