Жизненный цикл операции – onCreate, вызываемый при каждой переориентации

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

После поворота 2 раза я получаю 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 следует вызывать один раз в течение всего срока службы приложения. Я не прав? Как переориентировать устройство на восстановление активности?

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

 android:configChanges="keyboardHidden|orientation|screenSize" 

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

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

Что происходит при изменении ориентации

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

 onPause(); onSaveInstanceState(); onStop(); onDestroy(); onCreate(); onStart(); onResume(); 

—- app воссоздан и теперь запущен —

Если вы долго работаете в onCreate() и хотите предотвратить повторное создание своей активности, добавьте атрибут configChanges в свой mainfest

 <activity android:name=".MyActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:label="@string/app_name"> Размер <activity android:name=".MyActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:label="@string/app_name"> 

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

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

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

андроид: configChanges = "keyboardHidden | ориентация"

Так как иногда макет вашей работы отличается от портрета и пейзажа (макет, макет-земля). Предотвращение воссоздания при изменении ориентации не позволит вашей деятельности использовать макет другой ориентации.

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

 //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 } } Размер //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 } } 

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

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

 android:configChanges="keyboardHidden|orientation" 

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

Android: configChanges = "keyboardHidden | ориентация" в теге активности манифеста XML

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

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

Ура !!!

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

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

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

ПРАВИЛЬНЫЙ способ – реализовать метод onSaveInstanceState (это может быть в вашей деятельности, фрагменте или и том и другом) и поместить значения, необходимые для сохранения в аргументе Bundle, который передается методу.

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

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

Actvity Lifecycle при повороте экрана

 onPause onSaveInstanceState onStop onDestroy onCreate onStart onRestoreInstanceState onResume 

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

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); 

У меня была та же проблема, в которой мой onCreate вызывается несколько раз, когда меняется ориентация экрана. Моя проблема решена, когда я добавляю android:configChanges="orientation|keyboardHidden|screenSize" в теге activity в manifest

У меня была та же проблема, и я сделал некоторое обходное решение

Определить логическую переменную didLoad с ложным значением

Private boolean didLoad = false;

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity); if (!this.didLoad){ // Your code... this.didLoad = true; }