2011-07-21 7 views
24

Mon application est tuée à chaque fois qu'elle revient à l'état hors écran. Je récupère toutes les informations que mon application fait, mais je ne peux pas savoir pourquoi elle appelle onDestroy. C'est la première fois que je vois ce comportement dans mes applications.OnDestroy est appelé à chaque fois que l'écran se rallume

Mon activité principale étend tabActivity car elle contient un tabhost. J'ai lu que ça doit l'étendre ou ça va FC. Je ne suis pas sûr si mon problème est lié à cela ?! Oh et il implémente Observer mais cela ne devrait pas poser de problème.

Voici les journaux:

07-21 09:57:53.247: VERBOSE/###(13180): onResume 
07-21 09:57:53.267: VERBOSE/###(13180): onPause 
07-21 09:57:59.967: VERBOSE/###(13180): onResume 
07-21 09:58:00.597: VERBOSE/###(13180): onPause 
07-21 09:58:00.597: VERBOSE/###(13180): onDestroy 
07-21 09:58:00.637: VERBOSE/###(13180): onCreate 

Ce qui est fou est qu'il appelle le OnDestroy la plupart du temps après que l'écran se rallume, et parfois il a assez de temps pour le faire avant que l'écran éteint. Mais après que ça recommence, ça fait encore pareil ...

J'espère que quelqu'un a un conseil pour moi ou des informations sur la façon de résoudre ce problème.

Je ne suis pas sûr si cela est important, mais j'utiliser le sdk 2.1 Update1 android pour mon application.


EDIT:

L'application est testé sur un vrai appareil Android.

Voici un code de base avec toutes les lignes inutiles et informations supprimées:

package; 
imports; 

public class WebLabActivity extends TabActivity implements Observer{ 

#declerations 

/** Called when the activity is first created. */ 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    Log.v("###", "onCreate"); 
    setContentView(R.layout.main); 
    # initialize some basic things 
} 

@Override 
public void onResume() { 
    super.onResume(); 
    Log.v("###", "onResume"); 
} 

@Override 
public void onDestroy() { 
    super.onDestroy(); 
    Log.v("###", "onDestroy"); 
} 

@Override 
public void onRestart() { 
    Log.v("###", "onRestart"); 
    super.onRestart(); 
} 

@Override 
public void onPause() { 
    Log.v("###", "onPause"); 
    super.onPause(); 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    Log.v("###", "onConfigurationChanged"); 
    super.onConfigurationChanged(newConfig); 
} 

@Override 
public void update(Observable observable, Object data) { 
    Log.v("###", "notifyManager.getWho() + " made an Update"); 
} 


    private void initializeSidebarTabhost() { 
    TabSpec 1 = tabHost.newTabSpec("1"); 
     TabSpec 2 = tabHost.newTabSpec("2"); 
    TabSpec 3 = tabHost.newTabSpec("3"); 
    TabSpec 4 = tabHost.newTabSpec("4"); 


    1.setIndicator("###"); 
    2.setIndicator("###"); 
    3.setIndicator("###"); 
    4.setIndicator("###"); 

    addIntents 

    tabHost.addTab(1); //0 
    tabHost.addTab(2); //1 
    tabHost.addTab(3); //2 
    tabHost.addTab(4); //3 

    tabHost.getTabWidget().setCurrentTab(2); 
} 
} 

EDIT2:

Ok, je l'ai testé ma demande sans rien initialiser, puis avec seulement étendre l'activité, ou sans mettre en œuvre l'observateur, mais mes changements n'ont eu aucun effet. Chaque fois que je mets mon téléphone en veille, puis je le réveille, onDestroy() s'appelle ?!


EDIT3:

Ok, j'ai trouvé quelque chose d'intéressant.

premier est ici mon AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
     package="com.tundem.###" 
     android:versionCode="1" 
     android:versionName="1.0"> 
    <uses-sdk android:minSdkVersion="7" /> 

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
    <uses-permission android:name="android.permission.INTERNET" /> 
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" /> 

    <application android:icon="@drawable/icon" android:label="@string/app_name"> 
     <activity android:name=".###" android:label="@string/app_name" android:screenOrientation="landscape" android:theme="@android:style/Theme.Light.NoTitleBar"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 
       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 
