如何在安卓應(yīng)用程序中保存數(shù)據(jù)
這是關(guān)于在應(yīng)用中保存數(shù)據(jù)和應(yīng)用狀態(tài)系列文章中的***篇。在安卓SDK中有許多機(jī)制可以用來保存數(shù)據(jù),決定使用哪一種和何時觸發(fā)該操作常讓人困惑。 當(dāng)創(chuàng)建個人應(yīng)用程序的時候你想要做的***件、最容易的事就是保存一些用戶輸入的、明確需要保存的數(shù)據(jù)。下面是一些常用來持久化存儲的方法:
- 數(shù)據(jù)保存最基本的方法就是保存到外置存儲設(shè)備的文件上。這種存儲可以被用戶和所有的應(yīng)用程序獲得,當(dāng)設(shè)備當(dāng)作外置存儲掛在的時候也可以看到。即使 你的應(yīng)用卸載了該文件也會一直保留,除非你用GetExternalFileDir方法獲得保存文件的文件夾。這最適用于被用戶編輯過的文件,即使應(yīng)用卸 載了也***一直保留著,例如圖片和文檔。
- 你也可以把文件保存為內(nèi)部存儲,這對于你的應(yīng)用程序是私有的。這種情況下,用戶和其他應(yīng)用程序都得到這些文件,并且當(dāng)你應(yīng)用卸載的時候文件將被刪除。這最適用于保存一些簡單的數(shù)據(jù),避免了處理數(shù)據(jù)庫的開銷。
- 另外,你也可以把用戶的配置保存成 鍵/值對,使用Preference API來創(chuàng)建SharedPreferences文件。你可以創(chuàng)建一個PreferenceActivity或者包含 PreferenceFragment的Activity保存參數(shù)配置,他們的布局中都有Preferences 對象來代替View對象。
- ***,如果你要保存的數(shù)據(jù)結(jié)構(gòu)很復(fù)雜,每個應(yīng)用都有自己的私有的SQLLite數(shù)據(jù)庫來保存數(shù)據(jù)。如果你的應(yīng)用被卸載,這些數(shù)據(jù)也將被銷毀。
另外,有些情況需要保存應(yīng)用程序的當(dāng)前狀態(tài),因?yàn)槟硞€事件被觸發(fā)。例如:
- 當(dāng)設(shè)備被旋轉(zhuǎn)的時候,當(dāng)前的Activity被重新創(chuàng)建,布局也被調(diào)整。
- 當(dāng)你的應(yīng)用被用戶或者其他應(yīng)用放到后臺去運(yùn)行的時候,例如手機(jī)接到一個電話。另外,用戶打開了應(yīng)用程序的另一個Activity,當(dāng)前的Activity也會被放到后臺。任何在后臺運(yùn)行的Activity當(dāng)內(nèi)存不足的時候都可能被回收,當(dāng)需要的時候再被重新創(chuàng)建。
- 當(dāng)用戶明確地關(guān)閉了應(yīng)用。
以上的情況,你都需要持久化保存用戶輸入的數(shù)據(jù)。當(dāng)Activity被放到后臺或者在銷毀的過程中,onPause方法總是被調(diào)用,緊接著是 onStop即使UI被完全隱藏。所以***在OnPause方法中保存數(shù)據(jù)。隨后,當(dāng)用戶再次接觸之前的Activity,如果它仍在內(nèi)存中 onRestart,onstart和onResume方法將被調(diào)用,如果已經(jīng)被回收了就需要被重新常見,那么onCreate、onStart、和 onResume將被調(diào)用。所以如果你想在所有情況下都再次顯示之前的數(shù)據(jù),你應(yīng)該在onResume方法中恢復(fù)UI。
如果不需要***的保存數(shù)據(jù)而只想保存UI的狀態(tài),你可以在onSaveInstanceState方法中把數(shù)據(jù)保存在Bundle中。該方法不能用 來保存數(shù)據(jù),因?yàn)樗皇茿ctivity生命周期的一部分,僅僅當(dāng)Activity需要重新創(chuàng)建或者被放到后臺的時候被UI事件觸發(fā),被***銷毀的時候該 方法不被調(diào)用。所以它僅用于保存一些暫時性View狀態(tài)。有些數(shù)據(jù)已經(jīng)被安卓SDK保存了,但你可能需要保存些額外的信息,例如,假如你有些自定義的控 制,當(dāng)用戶按返回鍵回到Activity的時候,UI的狀態(tài)需要被恢復(fù),如果Activity仍在內(nèi)存中,保存有狀態(tài)信息的bundle對象可以在 onRestoreInstanceState方法中獲得,如果Activity被回收了需要重新創(chuàng)建,可以在onCreate方法中獲得bundle對 象。
原文鏈接: javacodegeeks 翻譯:黃瓜