需求:登陸
第1步:搭建UI
采用混合布局,布局搭建好之後如下所示:
第2步:準備工作
根據javaWeb中的mvc+dao的開發模式,建立好包名和類。
第3步:業務邏輯
就是一個存值和取值的過程,也可以說是讀寫檔案的過程。
注意在擷取路徑的時候,不要使用硬性編碼(hardcode)。
關鍵知識點梳理:
▇擷取應用程式的files私有目錄:"/data/data/應用程式包名/files"
方式1:得路徑,再得到流。
File context.getFilesDir()
<-- 補充一下 File context.getCacheDir() 表示得到緩存目錄/caches-->
方式2:直接得到流
檔案讀取流:InputStream in = context.openFileInput("檔案名(帶字尾)");
檔案寫入流:OutputStream out = context.openFileOutput("user.txt", Context.MODE_PRIVATE);//有2個參數,第2個參數
表示檔案的權限。
▇擷取裝置的SD卡目錄:
→1.注意要配置sd的通路權限。
→2.判斷sd卡的狀态。
<code>String storageState = Environment.getExternalStorageState();</code>
<code>if</code><code>(!storageState.equals(Environment.MEDIA_MOUNTED))</code>
<code>{</code>
<code> </code><code>//如果挂起,提示使用者sd卡不存在。</code>
<code> </code><code>Toast.makeText(mainContext, </code><code>"sd卡不存在"</code><code>, Toast.LENGTH_SHORT).show();</code>
<code> </code><code>return</code><code>;</code>
<code>}</code>
→3.判斷sd卡空間容量資訊。
<code>//假如SD卡小于200M就提示記憶體不足</code>
<code>//首先擷取外部存儲的目錄 File對象</code>
<code> </code><code>File file_storage = Environment.getExternalStorageDirectory();</code>
<code>//通過File對象來獲得外部存儲的可用空間</code>
<code> </code><code>Long useable_storage = file_storage.getUsableSpace();</code>
<code> </code><code>//将位元組轉換成易于閱讀的M表示方法</code>
<code> </code><code>String useable_storage_mstr = Formatter.formatFileSize(mainContext,useable_storage);</code>
<code> </code>
<code>//得到外部存儲的總空間</code>
<code> </code><code>Long total_storage = file_storage.getTotalSpace();</code>
<code> </code><code>String total_storage_mstr = Formatter.formatFileSize(mainContext, total_storage);</code>
<code> </code><code>if</code><code>(useable_storage < </code><code>1024</code><code>*</code><code>1024</code><code>*</code><code>200</code><code>)</code>
<code> </code><code>{</code>
<code> </code><code>Toast.makeText(mainContext, </code><code>"外部存儲空間不足,剩餘可用空間為:"</code>
<code> </code><code>+ useable_storage_mstr +</code><code>"M"</code>
<code> </code><code>+ </code><code>",總空間為:"</code> <code>+ total_storage_mstr + </code><code>"M"</code>
<code> </code><code>, Toast.LENGTH_LONG).show();</code>
<code> </code><code>return</code><code>;</code>
<code> </code><code>}</code>
通過linux指令df /sdcard來獲得外部裝置外部存儲的資訊:
▇擷取資産檔案夾Asset目錄下的檔案輸入流:
<code>//擷取上下文的所有資源對象</code>
<code>Resources res = context.getResources();</code>
<code>//從資源對象中擷取資産目錄Asset的管理器AssetManager</code>
<code>AssetManager manager = res.getAssets();</code>
<code>//利用管理器的open方法擷取它的目錄下指定檔案的讀取流</code>
<code>InputStream in = manager.open(</code><code>"user.txt"</code><code>);</code>
▇Preferences:"/data/data/應用程式包名/shared_prefs"
用于存放一些簡單的标記資訊、設定資訊。通過xml檔案在實作儲存和取出。
Preferences存儲檔案流程
<code>//第1步:通過上下文對象得到SharedPreferences對象</code>
<code> </code><code>SharedPreferences user_pref = context.getSharedPreferences(</code><code>"user.txt"</code><code>, Context.MODE_PRIVATE);</code>
<code>//第2步:得到SharedPreferences的Editor對象</code>
<code> </code><code>Editor user_editor = user_pref.edit();</code>
<code>//第3步:通過Editor向SharedPreferences對象裡面設定值,類似map中的鍵和值 。</code>
<code> </code><code>user_editor.putString(</code><code>"username"</code><code>, user.getUsername()); </code>
<code> </code><code>user_editor.putString(</code><code>"password"</code><code>, user.getPassword());</code>
<code>//第4步:送出Editor</code>
<code> </code><code>return</code> <code>user_editor.commit();</code>
Preferences讀取檔案内容
<code> </code><code>SharedPreferences user_share = context.getSharedPreferences(</code><code>"user.txt"</code><code>, Context.MODE_PRIVATE);</code>
<code>//第2步:得到share對象的資料</code>
<code> </code><code>String username = user_share.getString(</code><code>"username"</code><code>, </code><code>"使用者名找不到"</code><code>);</code>
<code> </code><code>String password = user_share.getString(</code><code>"password"</code><code>, </code><code>"密碼找不到"</code><code>); </code>
<code> </code><code>//上面getString方法的第二個參數為找不到指定鍵名的時候傳回的預設值。</code>
通過總結可以發現,上面的這些檔案讀取流,都隻能讀取目前應用程式的私有目錄下的檔案流,有局限性。如果要想跨應用讀取資料,還是得結合一般IO流。
今天還講了XML的解析和序列化,和javaWeb中的xml的解析及序列化十分的相似,隻是擷取解析器和序列器的方式稍有不同,是通過Xml這個類直接擷取的。
Android 開發時如何正确擷取使用擴充存儲路徑
作為一個程式員,想必你也很讨厭App在SD卡根目錄亂建目錄吧,那就從我做起,來遵守Google的這一規定吧。
通過Context.getExternalFilesDir()方法可以擷取到 SDCard/Android/data/{package_name}/files/ ,儲存一些長時間儲存的資料;
通過Context.getExternalCacheDir()方法可以擷取到 SDCard/Android/data/{package_name}/cache/,儲存臨時緩存資料;
這兩個目錄分别對應 設定->應用->應用詳情裡面的”清除資料“與”清除緩存“選項。
本文轉自屠夫章哥 51CTO部落格,原文連結:http://blog.51cto.com/4259297/1674699,如需轉載請自行聯系原作者