</manifest> 

Dès que je retire le screenOrientation="landscape", l'application ne sera pas détruit chaque fois que je me réveille mon appareil. Je l'ai essayé plus de 10 fois, mais plus d'appels à onDestroy()

Donc je pense que je vais devoir mettre cela en code ?! Des conseils ou des morceaux de code?

+0

Cela semble un peu étrange, est-ce dans l'émulateur, et pouvez-vous poster un framework de code skelton qui présente le comportement? – Idistic

+0

Sur l'émulateur, je ne l'ai pas encore essayé. Je reçois ce comportement sur mon vrai téléphone Android donc pas d'émulateur. Qu'est-ce que vous voulez dire avec qui montre le comportement. Je vais poster du code dans les prochaines minutes. – mikepenz

+0

Je veux dire un code qui reproduit fidèlement le problème, parfois les gens mettent en place des extraits qui omettent le vrai problème – Idistic

Répondre

38

Si vous voulez arrêter le détruire/créer problème qui est la valeur par défaut dans Android en raison d'un changement d'orientation et de verrouillage dans une orientation alors vous devez ajouter du code et xml

Dans votre code activités (notes à propos du xml)

// When an android device changes orientation usually the activity is destroyed and recreated with a new 
    // orientation layout. This method, along with a setting in the the manifest for this activity 
    // tells the OS to let us handle it instead. 
    // 
    // This increases performance and gives us greater control over activity creation and destruction for simple 
    // activities. 
    // 
    // Must place this into the AndroidManifest.xml file for this activity in order for this to work properly 
    // android:configChanges="keyboardHidden|orientation" 
    // optionally 
    // android:screenOrientation="landscape" 
    @Override 
    public void onConfigurationChanged(Configuration newConfig) 
    { 
     super.onConfigurationChanged(newConfig); 
    } 
+0

J'ai trouvé cette solution par moi-même il y a quelques minutes. Parce que je dois moins de réputation, je n'ai pas pu le poster ici. mais je vous remercie beaucoup pour la réponse;) J'espère que c'est utile pour tous les autres – mikepenz

+0

@mikepenz - la discussion heureuse vous a conduit à votre propre solution, acclame – Idistic

+0

Oui c'est génial si vous trouvez la réponse seul;). Et c'est génial d'obtenir de l'aide des autres. Alors merci encore pour votre aide. Je suis sûr que j'aurais besoin d'heures pour trouver la même solution. ;). Mais vous aviez raison, parfois ou souvent les gens oublient les points principaux qui posent problème alors dans leur question principale. Merci encore;) – mikepenz

7

J'ai eu le même problème. De ActivityA j'ai appelé ActivityB. Quand j'ai fermé ActivityB, je m'attendais à ce que ActivityA soit montré mais ce n'était pas le cas - il a été détruit. Ces problèmes ont été causés par les attributs suivants de ActivityA dans AndroidManifest.xml:

android:excludeFromRecents="true" 
android:noHistory="true" 

En raison de leur ActivityA a été détruite après ActivityB a commencé.

+0

Problème différent. Mais utile. – ToolmakerSteve

3

mikepenz, dans votre cas si vous avez vraiment besoin d'un android: setorientation = "paysage" signifie, vous n'avez pas besoin de l'enlever, il suffit d'ajouter ces attributs android: configchanges = "orientation | Screensize" cela ne détruira pas votre activité ... J'espère que cela vous aide.

+3

FYI il ne fonctionnera pas de cette façon, besoin: (noter les minuscules s, puis majuscule S dans screensize) android: configChanges = "keyboardHidden | orientation | screenSize" – Kevin

+1

est donc le changement d'orientation réelle qui le cause ? Je vois cela arriver parfois (j'ai screenOrientation = "portrait") mais c'est aléatoire, ça n'arrive pas tout le temps, et ça n'arrive pas si je change juste l'orientation de l'appareil. Comment puis-je savoir quel changement de configuration provoque cela? – Michael

Questions connexes