編輯:關於Android編程
當應用安裝到Android後,系統會根據每個應用的包名創建一個/data/data/包名/的文件夾,訪問自己包名下的目錄是不需要權限的,並且Android已經提供了非常簡便的API可以直接去訪問該文件夾。
下面以一個案例來演示data目錄的使用。
一、需求
如圖1-5 所示,在用戶將CheckBox選中的前提下點擊登錄,就將用戶名和密碼保存在data文件夾中,在用戶不勾選CheckBox的前提下點擊登錄,就不保存用戶名和密碼,同時刪除data文件中的歷史數據。
如果數據已經保存到了data目錄中,那麼下次用戶重新啟動該界面的時候要求可以將用戶名和密碼回顯到界面。
二、編寫布局
【文件1-4】 activity_main.xml
1.三、編寫代碼6. 7. 13. 20. 24. 31.
1. package com.itheima.android.save.data; 2. 3. import java.io.BufferedReader; 4. import java.io.File; 5. import java.io.FileInputStream; 6. import java.io.FileOutputStream; 7. import java.io.InputStreamReader; 8. import android.os.Bundle; 9. import android.app.Activity; 10. import android.text.TextUtils; 11. import android.view.View; 12. import android.widget.CheckBox; 13. import android.widget.EditText; 14. import android.widget.Toast; 15. /** 16. * 17. * @author wzy 2015-10-23 18. * 將用戶名和密碼保存到data目錄 19. * 20. */ 21. public class MainActivity extends Activity { 22. 23. private EditText et_name; 24. private EditText et_pwd; 25. private CheckBox cb; 26. 27. @Override 28. protected void onCreate (Bundle savedInstanceState){ 29. super.onCreate(savedInstanceState); 30. setContentView(R.layout.activity_main); 31. //獲取控件對象 32. et_name = (EditText) findViewById(R.id.et_name); 33. et_pwd = (EditText) findViewById(R.id.et_pwd); 34. cb = (CheckBox) findViewById(R.id.cb); 35. /* 36. * 數據的回顯 37. * getFilesDir()方法是父類提供的方法可以直接訪問data/data/包名/files目錄 38. */ 39. File file = new File(getFilesDir(), "info.txt"); 40. //如果文件存在則回顯數據 41. if (file.exists()) { 42. try { 43. /* 44. * openFileInput(String)是父類提供的方法, 45. * 可以直接獲取data目錄下指定文件的的輸入流 46. */ 47. FileInputStream fis = openFileInput("info.txt"); 48. //將文件輸入流轉化為緩存流 49. BufferedReader bf = new BufferedReader(new InputStreamReader(fis)); 50. //因為保存時數據只有一行,因此讀取一次就可以 51. String readLine = bf.readLine(); 52. bf.close(); 53. /* 54. * 數據是用戶名##密碼的形式存儲的, 55. * 因此需要根據##對字符串進行切割 56. */ 57. String[] split = readLine.split("##"); 58. //給EditText控件設置數據 59. et_name.setText(split[0]); 60. et_pwd.setText(split[1]); 61. //讓CheckBox變為勾選狀態,默認不勾選 62. cb.setChecked(true); 63. } catch (Exception e) { 64. e.printStackTrace(); 65. } 66. } 67. } 68. 69. /* 70. * 給登錄按鈕綁定的點擊事件 71. */ 72. public void login(View view) { 73. //從EditText中獲取數據 74. String name = et_name.getEditableText().toString().trim(); 75. String pwd = et_pwd.getText().toString().trim(); 76. //校驗數據 77. if (TextUtils.isEmpty(name)||TextUtils.isEmpty(pwd)) { 78. /* 79. * 這裡使用到了makeText的方法的重載形式,第二個參數是int類型, 80. * 其對應values/strings.xml資源文件中的字符串常量 81. */ 82. Toast.makeText(this, R.string.info_txt, Toast.LENGTH_SHORT).show(); 83. return; 84. } 85. //獲取CheckBox的選中狀態 86. boolean checked = cb.isChecked(); 87. //保存數據 name##pwd 88. File file = new File(getFilesDir(), "info.txt"); 89. if (checked) { 90. try { 91. /* 92. * openFileOutput()方法是父類提供的直接打開data目中中指定文件的輸出流, 93. * 輸出地址:/data/data/包名/files/info.txt 94. */ 95. FileOutputStream fos = openFileOutput("info.txt", MODE_PRIVATE); 96. fos.write((name+"##"+pwd).getBytes()); 97. fos.close(); 98. 99. } catch (Exception e) { 100. e.printStackTrace(); 101. } 102. }else { 103. //如果用戶沒有勾選CheckBox則刪除歷史文件 104. if (file.exists()) { 105. boolean delete = file.delete(); 106. if (delete) { 107. Toast.makeText(this, "刪除成功", Toast.LENGTH_SHORT).show(); 108. }else { 109. Toast.makeText(this, "刪除失敗", Toast.LENGTH_SHORT).show(); 110. } 111. 112. }else { 113. Toast.makeText(this, "該文件不存在, 114. 不用刪除", Toast.LENGTH_SHORT).show(); 115. } 116. } 117. } 118. } 119.
注意:
上面使用到了如下方法,這些方法都是在ContextWrapper類中定義的,是Activity的父類,因此可以直接使用。
getFilesDir():直接獲取 /data/data/包名/files文件
openFileInput("info.txt"):直接打開/data/data/包名/files/info.txt文件
openFileOutput("info.txt",MODE_PRIVATE):直接創建 /data/data/包名/files/info.txt文件
在開發過程中凡是涉及到data目錄操作的,很少自己去創建輸入流和輸出流,而應該盡量去使用Google已經提供的方法。
openFileOutput("info.txt",MODE_PRIVATE)方法的第二個參數是設置文件的權限,這裡使用了私有常量值,也就是只能當前應用訪問該文件。關於文件權限的詳細介紹請看1.3.3節。
1.3.3 文件的權限Android是基於Linux的操作系統,因此Android的文件權限其實就是Linux的文件權限。
在Linux中一個文件一共有三個組別:用戶、群組、其它。其中每個組包含三種權限:讀r、寫w、執行x ,也就是說一個文件共有9個權限屬性(如圖1-6所示)。
圖1-6中的第一個屬性代表文件類型,不屬於權限范疇。剩下的9位從左往右1到3位是[用戶],4到6位是[群組],7到9位是[其它]。
舉例:通過DDMS的File Explorer查看文件信息(如圖1-7),可以看到某個文件的權限為:-rwxrw-r--
他的意思就是[用戶]對其享有讀寫執行的權限,[群組]享有讀寫權限,[其它]享有讀權限。
碎片 碎片可看作另外一種形式的活動,可以創建碎片來包含視圖。 碎片總是嵌入在活動中,一般有兩種常見形式: 1、碎片A和碎片B分別處於不同的活動中
窗口管理系統是Android中的主要子系統之一,它涉及到App中組件的管理,系統和應用窗口的管理和繪制等工作。由於其涉及模塊眾多,且與用戶體驗密切相關,所以它也是Andr
今天的幾個目標:1. 自定義ActionProvider2. Toolbar ActionBar自定義Menu3. Toolbar ActionBar 右側Menu添加角
APP的測試重點小部分在APP本身,大部分還是在網絡通信上(單機版除外)。所以在安卓APP測試過程中,網絡抓包非常重要,一般來說,app開發會采用HTTP協議、Webso