2011-08-12 76 views
0

我有一個小問題來檢測應用程序何時完成。我需要在Destroy上執行一些操作,例如將參數保存到數據庫中,並與服務器建立最終連接。onDestroy使數據持久化並與服務器同步

問題是,如果我把代碼放在onDestroy中,當方向改變時調用它。把

android:configChanges="orientation|keyboardHidden" 

在該活動的清單景觀/肖像佈局不交換。並加入

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 
    setContentView(R.layout.main); 
} 

更改佈局,但按鈕和標籤沒有得到onClickListeners和文本正確的標籤。我該如何解決這個問題?謝謝

+0

您可以在onDestroy()中使用isFinishing()來檢查活動是否完成。 – Ronnie

回答

2

問題是您的佈局項目不會再次初始化,因爲您在onCreate()函數中初始化它們,然後用中的新佈局來破壞它們。

一種選擇是將初始化移動到從onCreate()和中調用的新函數。

另一種選擇是在佈局中使用android:onclick=""(及相關)屬性。

我會選擇的選項雖然不同。我會允許Android管理方向(並調用onDestroy()),並在onDestroy()我會安裝一個鬧鐘,比如說10秒(我想有足夠的時間讓onCreate()再次調用)。在onCreate()我會取消報警。當警報發生時,我會執行保存操作。

+0

感謝您的答覆。該警報似乎是讓Android管理其餘部分的最佳選擇。我應該如何實現它?也許用Handler和delayedpost/removecallbacks? – Addev

+0

當您安裝http://www.androidcompetencycenter.com/2009/02/android-basics-alarm-service/時,您會指定一個Intent(實際上是PendingIntent),以便在警報過期時接收到廣播,所以決定已經非常適合你了。您可能需要安排您保存的數據超過您的活動,以防活動在警報過期前被銷燬 - 您可以通過將其附加到您的應用程序來實現此目的(請參閱http:// trace。 adityalesmana.com/2010/08/declare-global-variable-in-android-via-android-app-application/)。 – mah

1

聲明按鈕和標籤爲類變量。

+0

因爲他再次調用setContentView(),所以這不起作用;類變量將是陳舊的,因爲它們會指向不再存在的佈局項目。 – mah

1

setContentView重新創建您的視圖,因此您必須重新綁定您的數據。最好的方法是從onCreate()和onConfigurationChanged()中調用一個函數,並使用佈局創建和綁定。

1

如果您不希望在發生方向更改時發生任何事情,則不應該重新編寫setContentView()。基本上你在告訴你的應用程序:「什麼時候改變方向都不行」。因此,請刪除中的setContentView或測試當前哪個方向處於活動狀態,然後加載所需的佈局資源。

定位更改onDestroy()被調用時,因爲更改會重新啓動整個活動。

在這裏閱讀更多: http://developer.android.com/guide/practices/screens_support.html#qualifiers http://developer.android.com/guide/topics/resources/providing-resources.html

定位測試: Setting the background of an Activity

1

你能做到在活動中被覆蓋的finish()的東西?

+0

finish()不是回調函數,它可以主動調用以通知活動已完成的方法 - 但它不是活動消失的唯一方法。 – mah