第七章 偏好設定、檔案系統、 選項選單和意圖epaper.gotop.com.tw/pdf/a293.pdf ·...

18
在本章中讀者將學到如何建立應用程式的偏好設定、檔案系統是如何組織、如何使用意圖 和選項選單從一個活動跳到另一個活動。 偏好設定(Preference偏好設定是應用程式的使用者特定設定。偏好設定通常由一些設定資料以及操縱這些資料 的使用者介面所構成。 從使用者介面的觀點來說,偏好設定可能是簡單的文字值、核取方塊、下拉式選單的選項 或類似的項目。從資料的觀點來說,偏好設定是名稱- 值配對(name-value pair )的集合, 也有人稱鍵- 值(key-value )或屬性- 值(attribute-value )配對。這些值是基本的資料類 型,像是整數、布林值和字串。 我們的微型部落格應用程式需要使用特定的使用者帳號資訊來連接到雲端上的特定伺服 器。因此 Yamba 需要知道該帳號的使用者名稱和密碼以及要連到之伺服器的 URL。這個 URL 也就是一般所知的 API 根目錄。所以在我們的例子中,我們將有三個欄位給使用者輸 入並編輯其使用者名稱、密碼和 API 根目錄。這些資料將被儲存成字串。 要讓我們的應用程式能處理使用者特定的偏好設定,我們需要建立一個輸入資訊的畫面、 驗證及處理該資訊的 Java 程式碼和某種儲存該資訊的機制。 這些聽起來好像要做很多工作,但 Android 提供了一個架構來協助減少使用者偏好設定上 的工作。首先,我們將在偏好設定資源檔案中定義出我們偏好設定資料的樣貌。 要建立我們應用程式的偏好設定,我們需要: 第七章 偏好設定、檔案系統、 選項選單和意圖

Upload: others

Post on 06-Jan-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: 第七章 偏好設定、檔案系統、 選項選單和意圖epaper.gotop.com.tw/pdf/A293.pdf · 偏好設定、檔案系統、選項選單和意圖│ 85 圖7-1:New Android XML

在本章中讀者將學到如何建立應用程式的偏好設定、檔案系統是如何組織、如何使用意圖

和選項選單從一個活動跳到另一個活動。

偏好設定(Preference) 偏好設定是應用程式的使用者特定設定。偏好設定通常由一些設定資料以及操縱這些資料

的使用者介面所構成。

從使用者介面的觀點來說,偏好設定可能是簡單的文字值、核取方塊、下拉式選單的選項

或類似的項目。從資料的觀點來說,偏好設定是名稱-值配對(name-value pair)的集合,也有人稱鍵-值(key-value)或屬性-值(attribute-value)配對。這些值是基本的資料類型,像是整數、布林值和字串。

我們的微型部落格應用程式需要使用特定的使用者帳號資訊來連接到雲端上的特定伺服

器。因此 Yamba 需要知道該帳號的使用者名稱和密碼以及要連到之伺服器的 URL。這個URL 也就是一般所知的 API 根目錄。所以在我們的例子中,我們將有三個欄位給使用者輸入並編輯其使用者名稱、密碼和 API根目錄。這些資料將被儲存成字串。

要讓我們的應用程式能處理使用者特定的偏好設定,我們需要建立一個輸入資訊的畫面、

驗證及處理該資訊的 Java程式碼和某種儲存該資訊的機制。

這些聽起來好像要做很多工作,但 Android 提供了一個架構來協助減少使用者偏好設定上的工作。首先,我們將在偏好設定資源檔案中定義出我們偏好設定資料的樣貌。

要建立我們應用程式的偏好設定,我們需要:

第七章

偏好設定、檔案系統、 選項選單和意圖

Page 2: 第七章 偏好設定、檔案系統、 選項選單和意圖epaper.gotop.com.tw/pdf/A293.pdf · 偏好設定、檔案系統、選項選單和意圖│ 85 圖7-1:New Android XML

84│第七章

1. 建立名為 prefs.xml的偏好設定資源檔案。

2. 實作 PrefsActivity.java檔案來膨脹資源檔案。

3. 以 AndroidManifest.xml檔案來登錄此項新活動。

4. 提供從應用程式其他地方啟動此活動的方式。

Prefs資源 我們將從建立 prefs.xml 開始,此資源檔案會列出我們偏好設定畫面看起來的樣子。建立它的最簡單方法就是使用 Eclipse中的 New Android XML File工具,如圖 7-1中所示。要啟動 New Android XML File對話視窗,請至 File→New→Android XML File,或點按 Eclipse頂端選單列中的小 a+圖示:

關鍵在於給這個新檔案一個名稱(在本例中是 prefs.xml)並選擇 Preference 做為資源類型。此工具應該會自動建議在 /res/xml資料夾中建立此新檔案,而該 XML檔案的根元素應該是 PreferenceScreen。如第 79 頁「替代性資源」中所討論過的,我們可以應用各種限定詞來建立同一資源的替代性版本,像是螢幕大小和方向、語言和區域等等。

我們使用 Eclipse 工具以讓應用程式可以更快速地完成工作。Eclipse 通常會在其便於

開發人員的檢視中開啟它知道的 XML檔案。

在 此 檢 視 中 , 讀 者 可 以 藉 由 選 取 左 邊 的 PreferenceScreen , 然 後 選 擇 Add→ EditTextPreference,以建立使用者名稱的偏好設定項目。在右手邊請展開 Attributes from Preference的區段。Eclipse將提供讀者數個屬性來設定此 EditTextPreference。

不是所有的屬性都一樣重要。通常讀者在意的屬性如下:

• 鍵(Key):每個偏好設定項目的唯一識別碼。這也是我們稍後查詢特定偏好設定的

方式。

• 標題(Title):使用者將看見的偏好設定名稱。它應該是個能放入偏好設定畫面單行

之中的簡短名稱。

• 摘要(Summary):偏好設定項目的簡短說明。這是個選用項目,但極力推薦使用

它。

Page 3: 第七章 偏好設定、檔案系統、 選項選單和意圖epaper.gotop.com.tw/pdf/A293.pdf · 偏好設定、檔案系統、選項選單和意圖│ 85 圖7-1:New Android XML

偏好設定、檔案系統、選項選單和意圖│ 85

圖 7-1:New Android XML File

我們將輸入 usename 作為使用者名稱偏好設定的鍵。我們將在 strings.xml 中定義標題和摘要,因為這是最佳實作規範。

我們將使用 Eclipse的捷徑而不直接修改 strings.xml檔案。底下是其作法:

1. 點按 Browse並選取 New String...。這將會開啟一個建立新字串資源的對話視窗。

2. 輸入 titleUsername作為 R.string. 的值,Username作為字串的值。

3. 點按 OK 這將會在 strings.xml中插入一個新的字串資源。

4. 讀者現在可從資源清單中挑選值。

Page 4: 第七章 偏好設定、檔案系統、 選項選單和意圖epaper.gotop.com.tw/pdf/A293.pdf · 偏好設定、檔案系統、選項選單和意圖│ 85 圖7-1:New Android XML

86│第七章

讀者現在可重複這些增加使用者名稱偏好設定項目的說明來增加密碼和 API 根目錄這二個項目。

讀者可以藉由點按視窗底部的標籤頁(如圖 7-2中所示)來切換到實際的 XML程式碼。

圖 7-2:在便於開發人員之檢視中的 prefs.xml

偏好設定資源的原始 XML看起來如範例 7-1中的程式碼。

範例 7-1:res/xml/prefs.xml

Page 5: 第七章 偏好設定、檔案系統、 選項選單和意圖epaper.gotop.com.tw/pdf/A293.pdf · 偏好設定、檔案系統、選項選單和意圖│ 85 圖7-1:New Android XML

偏好設定、檔案系統、選項選單和意圖│ 87

<PreferenceScreen> 是定義我們偏好設定主畫面的根元素。這有三個子元素,全都是

<EditTextPreference> 。 這 只 是 一 段 可 編 輯 的 文 字 。 在 這 裡 的 其 他 常 見 元 素 是

<CheckBoxPreference>、<ListPreference> 等等。

這些元素的主要屬性都是鍵(key)。我們之後查詢這些值時就是使用鍵。請記住,偏好設

定最終只不過是名稱-值配對而已。

我們曾說過,雖然 Eclipse 可提供便於開發人員管理 XML 檔案的工具,但讀者通常會遇到Eclipse 上的某些限制。舉例來說,我們想要隱藏使用者在密碼欄位中輸入的實際文字,這也是常見的慣例。Android 的確提供這方面的支援,但 Eclipse 工具尚未整合這項功能。因為 我 們 一 直 都 可 以 直 接 編 輯 XML , 所 以 在 本 例 中 我 們 可 以 在 密 碼 上 增 加android:password="true" 屬性。這將會在使用者輸入密碼時遮住它。

PrefsActivity 現在我們已在偏好設定的 XML資源檔案中定義好它們了,所以可以建立顯示這些偏好設定的活動。讀者可能想起之前在「活動」一節提過 Android 應用程式中的每個畫面都是個活動。所以為了顯示使用者輸入線上帳號之使用者名稱及密碼時的畫面,我們將建立一個活

動來處理該畫面。這將是個特別的偏好設定感知活動。

為了建立一個活動,我們會建立一個新的 Java類別。請在 Eclipse中 src資料夾底下選取讀者的套件、在套件上點按右鍵並選取 New→Class。這樣將會跳出一個 New Java Class 視窗。讀者只需要在 Name輸入 PrefsActicty 並點按 Finish。這將會在讀者資源資料夾中的套件底下建立一個 PrefsActivity.java檔案。

我們的 PrefsActivity 類別(如範例 7-2 中所顯示)是個非常簡單的 Java 檔案。這是因為我們繼承了 PreferenceActivity這個知道如何處理偏好設定的 Android架構類別。

範例 7-2:PrefsActivity.java

Page 6: 第七章 偏好設定、檔案系統、 選項選單和意圖epaper.gotop.com.tw/pdf/A293.pdf · 偏好設定、檔案系統、選項選單和意圖│ 85 圖7-1:New Android XML

88│第七章

與一般的活動不同,PrefsActivity 會建立 PreferenceActivity 類別的子類別(也就是延

伸)。

與其他任何活動相同,我們覆寫了 onCreate() 方法來初始化此活動。

不同於一般活動通常會呼叫 setContentView(),我們的偏好設定活動將透過呼叫

addPreferencesFromResource() 來從 prefs.xml檔案設定其內容。

我們經常必須實作或覆寫 onCreate() 及其他方法,如果讀者不想輸入這些方法的冗長

簽章,可以使用 Eclipse 工具來協助進行。當讀者在 PrefsActivity.java 檔案中增

加 …extends PreferenceActivity… 之 後 , 可 以 選 擇 Source→Override/Implement

Methods…。由於讀者正建立 PreferenceActivity 類別的子類別,這將會帶出一個對話

方塊,上有讀者可覆寫或實作之方法的相稱區段。在這裡讀者可以選擇 onCreate(),

而 Eclipse會將此方法的虛設常式插入讀者的程式碼中。

更新定義描述檔 每當我們建立一個主要建立區塊(活動、服務、廣播接收程式或內容提供者)時,我們就

需要在 AndroidManifest.xml 檔案中加以定義。在本例中,我們有個新的 PrefsActivity 而且

必須將它增加到定義描述檔。

就像任何 Android XML檔案一樣,在 Eclipse中開啟 AndroidManifext.xml通常會帶出方便的檔案檢視。在此檔案檢視中,讀者可以選擇 Application 標籤頁,然後在 Application Nodes底下選擇 Add→Activity,並將它命名為 .PrefsAcitivy。

不過我們也可以藉由點按此視窗底部的 AndroidManifest.xml 標籤頁而直接從原始 XML 進行此事。筆者發現 Eclipse 在建立 XML 檔案時很有用,但通常編輯原始 XML 會比較快,且給讀者更多的控制。

當在 Eclipse中編輯程式碼時,讀者可以使用 Ctrl鍵-空白鍵的快速鍵來叫用 Eclipse的

提前鍵入(type-ahead)功能。這在 XML和 Java程式碼二者上都很有用,而且能辨識

上下文,也就表示說 Eclipse 聰明到知道程式碼中這時可能會輸入什麼。使用 Ctrl 鍵-

空白鍵可讓身為程式設計師的讀者生活更輕鬆,因為讀者不用記得冗長的方法名稱及

標籤頁,而有助避免打字錯誤。

所以我們的定義描述檔現在看起來如範例 7-3中的程式碼。

Page 7: 第七章 偏好設定、檔案系統、 選項選單和意圖epaper.gotop.com.tw/pdf/A293.pdf · 偏好設定、檔案系統、選項選單和意圖│ 85 圖7-1:New Android XML

偏好設定、檔案系統、選項選單和意圖│ 89

範例 7-3:AndroidManifest.xml

定義這個新的 PrefsActivity。

現在我們有了新的偏好設定活動,但還沒有個好方式可以到達它。我們需要一個方式來啟

動此新活動。因此我們使用了選項選單。

選項選單(Options Menu) 選項選單此 Android 使用者介面元件可提供標準化的選單給應用程式。當使用者按下裝置上的 Menu按鈕時,選單會出現在螢幕的底部。

要在應用程式上增加選項選單支援,我們需要做下列工作:

1. 建立 menu.xml資源,我們可在此指定選單中有些什麼。

2. 為應該具有此選單的活動增加 onCreateOptionsMenu()。我們可在此膨脹 menu.xml資源。

3. 在 onOptionsItemSelected() 中提供選單事件的處理。

選單資源 我們一開始先在選項選單的 XML 資源中定義選單。就像其他的 Android XML 檔案一樣,我們可以使用 Eclipse 工具列中的小 a+ 圖示或選擇 File→New…→Android XML 來啟動New Android XML File對話視窗。在此對話視窗中,請在檔案欄位中輸入 menu.xml,並在Type 處選取 Menu。請點按 Finish 按鈕,而 Eclipse 將會建立內有 menu.xml 檔案的/res/menu的新資料夾,並在一個便於開發人員的檢視中開啟此檔案(見圖 7-3)。

Page 8: 第七章 偏好設定、檔案系統、 選項選單和意圖epaper.gotop.com.tw/pdf/A293.pdf · 偏好設定、檔案系統、選項選單和意圖│ 85 圖7-1:New Android XML

90│第七章

圖 7-3:檢視中的 Menu.xml

在此檢視中,讀者可點按 Add→Item,這將會增加一個新的選單項目到讀者的選單。在右邊的 Attributions 區段中,讀者可以看到此選單項目有一打以上的屬性可設定。和前面一樣,不是所有的屬性都一樣重要:

• Id:此資源的唯一識別碼。就像在第六章中設計版面配置時,這個是別碼通常的形式

是 @id/someId,其中 someId 是讀者給它的名稱。此名稱應該只包含字母、數字和底

線字元。

• 標題(Title):此選單出現在畫面上的標題。請記住螢幕空間通常有限,所以標題要

儘量短。此外讀者可提供 Title condensed 屬性來指定如果空間有限時所顯示的簡短版標題。和以前一樣,最佳實作規範是在 strings.xml 資源中定義標題的實際文字值,在這裡只是指向它而已。

• 圖示(Icon):與選單項目的標題一起顯示的圖示。雖然不一定要有,但從實用性的

觀點來看,它是個非常有用的視覺提示。在本例中它也說明了如何指向 Android 系統資源。

下一節會更詳細地說明這些資源。

Page 9: 第七章 偏好設定、檔案系統、 選項選單和意圖epaper.gotop.com.tw/pdf/A293.pdf · 偏好設定、檔案系統、選項選單和意圖│ 85 圖7-1:New Android XML

偏好設定、檔案系統、選項選單和意圖│ 91

Android系統資源 Android 系統和讀者的應用程式一樣也可以有資源。就像大多數其他的作業系統,Android也附有預先載入的圖像、圖形、音效片段或其他資源類型。記得我們應用程式的資源是在

/res/。要指向 Android系統資源,請在 XML中將資源加上 android: 此關鍵字做為字首,例

如 @android:drawable/ic_menu_preference。如果讀者從 Java 指向 Android 系統資源,那麼請使用 android.R來取代一般的 R參考。

實際的資源檔案是在讀者 SDK 中的一個特定平台資料夾內。舉例來說,如果讀者使用

Android 9(Gingerbread),則資源資料夾會是 android-sdk/platforms/android-9/

data/res/。

menu.xml的原始 XML如範例 7-4中所示。

範例 7-4:res/menu/menu.xml

如讀者所見,我們的 <menu> 元素中只有一個 <item> 元素,所以是個單一項目選單。

更新 StatusActivity以載入選單 記得選項選單是在使用者點按其裝置上的 Menu按鈕時,由讀者的活動所載入。當 Menu按鈕第一次被按下時,系統將會呼叫活動的 onCreateOptionsMenu() 方法以從 menu.xml 資源膨脹選單。這個處理過程類似第 56 頁「StatusActivity Java 類別」中曾討論過的,從版面配置膨脹使用者介面。基本上,inflater 會讀取 XML 程式碼、為每個元素建立對應的 Java物件並相應地設定每個 XML物件的屬性。

從這裡開始,選單就是在記憶體中,而 onCreateOptionsMenu() 一直到活動被銷毀都不會

再被呼叫。不過每次使用者選取一個選單項目時,onOptionsItemSelected() 都會被呼叫來

處理該點按。我們將再下一節討論此主題。

我們需要更新 StatusActivity 以載入選項選單。要做到此,請增加一個 onCreateOptions-

Menu() 方法到 StatusActivity。這個方法只有在使用者第一次點按選單按鈕時才會被呼叫:

Page 10: 第七章 偏好設定、檔案系統、 選項選單和意圖epaper.gotop.com.tw/pdf/A293.pdf · 偏好設定、檔案系統、選項選單和意圖│ 85 圖7-1:New Android XML

92│第七章

我們從 context得到 MenuInflater物件。

使用 inflater從 XML資源膨脹此選單。

我們必須回傳 true以顯示出此選單。

更新 StatusActivity以處理選單事件 我們還需要一個方法來處理選單項目上的各種點按。要做到此,我們會增加另一個回呼方

法 onOptionsItemSelected()。每次使用者點按選單項目時這個方法就會被呼叫:

因為不管使用者點按哪個項目,相同的方法都會被呼叫,所以我們需要知道項目的 ID,並根據此來切換到處理各項目的特定情況。目前我們只有一個選單項目,但未來有可能

改變。切換項目 ID 是個非常容易擴充的方式,並且隨著我們應用程式愈來愈複雜還可以適當地調整。

context 中的 startActivity() 方法可讓我們啟動新的活動。在本例中,我們建立一個新意

圖來指定啟動 PrefsActivity類別。

在這裡回傳 true以取用該事件。

和前面一樣,讀者可以使用 Source→Override/Implement Methods此一 Eclipse捷徑來

增加 onCreatOptionsMenu() 和 onOptionsItemSelected()。

字串資源 我們更新過的 strings.xml現在看起來像範例 7-5中所顯示的程式碼。

Page 11: 第七章 偏好設定、檔案系統、 選項選單和意圖epaper.gotop.com.tw/pdf/A293.pdf · 偏好設定、檔案系統、選項選單和意圖│ 85 圖7-1:New Android XML

偏好設定、檔案系統、選項選單和意圖│ 93

範例 7-5:res/values/strings.xml

讀者目前應該能夠執行此應用程式,並藉由點按 StatusActiivty 中的 Menu→Prefs 來看看這個新的 PrefsActivity。請試著變更使用者名稱和密碼,然後將手機重開機、重新啟動此應用

程式並驗證此資訊仍然還在。

圖 7-4:PrefsActivity

共用的偏好設定 現在我們有個偏好設定活動,並有方式可以儲存我們的使用者名稱、密碼和 API 根目錄,該是利用它的時候了。為了要以程式設計的方式存取讀者的偏好設定,我們將使用 Android架構所提供的 SharedPreference類別。

Page 12: 第七章 偏好設定、檔案系統、 選項選單和意圖epaper.gotop.com.tw/pdf/A293.pdf · 偏好設定、檔案系統、選項選單和意圖│ 85 圖7-1:New Android XML

94│第七章

這個類別被稱為 SharedPreference 是因為此偏好設定很容易從此應用程式的任一元件(活

動、服務、廣播接收程式和內容提供者)上進行存取。

在 StatusActivity中,以全域方式將 prefs物件的定義增加到此類別:

現在為了取得此偏好設定物件,請將下列程式碼增加到 onCreate():

每個應用程式都讓它 context 中的所有元件可以使用它的共用偏好設定。為取得此SharedPreferences 的實例,我們使用 PreferenceManager.getDefaultSharedPreferences()

並傳給它 this 當成此應用程式目前的 context。「共用」這個名稱可能會讓人搞混。為了釐清,它是表示此偏好設定物件所包含的資料只有此應用程式的不同部分可共用;它

並不和任何其他應用程式共用。

使用者能夠變更偏好設定,而且也會這麼做。所以我們需要一個機制來通知此活動舊有的值已過時。要做到此,我們會登錄 this,它表示具有我們共用偏好設定的

StatusActivity。為了讓它運作,我們需要增加 ...implements OnSharedPreference-

ChangeListener到我們的類別定義,並實作必要的 onSharedPreferenceChanged() 方法。

此方法將在稍後解釋。

現在我們有了使用者所定義之偏好設定的使用者名稱、密碼和 API 根目錄,我們便可重構Twitter 程式碼以讓它不再硬式編碼它們。要做到此,我們增加一個私人方法到負責回傳有效 twitter 物件的 StatusActivity。這個方法會鬆散地將 twitter 加以初始化,這表示如果

twitter存在的話,它會照原樣將它回傳;不然的話,此方法會建立它:

Page 13: 第七章 偏好設定、檔案系統、 選項選單和意圖epaper.gotop.com.tw/pdf/A293.pdf · 偏好設定、檔案系統、選項選單和意圖│ 85 圖7-1:New Android XML

偏好設定、檔案系統、選項選單和意圖│ 95

只有在 twitter是空值(亦即未定義)時,我們才建立它。

從共用的偏好設定物件取得使用者名稱和密碼。getString() 中的第一個參數是我們指派給每個偏好設定項目的鍵,像是 username 和 password。第二個參數是預設值,以免找

不到像這類的偏好設定。請記住,使用者第一次執行應用程式時,此偏好設定檔並不存

在,所以會使用預設值。因此如果使用者還未在 PrefsActivity 中設置其偏好設定的話,

此程式碼將會試圖以空白的使用者名稱和密碼登入,所以會失敗。不過當使用者試圖進

行實際的狀態更新時將會失敗,因為 jtwitter程式庫就是這麼設計的。

我們以使用者定義的偏好設定登入 Twitter服務。

請記住要更新我們使用的實際服務,我們需要更新該服務的 API根目錄 URL。

現在我們不再直接使用此 twitter 物件,取而代之的是呼叫 getTwitter() 來取得它。所以

onClick() 會變成像:

請注意雖然我們將我們初始化連線所在的程式碼移到雲端,我們還是需要 AsyncTask 來處

理此呼叫仍然會封鎖並要花些時間來完成的事實,因為它會受到網路可用性和延遲的影響。

我們前面曾提過,在更新 onCreate() 和登錄偏好設定更新時,我們需要處理使用者變更其使

用者名稱或密碼時所發生的事。藉由在 onCreate() 中登錄 prefs.registerOnShared-

PreferenceChangeListener(this) 並實作 OnSharedPreferenceChangeListener,我們可得到

onSharePreferenceChanged() 此回呼方法,每次偏好設定改變時系統就會叫用此方法。在此方法中,我們只是讓此 twitter物件失效,這樣下一次需要它時 getTwitter() 將會重新建立它:

檔案系統 那麼裝置將這些偏好設定儲放在哪裡?我們的使用者名稱和密碼有多安全?要回答這些問

題,我們需要看一下 Android檔案系統是如何組織的。

Page 14: 第七章 偏好設定、檔案系統、 選項選單和意圖epaper.gotop.com.tw/pdf/A293.pdf · 偏好設定、檔案系統、選項選單和意圖│ 85 圖7-1:New Android XML

96│第七章

探索檔案系統 讀者有二種方式來存取 Android裝置上的檔案系統,分別是透過 Eclipse或命令列。

在 Eclipse中,我們使用 File Explorer檢視來存取檔案系統。要開啟 File Explorer檢視,請進到 Window→Show View→Other…→Android→File Explorer 讀者也可透過 DDMS檢視來存取 File Explorer檢視。請選取 Eclipse右上角中的 DDMS檢視:

或進到 Window→Open Perspective→Other…→DDMS。如果有多部裝置連接到讀者的工作站,請確認選取的是正在 Devices 檢視中進行的那一個。讀者現在應該能夠導覽該裝置的檔案系統。

如果讀者偏愛命令列,可以一直使用 adb shell 來到達該裝置的殼層(shell)。從這裡讀者可像在任何其他 Unix平台上一樣地探索檔案系統。

檔案系統分割 每個 Android裝置上都有三個主要的檔案系統部分。它們是圖 7-5中所顯示的。

• 系統分割(/system/)

• SDCard分割(/sdcard/)

• 使用者資料分割(/data/)

系統分割 讀者的整個 Android 作業系統是位於系統分割中。這是個包含所有預先安裝的應用程式、系統資料庫、Android架構、Linux命令列工具等等的主要分割。

系統分割是以唯讀方式掛接(mount),這表示身為開發人員的讀者對它只有非常有限的影響。因此我們對這個分割沒有什麼興趣。

Emulator 中的系統分割是對應到讀者平台圖像目錄中的 system.img 檔案,該檔案位在android-sdk/platforms/android-8/images/ 資料夾中。

Page 15: 第七章 偏好設定、檔案系統、 選項選單和意圖epaper.gotop.com.tw/pdf/A293.pdf · 偏好設定、檔案系統、選項選單和意圖│ 85 圖7-1:New Android XML

偏好設定、檔案系統、選項選單和意圖│ 97

圖 7-5:透過 Eclipse中 File Explorer所看到的檔案系統

SDCard分割 SDCard 分割是個免費的大量存放區域。讀者的應用程式可以讀取來自此分割的檔案,如果有 WRITE_TO_EXTERNAL_STORAGE 權限還可以將檔案寫入其中。這是個存放像音樂、照

片、影片和類似項目等大檔案的好地方。

自從 Android 2.2版之後,在 Eclipse File Explorer 下的 /mnt/sdcard位置下就出現了 /sdcard掛接點,此新功能讓每個人都能在 SDCard上儲存並執行應用程式。

Page 16: 第七章 偏好設定、檔案系統、 選項選單和意圖epaper.gotop.com.tw/pdf/A293.pdf · 偏好設定、檔案系統、選項選單和意圖│ 85 圖7-1:New Android XML

98│第七章

SDCard 分割對身為應用程式開發人員的讀者而言很好用也很重要。但是這個分割也不是很有結構。

這個分割通常對應到讀者 Android Virtual Device(AVD)目錄中的 adcard.img。這個目錄是在讀者的 ~/.android/avd/ 資料夾中,並且每個特定的虛擬裝置都會有個子目錄。在實體裝置上,它是個實際的 SD記憶卡。

使用者資料分割 身為使用者和應用程式開發人員,最重要的分割是使用者資料分割。這是所有使用者資料

存放的地方,所有下載之應用程式所在的位置,和最重要地,所有應用程式的資料。這包

含了預先安裝的應用程式以及使用者下載的應用程式。

所以當使用者應用程式存放在 /data/app/ 資料夾時,對身為開發人員最重要的資料夾就是這個資料夾。更具體地說,在此資料夾中,每個應用程式都有個子資料夾對應。此資料夾

是由此應用程式簽署自己時所用的 Java 套件來識別。同樣地,這也是為什麼 Java 套件對Android安全性很重要。

Android 架構提供了一些方便的方法做為其 context 的一部分,以協助讀者從自己的應用程式中存取使用者資料檔案系統。舉例來說,請看一下 getFileDir()。

這個分割通常對應到讀者 Android Virtual Device(AVD)目錄中的 user~data.img。和前面一樣,此目錄是在讀者的 ~/.android/avd/ 資料夾中,並且每個特定的虛擬裝置都有個子目錄。

當讀者建立一個新的應用程式時,讀者會指派 Java 程式碼給特定的套件。通常來說,這個套件會遵循反轉網域名稱加上應用程式名稱的 Java慣例。舉例來說,此 Yamba應用程式是在 com.marakana.yamba 套件中。所以一旦安裝後, Android 會在 /data/data/com. marakana.yamba/ 底下為此應用程式建立一個特別的資料夾。此資料夾是我們各應用程式專用之私人、安全檔案系統的基石。

在 /data/data/com.marakana.yamba2/ 中會有資料夾,但它們都有良好的定義。舉例來說,偏好設定是在 /data/data/com.marakana.yamba2/shared_prefs/ 中。事實上,如果讀者在Eclipse中開啟 DDMS檢視並選取 File Explorer,將可以導覽這個分割。讀者有可能在這裡看到 com.marakana.yamba2_preference.xml 檔。讀者可以抓取此檔案並檢查它,或可以使用 adb shell。

Page 17: 第七章 偏好設定、檔案系統、 選項選單和意圖epaper.gotop.com.tw/pdf/A293.pdf · 偏好設定、檔案系統、選項選單和意圖│ 85 圖7-1:New Android XML

偏好設定、檔案系統、選項選單和意圖│ 99

adb shell 是另一個可存取讀者裝置之殼層(實體或虛擬)的常見 adb 子命令。舉例來說,

讀者可開啟命令列終端並輸入:

此 XML 檔案代表此應用程式所有偏好設定資料的存放區。如讀者所見,我們的使用者名稱、密碼和 API根目錄全都存放在此。

檔案系統安全性 那這樣有多安全?這是個安全人員常會提出的問題。以明文儲存使用者名稱和密碼總是會

讓人有點擔心。

要回答此問題,筆者通常是將它比成在街上發現某人的筆記型電腦。雖然我們可以輕易地

透過 adb 工具來獲得「硬碟」的存取權,但不表示我們能讀取它的資料。每個 /data/data/

底下的資料夾都屬於由 Linux 管理的獨立使用者帳號。除非我們的應用程式就是該應用程式,不然它也是沒有該資料夾的存取權。所以除非我們在實體裝置上一個位元組一個位元

組地讀取,不然的話即使明文資料也是安全的。

在 Emulator上,我們有 root權限,這表示我們可以探索整個檔案系統。這在開發上很有用。

總結 目前使用者可以指定此微型部落格網站的其使用者名稱和密碼。和以硬式編碼此資訊的前

一版本相比,這可讓此應用程式被更多人使用。

圖 7-6顯示了我們目前在圖 5-4中列出之設計部分上所完成的工作。

Page 18: 第七章 偏好設定、檔案系統、 選項選單和意圖epaper.gotop.com.tw/pdf/A293.pdf · 偏好設定、檔案系統、選項選單和意圖│ 85 圖7-1:New Android XML

100│第七章

圖 7-6:完成後的 Yamba

狀態活動

Yamba應用程式 context

Twitter服務

偏好設定活動

公告狀態更新

has-ahas-a 共用偏好 設定