web-dev-qa-db-fra.com

Cycle de vie des activités - onCreate appelé à chaque réorientation

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é?

54
Synesso

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

47
Ash
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

77
achellies

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

46
Mina Fawzy

Cycle de vie des activités lorsque vous faites pivoter l'écran

onPause
onSaveInstanceState
onStop
onDestroy

onCreate
onStart
onRestoreInstanceState
onResume
15
Phan Van Linh

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.

11
josephus

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 !!

9
SAHIL

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"
8
Lalit Poptani

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.

4
Andrius Darulis

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é!!!

4
Himanshu Virmani

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