日常使用經(jīng)驗(yàn)告訴我們,無論是在電腦網(wǎng)頁還是掌上app,幾乎所有需要注冊(cè)、登錄的交互式應(yīng)用軟件都自帶了一個(gè)方便用戶上線的功能:記住密碼。
記得我上初中那會(huì)兒正流行QQ升級(jí),同伴間很愛比較誰的Q“太陽”“月亮”多。我每天回家開機(jī),屏幕會(huì)自動(dòng)彈出QQ登錄界面,一鍵登錄然后掛機(jī)在后臺(tái)等待升級(jí).....“記住密碼”功能可以說是短小精悍的,即不復(fù)雜又對(duì)用戶友好。
它的實(shí)現(xiàn)只需借助于android中的數(shù)據(jù)持久化技術(shù)。所謂數(shù)據(jù)持久化,就是將那些內(nèi)存中的瞬時(shí)數(shù)據(jù)保存到存儲(chǔ)設(shè)備中,這樣一來即使手機(jī)、PC關(guān)機(jī),這些數(shù)據(jù)也不會(huì)丟失。
通過這一技術(shù),我們來看一個(gè)實(shí)際案例。這是某個(gè)應(yīng)用程序的登錄界面,界面上有一個(gè)記住密碼的復(fù)選框,它的功能就是我們想要的。
然后我們輸入已經(jīng)設(shè)置好的賬號(hào):Andy,再輸入密碼:119864(賬號(hào)密碼可以自定義,這里僅是舉例),并選中記住密碼的復(fù)選框。點(diǎn)擊登錄就會(huì)跳轉(zhuǎn)到程序中的主頁面。
這時(shí)如果退出程序,再重新進(jìn)入登錄頁面,會(huì)發(fā)現(xiàn)賬號(hào)密碼已經(jīng)自動(dòng)填充到界面上了:
Android系統(tǒng)中主要有三種方式用于實(shí)現(xiàn)數(shù)據(jù)持久化功能,分別是文件存儲(chǔ)、SharedPreference存儲(chǔ)、數(shù)據(jù)庫存儲(chǔ)(SQLite)。“記住密碼”功能可以通過相對(duì)最簡單的SharedPreference存儲(chǔ)方式實(shí)現(xiàn)。新建一個(gè)項(xiàng)目工程,我們馬上來實(shí)際操作一遍吧。
一、登錄界面的布局
布局設(shè)計(jì)、控件使用對(duì)我們應(yīng)該已經(jīng)易如反掌了。具體你可以回頭參考《Android開發(fā)(二)| 編寫程序界面》
本界面我們使用TableLayout布局,即表格的方式來排列控件,清晰直觀。activity_main.xml中的代碼如下:
這時(shí)我們運(yùn)行下程序,大致效果已經(jīng)出來了,不過看上去總覺得有點(diǎn)怪怪的:
不和諧的地方有兩個(gè):
1)標(biāo)題“歡迎登錄”和按鈕“Login”只占據(jù)一列,會(huì)顯得表格結(jié)構(gòu)不合理;
2)當(dāng)前界面并沒有充分利用屏幕的寬度,即便占據(jù)了兩列,右側(cè)還是空出了一塊區(qū)域。
對(duì)此我們有相應(yīng)的兩個(gè)解決方案:
1)合并單元格,使用 android:layout_span="2" 讓登錄按鈕和標(biāo)題占據(jù)兩列的空間,以保證表結(jié)構(gòu)的合理。
2)在<TableLayout>中使用 android:stretchColumns="1" ,將TableLayout中的第二列進(jìn)行拉伸,以實(shí)現(xiàn)自動(dòng)適應(yīng)屏幕寬度。
現(xiàn)在重新運(yùn)行一下程序,模擬機(jī)上顯示出的效果就正常合理了:
二、將數(shù)據(jù)存儲(chǔ)到SharedPreferences
SharedPreferences是使用鍵值對(duì)的方式存儲(chǔ)數(shù)據(jù)。當(dāng)保存一條數(shù)據(jù)時(shí),需要給這條數(shù)據(jù)提供一個(gè)對(duì)應(yīng)的鍵;讀取數(shù)據(jù)時(shí)即通過這個(gè)鍵把值取出。SharedPreferences還支持多種不同數(shù)據(jù)類型的存儲(chǔ)。
1)獲取SharedPreferences對(duì)象
想使用SharedPreferences存儲(chǔ)數(shù)據(jù),首先要獲取它的對(duì)象。Android主要提供了三種方法得到此對(duì)象,我們這兒選擇最常用的Context類中的getSharedPreferences()方法。
此方法接收兩個(gè)參數(shù),第一個(gè)參數(shù)用于指定SharedPreferences文件的名稱(不存在則會(huì)創(chuàng)建一個(gè)),SharedPreferences文件均存放在/data/data/<package name>/shared_prefs/目錄下;第二個(gè)參數(shù)用于指定操作模式,默認(rèn)選用MODE_PRIVATE,表示僅當(dāng)前應(yīng)用程序可以對(duì)這個(gè)SharedPreferences文件進(jìn)行讀寫。
2)向SharedPreferences文件中存數(shù)據(jù)
可以分三步實(shí)現(xiàn)數(shù)據(jù)存放:
·1 ?調(diào)用SharedPreferences對(duì)象的edit()方法獲取一個(gè)SharedPreferences.Editor對(duì)象;
·2 向SharedPreferences.Editor對(duì)象添加數(shù)據(jù)。如添加字符串,就使用putString(),以此類推;
·3 調(diào)用commit()方法將添加的數(shù)據(jù)提交,完成數(shù)據(jù)存儲(chǔ)。
理論說明先到此,將上述過程在主活動(dòng)登錄按鈕的響應(yīng)事件中代碼化,如下:
可以看到,我們把輸入的賬號(hào)(Andy)、密碼(119864)、復(fù)選框選中信息通過各自的鍵,都傳入了SharedPreferences.Editor的對(duì)象editor;如果賬號(hào)/密碼不正確,就提示一句“賬號(hào)/密碼不合法”。最后通過鍵值,把數(shù)據(jù)讀取出來并顯示就ok了。
三、從SharedPreferences中讀取數(shù)據(jù)
相當(dāng)于存儲(chǔ)數(shù)據(jù),讀取就顯得非常簡單了。對(duì)應(yīng)SharedPreferences.Editot的put方法,SharedPreferences對(duì)象提供了一系列get方法用于讀取存儲(chǔ)數(shù)據(jù),如讀取一個(gè)字符串,就用getString()方法。
這些get方法統(tǒng)一接收兩個(gè)參數(shù):第一個(gè)是鍵,傳入存儲(chǔ)數(shù)據(jù)時(shí)用的鍵就可得到相應(yīng)值;第二個(gè)是默認(rèn)值,表示當(dāng)傳入的鍵找不到對(duì)應(yīng)值時(shí),以怎樣的默認(rèn)值返回。
在主活動(dòng)的onCreate()函數(shù)中,先判斷復(fù)選框是否選中;若選中則直接把賬號(hào)、密碼讀取顯示在頁面中。在原有基礎(chǔ)上,往onCreate()添加這段簡潔明了的代碼即可:
現(xiàn)在我們“記住密碼”的功能已經(jīng)順利實(shí)現(xiàn)了。登錄成功后,將跳轉(zhuǎn)至具體的應(yīng)用界面,我們可以在其中自定義需要實(shí)現(xiàn)的邏輯和功能,此處不再贅余。
本章小結(jié):這一章是Android數(shù)據(jù)持久化的一次小實(shí)戰(zhàn),目的是認(rèn)識(shí)數(shù)據(jù)存儲(chǔ)的過程和它的重要性。對(duì)于一些關(guān)鍵性的數(shù)據(jù)信息,因程序關(guān)閉而丟失信息是絕對(duì)不能容忍的。
假設(shè)我們剛發(fā)了一條朋友圈,結(jié)果刷新一下就沒了,實(shí)在是炒蛋吧?這就需要數(shù)據(jù)持久化技術(shù)的支持了。
本文只是拋磚引玉,實(shí)際開發(fā)中不可能如此簡單的存儲(chǔ)密碼,一定還經(jīng)過諸如加密、封裝等步驟。但是如果讀完全文讀者對(duì)數(shù)據(jù)存儲(chǔ)已經(jīng)有了初步的認(rèn)識(shí),那么我的目的已經(jīng)達(dá)到了!
點(diǎn)贊表明您已閱(?ω?)
作者:葉琛
一個(gè)癡迷旅行的IT程序狗