首先數據分爲兩種:和應用相關的數據;和應用無關的數據。這裏分別介紹: html
應用無關的數據是那些用戶比較關心的數據,無論您的應用在不在用戶設備上,這些數據用戶都但願保留,這些數據包含:用相機拍攝的照片、用瀏覽器(下載工具)下載的文件、用戶製做的個性鈴聲等。
假設您開發了一個照相應用(例如: 360相機),用戶用您的應用拍攝並處理過的照片就屬於應用無關的數據,若是用戶把您的應用給卸載了,用戶仍是會指望仍然保留他們拍攝並處理過的照片。這裏的照片按照Android官方的建議應該保存到 DIRECTORY_PICTURES 目錄中,該目錄經過Environment.getExternalStoragePublicDirectory(String type)來獲取,您能夠在該目錄下建立一個以您的程序命名的目錄來保存數據。其餘支持的目錄列表請參考這裏。
應用相關的數據: 這種數據只和您的應用相關,若是您的應用被用戶刪除了這些數據也沒有理由還存在用戶設備中。這種數據包含:數據庫文件、屬性配置文件、應用的緩存文件等。這種數據能夠有不少種保存方式,詳情參考這裏。 android
這裏咱們只討論在API 8(Android 2.2)中新引入了一種保存到外部存儲空間的僞私有數據API,經過函數getExternalFilesDir() 來獲取該路徑,一樣能夠設置獲取各類類型數據的參數,例如 DIRECTORY_MUSIC 和 DIRECTORY_RINGTONES (若是參數爲null則返回您應用數據的跟目錄)。好比一個應用的包名爲 org.goodev.test 的應用,經過函數getExternalFilesDir(Environment.DIRECTORY_MOVIES)獲取到的文件路徑爲 /storage/sdcard0/Android/data/org.goodev.test/files/Movies。 數據庫
細心的讀者已經發現,該數據目錄爲SDCard (外部存儲設備,有多是內置SDCard 好比 Nexus S) 中名字爲 Android 的根目錄下,該目錄下有個用來保存應用數據的 data 目錄,在這個 data 目錄中保存了設備中各個應用的數據,依包名來命名,若是設置參數爲null則返回的是跟目錄:/storage/sdcard0/Android/data/org.goodev.test/files。 瀏覽器
爲啥這個目錄咱們稱之爲僞私有數據目錄呢? 由於在2.2以上的系統中,當您的應用被用戶卸載的時候,保存在這個目錄下的數據也會被系統刪除;而且在默認狀況下多媒體掃描器不會掃描該目錄下的圖片、MP3等多媒體文件– 從這個角度看這個目錄是應用的私有數據目錄。 因爲該目錄存在於外部存儲空間中,任何其餘具備讀寫外部存儲空間權限的應用均可以訪問您的應用數據 — 從這個角度看這些數據又不是私有的。 因此咱們就稱之爲 僞私有數據。 緩存
那麼爲何Android在2.2中引入這種僞私有數據保存方式呢? 這樣應用的數據不是很不安全嗎? 這種存儲方式適合保存那些數據呢? 下面咱們來逐個分析下這些問題: 安全
爲什麼引入這種存儲方式?
有些Android應用在使用過程當中,可能會產生不少須要保存的文件數據,而這些數據須要在應用卸載的時候被刪除掉,按照2.2以前的方式,這種需求的數據只能保存到內部存儲空間中,而系統的內部存儲空間都是有限的,爲了讓用戶能在有限的存儲空間中安裝更多的應用,因此出現了這種存儲方式。我的觀點僅供參考 \(^o^)/~。 app
存儲在僞私有目錄的數據是否是很不安全?
固然是不安全的,任何應用都有可能訪問這些數據,因此通常而言這裏只保存那些不是很是敏感的數據,因爲這些目錄中的數據有可能被用戶或者其餘應用刪除掉,因此在使用這裏面的數據的時候要先檢測下數據是否存在、有效,若是無效則須要重新下載使用。 ide
這種存儲方式適合那些數據呢?
好比一個圖片瀏覽類的應用,用該目錄來保存系統圖片的縮略圖方便提升應用瀏覽圖片的流暢度;或者圖書類應用用來保存圖書的封面圖片等。 函數
若是您的應用運行在舊的設備(低於2.2的版本)上,則您也應該按照上面的建議把文件保存到 /Android/data//files/ 目錄下,這樣若是用戶更新的設備版本後,這些數據就隨着應用的卸載而被刪除掉了。 工具
遺留問題
固然也有一些比較有爭議的數據,好比 IM聊天軟件接收到的圖片和自定義表情數據 應該保存到SDCard中呢仍是上面介紹的 僞私有數據 存儲目錄中呢? 若是用戶卸載了聊天軟件,用戶是否指望繼續保存他們接收到的圖片和自定義表情圖片呢? 這個問題恐怕針對不一樣的用戶獲得的答案是不同的。這時,咱們咋辦??
我的建議針對這種沒有明確界限的需求,能夠在用戶第一次使用程序的時候,引導用戶去設置他們的這些數據保存到哪裏?保存到外部存儲空間(應用卸載後數據依然存在);或者保存到應用外部存儲目錄中(應用卸載後數據自動刪除)。 這種作法相似下載一些PC軟件的作法,好比一些軟件在卸載的時候會填出對話框讓用戶選擇是否保留用戶數據。只不過在Android系統中卸載應用目前沒辦提供該功能,因此只能在應用第一次使用的時候 讓用戶知道有這麼個設置項。
PS:筆者目前最反感的就是一些應用下載了不少小圖片到SDCard中,而後打開圖庫應用會發現裏面有不少這種小圖片(好比人的頭像啦、物品縮略圖啦、圖書封面圖片啦),這種數據就不該該出如今用戶的圖庫應用中去。 若是把這些數據保存到上述的僞私有數據目錄中則 就不會出現這種問題。 目前爲了不這種問題,筆者不得不本身在各類目錄中建立「.nomedia」文件。至關繁瑣啦!