vida una tipos studio metodo developer cual crear como ciclo aplicacion activity actividad android activity-lifecycle

android - una - Ciclo de vida de la actividad: onCreate requería cada reorientación



onresume android (12)

Tengo una actividad simple que carga un mapa de bits en onCreate . Me parece que si giro el dispositivo, puedo ver desde los registros que onCreate llamó nuevamente. De hecho, debido a que todas las variables de instancia están configuradas en valores predeterminados, sé que toda la actividad se ha vuelto a crear.

Después de girar 2 veces, obtengo una FC porque no se puede asignar suficiente memoria para el mapa de bits. (¿Todas las instancias de la actividad siguen vivas en alguna parte? ¿O la GC no se limpia lo suficientemente rápido?)

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

De todo lo que leí, onCreate debería llamarse una vez durante la vigencia de una aplicación. ¿Estoy equivocado sobre esto? ¿Cómo puede la reorientación del dispositivo causar la recreación de la actividad?


Actvity Lifecycle cuando gira la pantalla

onPause onSaveInstanceState onStop onDestroy onCreate onStart onRestoreInstanceState onResume


Amablemente vea mi forma de hacerlo: -

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

fragmento es: -

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


El método Crear llamará cada vez que haga orientación, para evitar esto debe usar

//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 } }

¡Funcionará como un encanto!



Qué pasó cuando la orientación cambió

Ciclo de vida de orientación

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

---- aplicación recreada y ahora se está ejecutando ---

Si realiza una operación larga en onCreate() y quiere evitar que vuelva a crear su actividad agregue el atributo configChanges en su mainfest

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

screenSize si segmenta api> = 13


Sí, se onCreate() la actividad onCreate() cada vez que cambia la orientation , pero puede evitar la re-creation de la Activity agregando el configChanges attribute de Activity en su archivo AndroidManifest en la etiqueta de actividad.

android:configChanges="keyboardHidden|orientation"


Si desea evitar que FC no tenga suficiente memoria, debe desasignar recursos en onStop() o onPause() . esto le permite usar memoria nueva en onCreate() .

Esta es una solución alternativa para prevenir la recreación de la actividad mediante el uso de

android:configChanges="keyboardHidden|orientation"

Como a veces el diseño de su actividad es diferente en retrato y paisaje (diseño, disposición del terreno). prevenir la recreación en el cambio de orientación evitará que su actividad use el diseño de la otra orientación.


Tuve el mismo problema e hice algunas soluciones

Definir la variable booleana didLoad con valor falso

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


Tuve el mismo problema, en el que se llama a mi onCreate varias veces cuando se cambia la orientación de la pantalla. Mi problema se resolvió cuando android:configChanges="orientation|keyboardHidden|screenSize" en la etiqueta de activity en manifest


Una de las "soluciones" más comunes y sugeridas para lidiar con los cambios de orientación es no tratar con ellos. Puede hacer esto configurando el indicador android: configChanges en su Actividad en AndroidManifest.xml como se muestra a continuación:

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

Esta NO es la forma correcta de lidiar con los cambios de orientación.

La forma CORRECTA es implementar el método onSaveInstanceState (esto podría estar en su Actividad, Fragmento o ambos) y colocar los valores que necesita guardar en el argumento Bundle que pasa al método.

Está muy bien descrito aquí: http://code.hootsuite.com/orientation-changes-on-android/

Si bien puede parecer un poco tedioso de implementar, manejar los cambios de orientación correctamente le proporciona varios beneficios: podrá usar diseños alternativos fácilmente en orientaciones vertical y horizontal, y podrá manejar muchos estados excepcionales, como situaciones de poca memoria. y las interrupciones de las llamadas telefónicas entrantes sin ningún código adicional.


Utilizar

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

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

Utilice el código anterior para realizar cambios relacionados con la orientación en su Código Java de Actividad

¡¡¡Aclamaciones!!!


android:configChanges="keyboardHidden|orientation|screenSize"

Precaución: a partir de Android 3.2 (nivel de API 13), el "tamaño de pantalla" también cambia cuando el dispositivo cambia entre la orientación vertical y horizontal. Por lo tanto, si desea evitar que se reinicie el tiempo de ejecución debido al cambio de orientación cuando se desarrolla para API nivel 13 o superior (según lo declarado por los atributos minSdkVersion y targetSdkVersion), debe incluir el valor "screenSize" además del valor de "orientación". Es decir, debe descartar android:configChanges="orientation|screenSize" . Sin embargo, si su aplicación se dirige al nivel API 12 o inferior, su actividad siempre maneja esta configuración por sí misma (este cambio de configuración no reinicia su actividad, incluso cuando se ejecuta en un dispositivo con Android 3.2 o superior).

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