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!
La actividad se recrea después de cada rotación por defecto. Puede anular este comportamiento con el atributo configChanges
de la etiqueta de activity
en AndroidManifest. Para obtener más detalles y diferentes opciones, consulte http://developer.android.com/guide/topics/resources/runtime-changes.html
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