使用SharedPreferences(保存用戶偏好參數)保存數據, 當我們的應用想要保存用戶的一些偏好參數,比如是否自動登陸,是否記住賬號密碼,是否在Wifi下才能 聯網等相關信息,如果使用資料庫的話,顯得有點大材小用了!我們把上面這些配置信息稱為用戶的偏好 設置,就是用戶偏好的設置,而這些配置信 ...
使用SharedPreferences(保存用戶偏好參數)保存數據, 當我們的應用想要保存用戶的一些偏好參數,比如是否自動登陸,是否記住賬號密碼,是否在Wifi下才能 聯網等相關信息,如果使用資料庫的話,顯得有點大材小用了!我們把上面這些配置信息稱為用戶的偏好 設置,就是用戶偏好的設置,而這些配置信息通常是保存在特定的文件中!比如windows使用ini文件, 而J2SE中使用properties屬性文件與xml文件來保存軟體的配置信息;而在Android中我們通常使用 一個輕量級的存儲類——SharedPreferences來保存用戶偏好的參數!SharedPreferences也是使用xml文件, 然後類似於Map集合,使用鍵-值的形式來存儲數據;我們只需要調用SharedPreferences的getXxx(name), 就可以根據鍵獲得對應的值!使用起來很方便!
SharedPreferences是一種輕型的Android數據存儲方式,它的本質是基於XML文件存儲key-value鍵值對數據,通常用來存儲一些簡單的配置信息。其存儲位置在/data/data/<包名>/shared_prefs目錄下。SharedPreferences對象本身只能獲取數據而不支持存儲和修改,存儲修改是通過Editor對象實現。比較經典的使用方式例如用戶輸入框對過往登錄賬戶的存儲。實現SharedPreferences存儲的步驟如下:
1、根據Context獲取SharedPreferences對象
2、利用edit()方法獲取Editor對象。
3、通過Editor對象存儲key-value鍵值對數據。
4、通過apply()方法提交數據。
版權聲明:本文為博主原創文章,轉載請附上原文出處鏈接和本聲明。2019-08-28,17:41:40。
作者By-----溺心與沉浮----博客園
SharedPreferences的使用
SharedPreferences對象本身只能獲取數據而不支持存儲和修改,存儲修改是通過SharedPreferences.edit()獲取的內部介面Editor對象實現。使用Preference來存取數據,用到了SharedPreferences介面和SharedPreferences的一個內部介面SharedPreferences.Editor,這兩個介面在android.content包中;1 1)寫入數據: 2 //步驟1:創建一個SharedPreferences對象 3 SharedPreferences sharedPreferences= getSharedPreferences("data",Context.MODE_PRIVATE); 4 //步驟2: 實例化SharedPreferences.Editor對象 5 SharedPreferences.Editor editor = sharedPreferences.edit(); 6 //步驟3:將獲取過來的值放入文件 7 editor.putString("name", “Tom”); 8 editor.putInt("age", 28); 9 editor.putBoolean("marrid",false); 10 //步驟4:提交 11 editor.commit();(apply()) 12 13 2)讀取數據: 14 SharedPreferences sharedPreferences= getSharedPreferences("data", Context .MODE_PRIVATE); 15 String userId=sharedPreferences.getString("name",""); 16 17 3)刪除指定數據 18 editor.remove("name"); 19 editor.commit(); 20 21 4)清空數據 22 editor.clear(); 23 editor.commit();(apply())
版權聲明:本文為博主原創文章,轉載請附上原文出處鏈接和本聲明。2019-08-28,17:41:40。
作者By-----溺心與沉浮----博客園
註意:如果在 Fragment 中使用SharedPreferences 時,需要放在onAttach(Activity activity)裡面進行SharedPreferences的初始化,否則會報空指針 即 getActivity()會可能返回null !
讀寫其他應用的SharedPreferences 步驟如下(未實踐):
1. 在創建SharedPreferences時,指定MODE_WORLD_READABLE模式,表明該SharedPreferences數據可以被其他程式讀取;
2. 創建其他應用程式對應的Context;
3. 使用其他程式的Context獲取對應的SharedPreferences;
4. 如果是寫入數據,使用Editor介面即可,所有其他操作均和前面一致;
1 * SharedPreferences數據的四種操作模式:
2 * 一、Context.MODE_PRIVATE
3 * 二、Context.MODE_APPEND
4 * 三、Context.MODE_WORLD_READABLE
5 * 四、Context.MODE_WORLD_WRITEABLE
6 *
7 * Context.MODE_PRIVATE:為預設操作模式,代表該文件是私有數據,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原文件的內容
8 * Context.MODE_APPEND:模式會檢查文件是否存在,存在就往文件追加內容,否則就創建新文件.
9 * Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用來控制其他應用是否有許可權讀寫該文件.
10 *
11 * MODE_WORLD_READABLE:表示當前文件可以被其他應用讀取.
12 * MODE_WORLD_WRITEABLE:表示當前文件可以被其他應用寫入
13 *
14 * 特別註意:出於安全性的考慮,MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 在Android 4.2版本中已經被棄用
1 try {
2 //這裡的com.example.mpreferences 就是應用的包名
3 Context mcontext = createPackageContext("com.example.mpreferences", CONTEXT_IGNORE_SECURITY);
4
5 SharedPreferences msharedpreferences = mcontext.getSharedPreferences("name_preference", MODE_PRIVATE);
6 int count = msharedpreferences.getInt("count", 0);
7
8 } catch (PackageManager.NameNotFoundException e) {
9 e.printStackTrace();
10 }
新建一個安卓項目,在res,layout,activity_main.xml添加代碼
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="用戶登錄"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="請輸入用戶名"/>
<EditText
android:id="@+id/editUserName"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="用戶名"/>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:text="請輸入密碼"/>
<EditText
android:id="@+id/editUserPassword"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:hint="密碼"/>
<Button
android:id="@+id/button_login"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="登陸"/>
</LinearLayout>
效果如下:
簡單的SharedPreferences工具類編寫SharedPreferences.java
1 package com.Reverse-xiaoyu.sharedpreferencesutillty;
2
3 import android.content.Context;
4 import android.content.SharedPreferences;
5 import android.widget.Toast;
6
7 import java.util.HashMap;
8 import java.util.Map;
9
10 public class SharedHelp {
11 private Context context;
12
13 public SharedHelp(){
14
15 }
16
17 public SharedHelp(Context context){
18 this.context = context;
19 }
20
21 public void save(String userName, String passWord){
22 SharedPreferences sp = context.getSharedPreferences("MyMap", Context.MODE_PRIVATE);
23 SharedPreferences.Editor editor = sp.edit();
24 editor.putString("userName", userName);
25 editor.putString("passWord", passWord);
26 editor.apply();
27 Toast.makeText(context, "信息已寫入SharedPreferences中", Toast.LENGTH_SHORT).show();
28 }
29
30 public Map<String, String> read(){
31 Map<String, String> data = new HashMap<String, String>();
32 SharedPreferences sp = context.getSharedPreferences("MyMap", Context.MODE_PRIVATE);
33 data.put("userName", sp.getString("userName", ""));
34 data.put("passWord", sp.getString("passWord", ""));
35 return data;
36 }
37 }
在MainActivity中實現邏輯
1 package com.Reverse-xiaoyu.sharedpreferencesutillty; 2 3 import androidx.appcompat.app.AppCompatActivity; 4 5 import android.content.Context; 6 import android.os.Bundle; 7 import android.view.View; 8 import android.widget.Button; 9 import android.widget.EditText; 10 11 import java.util.Map; 12 13 public class MainActivity extends AppCompatActivity { 14 //實例化layout中EditText的editUserNmae 15 private EditText editUserName; 16 //實例化layout中EditText的editUserPassword 17 private EditText editUserPassword; 18 //實例化layout中Button的button_login 19 private Button button_login; 20 //定義上下文 21 private Context context; 22 //定義ShareHelp類的對象 23 private SharedHelp sharedHelp; 24 //定義兩個字元串名 25 private String strName; 26 private String strPassword; 27 28 @Override 29 protected void onCreate(Bundle savedInstanceState) { 30 super.onCreate(savedInstanceState); 31 setContentView(R.layout.activity_main); 32 //獲取上下文 33 context = getApplicationContext(); 34 sharedHelp = new SharedHelp(); 35 bindViews(); 36 } 37 38 private void bindViews(){ 39 //實例化的變數綁定相應的ID 40 editUserName = findViewById(R.id.editUserName); 41 editUserPassword = findViewById(R.id.editUserPassword); 42 button_login = findViewById(R.id.button_login); 43 //為按鈕設置監聽事件 44 button_login.setOnClickListener(new View.OnClickListener() { 45 @Override 46 public void onClick(View view) { 47 //當按鈕被按下觸發時,從控制項中getText()並將其轉換成字元串 48 strName = editUserName.getText().toString(); 49 strPassword = editUserPassword.getText().toString(); 50 //通過SharedHelp類中save方法,將其保存 51 sharedHelp.save(strName, strPassword); 52 } 53 }); 54 } 55 56 @Override 57 protected void onStart() { 58 super.onStart(); 59 //定義一個Map<String, String>類型的變數data用來接收shareHelp.read()方法的返回值 60 Map<String, String> data = sharedHelp.read(); 61 //將獲取到的數據放置到兩個EditText中 62 editUserName.setText(data.get("userName")); 63 editUserPassword.setText(data.get("passWord")); 64 } 65 }
本人十分不建議代碼在主程式入口處寫,建議另起文件寫,方便交流,就在MainActivity中寫了
版權聲明:本文為博主原創文章,轉載請附上原文出處鏈接和本聲明。2019-08-28,17:41:40。
作者By-----溺心與沉浮----博客園
最後再寫一個SharedPreferences的工具集類
SharedPreferencesUtillty.java
1 package com.Reverse-xiaoyu.sharedpreferencesutillty;
2
3 import android.content.Context;
4 import android.content.SharedPreferences;
5
6 import java.util.Map;
7
8 public class SharedPreferenceUtillty {
9 //保存的SP文件名
10 public static final String FILE_NAME = "MyMap";
11
12 /**
13 * SharedPreferences數據的四種操作模式:
14 * 一、Context.MODE_PRIVATE
15 * 二、Context.MODE_APPEND
16 * 三、Context.MODE_WORLD_READABLE
17 * 四、Context.MODE_WORLD_WRITEABLE
18 *
19 * Context.MODE_PRIVATE:為預設操作模式,代表該文件是私有數據,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原文件的內容
20 * Context.MODE_APPEND:模式會檢查文件是否存在,存在就往文件追加內容,否則就創建新文件.
21 * Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用來控制其他應用是否有許可權讀寫該文件.
22 *
23 * MODE_WORLD_READABLE:表示當前文件可以被其他應用讀取.
24 * MODE_WORLD_WRITEABLE:表示當前文件可以被其他應用寫入
25 *
26 * 特別註意:出於安全性的考慮,MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 在Android 4.2版本中已經被棄用
27 */
28
29 /**
30 * 保存數據
31 */
32 public static void putData(Context context, String key, Object object){
33 //實例化SharedPreferences對象(第一步)
34 SharedPreferences sp = context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE);
35 //實例化SharedPreferences.Editor對象(第二步)
36 SharedPreferences.Editor editor = sp.edit();
37 //用putObject的方法保存數據,取決於第三個參數你使用的什麼類型的變數
38 if (object instanceof Boolean){
39 editor.putBoolean(key, (Boolean) object);
40 }else if (object instanceof Float){
41 editor.putFloat(key, (Float) object);
42 }else if (object instanceof Integer){
43 editor.putInt(key, (Integer) object);
44 }else if (object instanceof Long){
45 editor.putLong(key, (Long) object);
46 }else if (object instanceof String){
47 editor.putString(key, (String) object);
48 }
49 editor.apply();
50 }
51
52 /**
53 * 獲取指定數據
54 */
55 public static Object getData(Context context, String key, Object object){
56 //實例化SharedPreferences對象(第一步)
57 SharedPreferences sp = context.getSharedPreferences(FILE_NAME, context.MODE_PRIVATE);
58 //用getObject的方法保存數據,取決於第三個參數你使用的什麼類型的變數(第二步)
59 if (object instanceof Boolean){
60 return sp.getBoolean(key, (Boolean) object);
61 }else if (object instanceof Float){
62 return sp.getFloat(key, (Float) object);
63 }else if (object instanceof Integer){
64 return sp.getInt(key, (Integer) object);
65 }else if (object instanceof Long){
66 return sp.getLong(key, (Long) object);
67 }else if (object instanceof String){
68 return sp.getString(key, (String) object);
69 }
70 return null;
71 }
72
73 /**
74 * 返回所有的鍵值對
75 */
76 public static Map<String, ?> getAll(Context context){
77 SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
78 Map<String, ?> map = sp.getAll();
79 return map;
80 }
81
82 /**
83 * 檢查對應的數據是否存在
84 */
85 public static boolean contains(Context context, String key){
86 SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
87 return sp.contains(key);
88 }
89
90 /**
91 * 刪除指定key值的數據
92 */
93 public static void remove(Context context, String key){
94 SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
95 SharedPreferences.Editor editor = sp.edit();
96 editor.remove(key);
97 editor.apply();
98 }
99
100 /**
101 * 刪除所有的數據
102 */
103 public static void clear(Context context, String key){
104 SharedPreferences sp = context.getSharedPreferences(FILE_NAME, Context.MODE_PRIVATE);
105 SharedPreferences.Editor editor = sp.edit();
106 editor.clear();
107 editor.apply();
108 }
109
110 }
版權聲明:本文為博主原創文章,轉載請附上原文出處鏈接和本聲明。2019-08-28,17:41:40。
作者By-----溺心與沉浮----博客園