OnCreate (...) вызывается дважды после поворота устройства
У меня вопрос о том, как повернуть Android-устройство. Мой код регистрирует статический и нестатический атрибут в onCreate (...).
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
static int sn;
int n;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
sn++;
n++;
Log.i("onCreate", String.format("sn=%d n=%d", sn, n));
}
}
Ориентация экрана - портрет. Когда я впервые запустил код, я получил:
onCreate(): sn=1 n=1
После поворота экрана в альбом, я получил:
onCreate(): sn=2 n=1
После того, как я снова повернул экран на портрет, я получил:
onCreate(): sn=3 n=1
onCreate(): sn=4 n=1
Мои вопросы:
- Как я могу предотвратить onCreate (...) для вызова дважды, когда устройство повернуто назад к портрету?
- Как сохранить значение нестатической переменной при вращении устройства?
Ответы
Ответ 1
Всякий раз, когда меняется ориентация экрана, эта активность уничтожается, а новый актив начинается с метода onCreate()
.
поэтому каждый раз, когда вы поворачиваете экран, действие будет уничтожено, а новое действие начинается с метода onCreate()
.
Вы можете сохранить элемент Non Static, переопределив метод onSaveInstanceState(Bundle b)
.
Android вызывает этот метод всякий раз, когда экран поворачивается, и данный пакет b будет передан в oncreate(Bundle b)
, из которого вы можете извлечь член non static
.
Ответ 2
Это известная проблема в эмуляторе (см. обсуждение здесь). Это не ошибка, но это проблема для многих людей, возвращающихся назад. Насколько я понимаю, основная проблема заключается в том, что ваша активность перезапускается дважды, когда она переходит в портретный режим, потому что эмулятор обрабатывает два изменения конфигурации отдельно: сама ориентация меняется и деактивация клавиатуры. Это не происходит в другом направлении, потому что нет события изменения конфигурации, соответствующего активации клавиатуры. (Я нахожу это странным, но, по-видимому, это желаемое поведение по какой-то причине.)
В любом случае решение похоже на это, чтобы добавить это в декларацию манифеста активности:
android:configChanges="keyboardHidden|orientation"
Если вам действительно нужны эти изменения для загрузки новых ресурсов, вы можете вручную обработать его в onConfigurationChanged.
Ответ 3
Не знаю о проблеме onCreate
; эти вызовы поступают из ОС.
Нестатические ( "экземпляры" ) переменных должны сохраняться в instanceState
; что это для. См. сообщения, подобные этому, которые суммируют его или большинство базовых руководств для Android, которые обсуждают жизненный цикл приложения.
Ответ 4
Это очень просто: вы можете переопределить метод onConfigurationChanged() в своем коде.
public void onConfigurationChanged(Configuration newConfig)
{
super.onConfigurationChanged(newConfig);
}
Итак, теперь ваша нестационарная переменная не будет затронута, потому что в это время ваша активность не уничтожается, а не новый вид начинается с метода onCreate().
Ответ 5
Каждый раз, когда вы поворачиваете экран, активность будет воссоздана. Это концепция андроида.
Но в вашем случае, когда активность воссоздается, статическое значение будет сохранено.. while non static
будет повторно инициализировано... Итак, вы получаете n=1
всегда...
Если вы действительно хотите сохранить это не статическое значение, перейдите Общие настройки. В этом вы можете сохранить все значения, которые вам нужны, пока пользователь не очистит данные....
else просто сделайте non static
до static
, который решит вашу вероятность, я думаю,
Ответ 6
Поместите эту строку в свою активность в файл AndroidManifest.xml:
android:launchMode="singleInstance"
От Документация
"singleTask
" и "singleInstance
" действия могут только начать задание. Они всегда находятся в корне стека активности. Кроме того, устройство может удерживать только один экземпляр активности за раз - только один такая задача.
С другой стороны, деятельность "singleInstance
" не позволяет никаким другим деятельность должна быть частью его задачи. Это единственное занятие в задаче. Если он запускает другое действие, эта деятельность назначается другая задача - как будто FLAG_ACTIVITY_NEW_TASK
был в намерении.