Жизненный цикл активности - onCreate вызывается при каждой переориентации - PullRequest
52 голосов
/ 01 октября 2011

У меня есть простое действие, которое загружает растровое изображение в onCreate.Я обнаружил, что, если я поверну устройство, я смогу увидеть из журналов, что onCreate снова вызвал.Фактически, поскольку все переменные экземпляра снова установлены в значения по умолчанию, я знаю, что вся активность была восстановлена ​​заново.

После двухкратного поворота я получаю FC, поскольку для растрового изображения может быть выделено недостаточно памяти.(Все ли экземпляры активности еще где-то живы? Или GC недостаточно быстро очищается?)

@Override
public void onCreate(Bundle savedInstanceState) {
    File externalStorageDir = Environment.getExternalStorageDirectory();
    File picturesDir = new File(externalStorageDir, "DCIM/Camera");
    File[] files = picturesDir.listFiles(new FilenameFilter(){
        public boolean accept(File dir, String name) {
            return name.toLowerCase().endsWith(".jpg");
        }});
    if (files.length > 0) {
        Bitmap bm = BitmapFactory.decodeStream(new FileInputStream(files[0]));
        ImageView view = (ImageView) findViewById(R.id.photo);
        view.setImageBitmap(bm);
    }
}

Из всего, что я прочитал, onCreate должен вызываться один раз за время существования приложения.Я ошибаюсь по этому поводу?Как переориентация устройства может привести к воссозданию активности?

Ответы [ 12 ]

76 голосов
/ 20 сентября 2012
android:configChanges="keyboardHidden|orientation|screenSize"

Внимание: Начиная с Android 3.2 (уровень API 13), «размер экрана» также меняется, когда устройство переключается между книжной и альбомной ориентацией.Таким образом, если вы хотите предотвратить перезапуск среды выполнения из-за изменения ориентации при разработке для API уровня 13 или выше (как заявлено атрибутами minSdkVersion и targetSdkVersion), вы должны включить значение «screenSize» в дополнение к значению «direction».То есть вы должны декаляр android:configChanges="orientation|screenSize".Однако, если ваше приложение предназначено для уровня API 12 или ниже, то ваша активность всегда сама обрабатывает это изменение конфигурации (это изменение конфигурации не перезапускает вашу активность, даже при работе на устройстве Android 3.2 или выше).

http://developer.android.com/guide/topics/resources/runtime-changes.html

46 голосов
/ 01 октября 2011

Активность воссоздается после каждого поворота по умолчанию.Вы можете переопределить это поведение с помощью атрибута configChanges тега activity в AndroidManifest.Для получения дополнительной информации и различных опций см. http://developer.android.com/guide/topics/resources/runtime-changes.html

45 голосов
/ 04 марта 2015

Что произойдет, когда ориентация изменилась

Жизненный цикл ориентации

onPause();
onSaveInstanceState();
onStop();
onDestroy();

onCreate();
onStart();
onResume();

---- приложение создано заново и теперь работает ---

Если вы долгооперации в onCreate() и для предотвращения повторного создания своей активности добавьте атрибут configChanges в свой мэйнфест

<activity android:name=".MyActivity"
          android:configChanges="orientation|keyboardHidden|screenSize"
          android:label="@string/app_name">

screenSize , если вы нацеливаетесь на api> = 13

15 голосов
/ 13 июня 2017

Жизненный цикл Actvity при повороте экрана

onPause
onSaveInstanceState
onStop
onDestroy

onCreate
onStart
onRestoreInstanceState
onResume
10 голосов
/ 02 ноября 2011

Если вы хотите, чтобы FC не хватало памяти, вам необходимо освободить ресурсы в onStop() или onPause().это позволяет вам использовать свежую память в onCreate().

. Это альтернативное решение для предотвращения воссоздания упражнения с использованием

android:configChanges="keyboardHidden|orientation"

Как иногда вашмакет деятельности отличается в портретной и ландшафтной (макет, макет земли).предотвращение воссоздания при изменении ориентации не позволит вашей активности использовать макет другой ориентации.

9 голосов
/ 07 мая 2013

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

//Define Below in you Manifest file.
           <activity
                  android:name="com.ecordia.activities.evidence.MediaAttachmentView"
                  android:configChanges="keyboardHidden|orientation|screenSize"
            </activity>

//Define Below in your activity. 

         @Override
            public void onConfigurationChanged(Configuration newConfig) {

              super.onConfigurationChanged(newConfig);

              if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
                  //your code
              } else if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
            //your code

              }
            }

Это будет работать как шарм !!

8 голосов
/ 01 октября 2011

Да, onCreate() действия вызывается каждый раз, когда меняется orientation, но вы можете избежать re-creation из Activity, добавив configChanges attribute из Activity в файл AndroidManifest в теге действия.

android:configChanges="keyboardHidden|orientation"
4 голосов
/ 31 августа 2016

Одним из наиболее распространенных и предлагаемых «решений» для изменения ориентации является не иметь с ними дело.Вы можете сделать это, установив флаг android: configChanges для своей активности в AndroidManifest.xml, как показано ниже:

<activity
    android:name=".MyActivity"
    android:label="@string/title_my_activity"
    android:configChanges="orientation|screenSize|keyboardHidden" />

Это НЕ правильный способ справиться с изменениями ориентации.

ИСПРАВИТЬОдним из способов является реализация метода onSaveInstanceState (это может быть в вашем Activity, Fragment или обоих) и размещение значений, которые необходимо сохранить, в аргументе Bundle, который передается методу.

Это хорошо описано здесь:http://code.hootsuite.com/orientation-changes-on-android/

Хотя это может показаться утомительным для реализации, правильная обработка изменений ориентации дает вам ряд преимуществ: вы сможете легко использовать альтернативные макеты в портретной и альбомной ориентациях, а также сможетеобрабатывать многие исключительные состояния, такие как ситуации с нехваткой памяти и прерывания от входящих телефонных звонков без дополнительного кода.

4 голосов
/ 01 октября 2011

Использование

android:configChanges="keyboardHidden|orientation" in Manifest XML activity Tag

@Override
public void onConfigurationChanged(Configuration newConfig) {
    // TODO Auto-generated method stub
    super.onConfigurationChanged(newConfig);
}

Используйте приведенный выше код для выполнения изменений, связанных с ориентацией в вашем коде Java Activity

Cheers !!!

2 голосов
/ 03 августа 2017

Пожалуйста, посмотрите мой способ сделать это: -

http://animeshrivastava.blogspot.in/2017/08/activity-lifecycle-oncreate-beating_3.html

Фрагмент

: -

@Override
    protected void onSaveInstanceState(Bundle b)
    {
            super.onSaveInstanceState(b);
        String str="Screen Change="+String.valueOf(screenChange)+"....";
            Toast.makeText(ctx,str+"You are changing orientation...",Toast.LENGTH_SHORT).show();
        screenChange=true;

    }

    @Override
    public void onCreate(Bundle b)
        {
        super.onCreate(b);
        ctx=getApplicationContext();
        if(!screenChange)
        {
             String str="Screen Change="+String.valueOf(screenChange);
...