2011-07-21 46 views
24

每次從屏幕關閉狀態返回時,我的應用程序都會被終止。我獲取我應用程序所做的所有信息,但是我找不到它爲什麼要調用onDestroy。這是我第一次在我的應用程序中看到這種行爲。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次數最多的屏幕再次熄滅後,有時它有足夠的時間來做到這一點,屏幕熄滅之前。但在它再次發生後,它再次做同樣的事情...

我希望有人對我有任何提示或有關如何解決此問題的任何信息。

我不確定這是否重要,但我使用android 2.1-update1 sdk作爲我的應用程序。


編輯:

應用程序獲取一個真正的Android設備進行測試。

下面是一些基本的代碼與所有不必要的行和信息刪除:

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:

好吧,我測試了我的申請沒有任何初始化,然後只擴展活動,或不實施觀察員,但我的更改沒有效果。每次我將手機設置爲睡眠狀態,然後將其喚醒,onDestroy() get的名稱?!


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()

所以我認爲我將不得不在設置代碼?!任何提示或代碼段?

+0

這聽起來很奇怪,這是在模擬器中,你可以發佈一個展示行爲的skelton代碼框架嗎? – Idistic

+0

在模擬器上,我還沒有嘗試過。我在我的真實Android手機上得到這種行爲,所以沒有模擬器。你的意思是什麼展示了這種行爲。 我會在接下來的幾分鐘內發佈一些代碼。 – mikepenz

+0

我的意思是一些代碼,可驗證的再現問題,有時人們提出片段,忽略了真正的問題 – Idistic

回答

38

如果要停止破壞/創建問題,這是因爲一個方向變化,鎖在一個方向的android系統中默認,那麼你需要添加代碼和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); 
    } 
+0

幾分鐘前我發現了這個解決方案。因爲我的名譽較低,我無法在這裏發佈。但非常感謝你的答案;)我希望它對所有其他人有用 – mikepenz

+0

@mikepenz - 高興的討論導致你自己的解決方案,歡呼聲 – Idistic

+0

是的,如果你單獨找到答案是很好的)。很高興能從別人那裏獲得幫助。所以再次感謝您的幫助。我相信我需要幾個小時才能找到相同的解決方案。 )。但是你是對的,人們有時或經常忘記導致問題的主要問題,然後是他們的主要問題。再次感謝;) – mikepenz

7

我有同樣的問題。從ActivityA我打電話給ActivityB。當我關閉ActivityB時,我希望顯示ActivityA,但它不是 - 它被破壞了。這個問題是造成在AndroidManifest.xml以下ActivityA的屬性:

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

因爲他們的ActivityB開始後ActivityA被摧毀。

+0

不同的問題。但有用。 – ToolmakerSteve

3

mikepenz,在你的情況下,如果你真的需要一個android:setorientation =「landscape」意味着,你不需要刪除它,只需添加這些屬性android:configchanges =「orientation | Screensize」這不會破壞你的活動...希望這可以幫助你。

+3

僅供參考,它不會這樣工作,需要:(注意小寫s,然後大寫S在屏幕大小) android:configChanges =「keyboardHidden | orientation | screenSize」 – Kevin

+1

所以它是實際的方向變化,導致它?我有時會發生這種情況(我有screenOrientation =「portrait」),但它是隨機的,並不是一直髮生,並且如果我只是改變設備的方向就不會發生。我怎麼知道哪個配置更改導致了這個問題? – Michael

相關問題