Подтвердить что ты не робот

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 (...) для вызова дважды, когда устройство повернуто назад к портрету?
  • Как сохранить значение нестатической переменной при вращении устройства?
4b9b3361

Ответ 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 был в намерении.