J'ai une activité simple qui charge une bitmap dans onCreate
. Je constate que si je tourne l'appareil, je peux voir dans les journaux que onCreate
a appelé à nouveau. En fait, parce que toutes les variables d'instance sont de nouveau définies sur des valeurs par défaut, je sais que l'activité entière a été ré-instanciée.
Après 2 rotations, j'obtiens un FC car il n'y a pas assez de mémoire allouée pour le bitmap. (Toutes les instances de l'activité sont-elles toujours en vie quelque part? Ou le GC ne se nettoie-t-il pas assez rapidement?)
@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);
}
}
D'après tout ce que j'ai lu, onCreate devrait être appelé une fois pendant la durée de vie d'une application. Suis-je dans l'erreur? Comment la réorientation de l'appareil peut-elle entraîner la recréation de l'activité?
L'activité est recréée après chaque rotation par défaut. Vous pouvez remplacer ce comportement avec l'attribut configChanges
de la balise activity
dans AndroidManifest. Pour plus de détails et différentes options, voir http://developer.Android.com/guide/topics/resources/runtime-changes.html
Android:configChanges="keyboardHidden|orientation|screenSize"
Attention: À partir de Android 3.2 (API niveau 13), la "taille d'écran" change également lorsque l'appareil passe entre l'orientation portrait et paysage. Ainsi, si vous souhaitez empêcher les redémarrages du runtime en raison d'un changement d'orientation lors du développement pour l'API de niveau 13 ou supérieur (comme déclaré par les attributs minSdkVersion et targetSdkVersion), vous devez inclure la valeur "screenSize" en plus de la valeur "d'orientation", c'est-à-dire que vous devez détartrer
Android:configChanges="orientation|screenSize"
. Cependant, si votre application cible l'API de niveau 12 ou inférieur, votre activité gère toujours cette modification de configuration elle-même (cette modification de configuration ne redémarre pas votre activité, même lorsqu'elle s'exécute sur un appareil Android 3.2 ou supérieur) ).
http://developer.Android.com/guide/topics/resources/runtime-changes.html
Que se passe-t-il lorsque l'orientation change
Cycle de vie de l'orientation
onPause();
onSaveInstanceState();
onStop();
onDestroy();
onCreate();
onStart();
onResume();
---- application recréée et en cours d'exécution ---
Si vous effectuez une opération longue dans onCreate()
et que vous voulez empêcher de recréer votre activité, ajoutez l'attribut configChanges
dans votre mainfest
<activity Android:name=".MyActivity"
Android:configChanges="orientation|keyboardHidden|screenSize"
Android:label="@string/app_name">
screenSize si vous ciblez l'api> = 13
Cycle de vie des activités lorsque vous faites pivoter l'écran
onPause
onSaveInstanceState
onStop
onDestroy
onCreate
onStart
onRestoreInstanceState
onResume
Si vous voulez empêcher FC de ne pas avoir suffisamment de mémoire, vous devez désallouer les ressources dans onStop()
ou onPause()
. cela vous permet d'utiliser de la mémoire fraîche dans onCreate()
.
Il s'agit d'une solution alternative pour empêcher la recréation de l'activité en utilisant
Android:configChanges="keyboardHidden|orientation"
Comme parfois la mise en page de votre activité est différente en portrait et en paysage (mise en page, mise en page-terrain). empêcher la recréation lors d'un changement d'orientation empêchera votre activité d'utiliser la disposition de l'autre orientation.
La méthode On Create appellera à chaque fois que vous effectuez l'orientation, pour éviter cela, vous devez utiliser
//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
}
}
Cela fonctionnera comme un charme !!
Oui, la onCreate()
de l'activité est appelée à chaque fois que le orientation
change mais vous pouvez éviter le re-creation
de Activity
en ajoutant configChanges attribute
de Activity
dans votre fichier AndroidManifest
dans la balise d'activité.
Android:configChanges="keyboardHidden|orientation"
L'une des "solutions" les plus courantes et suggérées pour faire face aux changements d'orientation est de ne pas y faire face. Vous pouvez le faire en définissant l'indicateur Android: configChanges sur votre activité dans AndroidManifest.xml comme indiqué ci-dessous:
<activity
Android:name=".MyActivity"
Android:label="@string/title_my_activity"
Android:configChanges="orientation|screenSize|keyboardHidden" />
Ce n'est PAS la bonne façon de gérer les changements d'orientation.
La manière correcte consiste à implémenter la méthode onSaveInstanceState (cela pourrait être dans votre activité, fragment ou les deux) et placer les valeurs que vous devez enregistrer dans l'argument Bundle qui est transmis à la méthode.
Il est bien décrit ici: http://code.hootsuite.com/orientation-changes-on-Android/
Bien que cela puisse sembler un peu fastidieux à mettre en œuvre, la gestion correcte des changements d'orientation vous offre plusieurs avantages: vous pourrez facilement utiliser d'autres dispositions dans les orientations portrait et paysage, et vous pourrez gérer de nombreux états exceptionnels tels que les situations de mémoire insuffisante et les interruptions des appels téléphoniques entrants sans code supplémentaire.
Utilisation
Android:configChanges="keyboardHidden|orientation" in Manifest XML activity Tag
@Override
public void onConfigurationChanged(Configuration newConfig) {
// TODO Auto-generated method stub
super.onConfigurationChanged(newConfig);
}
Utilisez le code ci-dessus pour effectuer des changements liés à l'orientation dans votre activité Java Code
À votre santé!!!
Veuillez voir ma façon de le faire: -
http://animeshrivastava.blogspot.in/2017/08/activity-lifecycle-oncreate-beating_3.html
l'extrait est: -
@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);