onDestroy est appelée chaque fois que l'écran va sur

Mon application se fait tuer à chaque fois qu'il revient à l'écran-état d'arrêt. J'ai récupérer toutes les informations que mon application, mais je ne peux pas savoir pourquoi il appelle onDestroy. C'est la première fois que je vois ce problème dans mes applications.

Mon activité principale s'étend tabActivity, car il contient une tabhost. J'ai lu que c'est de prolonger ou de FC. Je ne sais pas si mon problème est lié à cela?! Oh, et il met en œuvre Observateur, mais cela ne devrait poser aucun problème.

Voici les logs:

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

Le truc de fou c'est qu'il appelle le onDestroy la plupart du temps, après que l'écran s'allume à nouveau, et parfois il a assez de temps pour le faire avant que l'écran s'éteint. Mais après il va encore, il n'a plus la même...

J'espère que quelqu'un a une astuce pour moi ou pour toute information sur la façon de résoudre ce problème.

Je ne sais pas si c'est important, mais je utiliser android 2.1-update1 sdk pour mon application.


EDIT:

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

Voici le code de base avec toutes les lignes inutiles et de suppression des informations:

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, j'ai testé de mon application sans l'initialisation de quoi que ce soit, avec seulement l'extension de l'activité, ou sans la mise en œuvre de l'observateur, mais mes modifications n'a eu aucun effet. À chaque fois, j'ai mis mon téléphone en veille, puis à son réveil, onDestroy() obtenir ce qu'on appelle?!


EDIT3:

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

D'abord voici 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 j'ai supprimer le screenOrientation="landscape", l'application ne sera pas détruit à chaque fois que je me réveille de mon appareil. Je l'ai essayé plus de 10 fois mais pas plus d'appels à onDestroy()

Donc je pense que je vais avoir à définir dans le code?! Des conseils ou des morceaux de code?

  • Qui sonne un peu bizarre, est-ce dans l'émulateur, et vous pouvez poster un skelton code-cadre qui présente le problème?
  • Sur l'émulateur je havn'pas encore essayé. Je reçois ce problème sur mon téléphone Android, donc pas d'émulateur. Que voulez-vous dire avec qui présente le comportement. Je vais poster un peu de code dans les prochaines minutes.
  • Je veux dire un code qui, de façon vérifiable, reproduit le problème, parfois les gens mettent des extraits que de laisser le réel problème
  • j'ai mis le code, je pense, est important, parce que si je donne sur les choses que j'ai laissé avec mon samplecode je suis sûr que ces choses ne cause pas le problème. Ou pensez-vous qu'il pourrait y avoir un problème avec addListeners. Ouvrir un fichier de mise à jour, l'appel à la méthode initizialSidebarTabhost, et d'appeler addObserver?! je pense que le problème est causé par l'extension de la TabActivity, mais connaissez-vous une autre astuce comment je peux utiliser un tabhost?!
  • c'est bizarre. mais de toute façon bon aussi - vous ne pouvez pas contrôler lors de l'os android de détruire ou de re-crée votre application, donc vous devriez faire de votre application à l'abri de ce comportement. vous ne savez jamais ce qui pourrait se produire sur une vraie appareil-avec-un-fabricant-custom-android-build 🙂
  • Je sais que je ne peux pas contrôler ce comportement. J'ai fait une variable appelée calledOnce, qui sera positionnée à true après l'appel de la onCreate une fois, mais l'activité est complètement remises à zéro à chaque fois. donc, il charge tout ce qui est nouveau, et c'est vraiment bizarre, parce que je vais faire quelques timeintensive opérations et si ils vont être effectuée à chaque fois que cela ne l'épuisement de la batterie et de rendre les utilisateurs en colère si ils doivent attendre de nouveau.

InformationsquelleAutor mikepenz | 2011-07-21