2013-10-24 99 views
3

因爲一個應用程序,我要建將處理比較敏感的數據我希望每一個用戶登錄的時間同步SQLite的數據庫與服務器,每一個應用程序失去焦點(因爲用戶移動到起始時間刪除emty分貝屏幕或其他應用程序)。如何在Android應用程序關閉或失去焦點時調用方法?

看到the Activity lifecycle,我的想法是通過在每一個活動的排空的onDestroy數據庫做到這一點。爲了測試描述的生命週期,我只是覆蓋了所有的生命週期方法(onCreate,onStart,onResume,onPause,onStop和onDestroy),包含了一些日誌消息,並啓動了我的應用程序。

日誌消息都包含在我的SettingsActivity。當我進入我的應用程序並移動到設置它運行onCreate,onStart和onResume(如預期)。當我點擊一個設置並移動到下一個屏幕時,它會運行onPause和onStop(如預期)。要回到設置屏幕,我點擊後退按鈕,它會再次運行onStart和onResume(如預期的那樣),當我現在再次單擊返回按鈕返回到初始屏幕時,它(在我的意外中)運行onPause, onStop和onDestroy。

所以我的問題;

  1. 爲什麼它在應用程序未完成時會破壞Activity?
  2. 更重要的是:我怎麼能運行我的清除方法時,應用程序關閉或失去焦點?
+0

如果用戶拔出電池或應用程序崩潰,您會做什麼? –

+0

@ EugeneMayevski'EldoSCorp - 我們也考慮過這些情況。顯而易見的答案當然不是存儲任何內容,而是將所有內容都保存起來我們想到的一個想法是使用內存中的SQLite數據庫,但現在我們使用的orm(ActiveAndroid)不支持內存數據庫,這將是一個非常大的麻煩(但我們可能會考慮在未來)將orm移植到內存中的SQLite數據庫或返回到我們自己的數據庫連接。另一個想法是保持Java列表中的所有數據。然而,這會使智能查詢變得不可能。你有另一個想法嗎? – kramer65

+0

數據庫的加密出現在我的腦海中,但它必須由DBMS支持。非DBMS解決方案也可能是一種選擇,但它取決於您緊密DB如何鏈接到您的架構。 –

回答

8

你可以在這裏一些更多的信息:http://developer.android.com/training/basics/activity-lifecycle/stopping.html

即使我想你已經讀過它,因爲你已經學習活動的生命週期,您可以在第一張圖的onDestroy()onStop()這之後調用見呼叫完全由系統管理:您不應該期望任何行爲。系統將決定何時調用此方法,有時,此方法將不會被調用(請參閱:http://developer.android.com/reference/android/app/Activity.html)。當系統需要記憶時,您的活動將通過onStop()並且僅此而已。

因此,要回答你的第二個問題,你shloud文檔中閱讀說明有關onDestroy()方法:

注:沒有這種方法被稱爲作爲一個地方算保存 數據!例如,如果某活動正在編輯內容提供者中的數據,則應在onPause()或onSaveInstanceState(Bundle)中提交這些編輯,而不是在這裏。這種方法通常實現爲釋放與 活動關聯的線程之類的資源,以便在其應用程序的其餘部分仍在運行時,被銷燬的活動不會離開此類事物。有 情況下系統將簡單地殺死活動的主機 進程而不調用此方法(或任何其他人),因此它不應該用於在過程消失後將其保留在 左右。

所以很明顯,這是一個糟糕的地方,使您的清理過程。所以你shloud使用onPause()onStop()方法之一。

onStop()在文檔中是這樣描述的:

調用,當你不再對用戶可見。接下來您將收到onRestart()onDestroy(),或者什麼也不做,具體取決於以後的用戶活動。

onPause()在文檔中是這樣描述的:

調用當活動即將 到背景活動生命週期的一部分,但還沒有(還)被殺害。 [...] 當活動B是活性的前推出,這個回調函數會被調用 上不會直到A的的onPause()返回創建A. B,所以 一定不要做任何冗長這裏。 [...] 在系統需要更多內存的情況下,它可能會終止暫停的進程以回收資源。

我們現在知道,onPause()設計,讓您保存您的數據,同時又有onPause()被執行後,系統會的過程。因此,在onPause()中進行清理似乎是最安全的地方,因爲您可以確定每次都會調用它。

此外,你可以閱讀,讓你清理這裏可以讓你的應用程序緩慢,但無論如何,清洗,並在每個增益/鬆焦點重新創建你的數據庫是一個非常沉重的過程......

要恢復:使用onPause()方法和onResume()中的init進程清理進程。請記住,您的應用程序在這種過程中會非常慢。

希望這可以幫助你。

+0

感謝您提供詳盡的答案。我仍然想知道;如何檢查onPause用戶是切換到不同視圖還是應用實際上關閉(用戶按Home按鈕還是由需要資源的系統)?代碼片段將非常感謝.. :) – kramer65

+0

在這裏,你不是在應用程序級別,但在活動水平。您不是在管理整個應用程序生命週期,而只是「視圖」。所以也許你永遠無法知道接下來會發生什麼。但是,通過'View.onKeyDown()'方法的自定義實現(http://developer.android.com/reference/android/view/View.html#onKeyDown(int,android.view.KeyEvent)),我我確信你將能夠做出你想要的東西:) – mithrop

+0

如果答案對你有幫助,請記得接受來自Google的其他讀者:) – mithrop

0

你不能在應用程序的Java部分中這樣做(調用一個函數)。 只在本機部分。

+0

你是什麼意思?我可以簡單地編寫一個簡單的類,將其導入並在應用程序的任何部分中運行一個方法。 – kramer65

2

銷燬回來的活動是正常的行爲。從Android developers site

有些情況下,你的活動是由於正常的應用程序的行爲,當用戶按下後退按鈕如摧毀了幾個方案......

具有檢測當應用程序去背景,沒有簡單的方法調用,會讓你知道這一點。然而,這個previous question包含一些關於如何去做的很好的答案。

相關問題