onDestroy每次进入屏幕时都会被调用

每次从屏幕closures状态返回时,我的应用程序都会被终止。 我获取我的应用程序所做的所有信息,但是我找不到为什么要调用onDestroy。 这是我第一次在我的应用程序中看到这种行为。

我的主要活动扩展tabActivity,因为它包含一个tabhost。 我读过它必须扩展它,否则将FC。 我不确定我的问题是否与此有关? 哦,它实现观察员,但这应该是没有问题的。

这里是日志:

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 

疯狂的事情是,在屏幕重新开始之后,它最多次调用onDestroy,有时在屏幕closures之前有足够的时间来做这件事。 但是在它再次发生之后,它又一次…

我希望有人向我提供一个小技巧或任何有关如何解决这个问题的信息。

我不确定这是否重要,但我使用android 2.1-update1 sdk作为我的应用程序。


编辑:

应用程序在真实的Android设备上进行testing。

这是一些基本的代码,删除了所有不必要的行和信息:

 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:

好吧,我testing了我的应用程序,没有初始化任何东西,然后只扩展活动,或者没有实现观察者,但是我的改变没有效果。 每次我把手机设置成睡觉,然后把它唤醒, onDestroy()被叫做?!


EDIT3:

好的,我发现了一些有趣的东西。

首先这是我的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> 

只要我删除screenOrientation="landscape" ,每当我唤醒我的设备时,应用程序不会被销毁。 我尝试了10次以上,但没有更多的电话onDestroy()

所以我认为我将不得不在代码中设置? 任何提示或代码段?

Solutions Collecting From Web of "onDestroy每次进入屏幕时都会被调用"

如果你想停止破坏/创build问题,这是在Android的默认方向更改和locking在一个方向,那么你需要添加代码和XML

在你的activites代码(有关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); } 

我有同样的问题。 从ActivityA我叫ActivityB。 当我closuresActivityB时,我期望ActivityA被显示,但不是 – 它被销毁了。 这个问题是由AndroidManifest.xml中的ActivityA的以下属性引起的:

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

因为ActivityB开始后ActivityA被破坏了。

mikepenz,在你的情况下,如果你真的需要一个android:setorientation =“景观”意味着,你不需要删除它,只需添加这些属性android:configchanges =“orientation | Screensize”这不会摧毁你的活动…希望这可以帮助你。