一、概述及運行結果
注冊:輸入用戶名、密碼,驗證用戶名是否已存在,若存在提示 ” 用戶名已存在 “,若不存在將用戶名密碼存儲到 內部存儲的 SharedPrederences 中,並重新登錄。
登錄:1. 檢查用戶名密碼是否正確,若不正確提示 ” 用戶名密碼不正確 ” ,若正確則跳轉至其他界面,並銷毀登錄界面。2. 檢查復選框是否勾選,並改變 SharedPrederences 中復選框的狀態值。
初始登錄界面:用戶名會顯示為上次登錄的用戶名,若上次復選框勾選,密碼自動填充且復選框狀態設置為已勾選。
二、代碼實現
1. 登錄注冊界面
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:layout_marginTop="200dp"> <TextView android:text="賬號:" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:textSize="20dp" android:layout_marginLeft="70dp"/> <EditText android:id="@+id/editText_account" android:layout_width="200sp" android:layout_height="wrap_content"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal"> <TextView android:text="密碼:" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:textSize="20dp" android:layout_marginLeft="70dp"/> <EditText android:id="@+id/editText_password" android:inputType="textPassword" android:layout_width="200sp" android:layout_height="wrap_content"/> </LinearLayout> <CheckBox android:id="@+id/checkBox_remember_password" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="記住密碼" android:layout_marginLeft="70dp"/> <Button android:id="@+id/button_login" android:layout_width="150sp" android:layout_height="wrap_content" android:text="登陸" android:layout_gravity="center" android:layout_marginTop="20dp"/> <Button android:id="@+id/button_register" android:layout_width="150sp" android:layout_height="wrap_content" android:text="注冊" android:layout_gravity="center" android:layout_marginTop="10dp"/> </LinearLayout>
2. onCreate 方法,同時也是在設置初始登錄界面
//控件 private EditText accountEditText ; private EditText passwordEditText; private CheckBox rememberPassCheckBox; private Button loginButton; private Button registerButton; // SharedPreferences 的文件名 final String LOGIN_SHAREDPREFERENCES_NAME = "LoginInfo";
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_login); // 獲取控件 initComponent(); // 獲取上一次登錄的人,將數據顯示在 accountEditText 中 accountEditText.setText(getLastLoginAccount()); //如果上次勾選了復選框,則同時將密碼進行顯示 if(getIsRemenberPassword()){ passwordEditText.setText(getPassword(accountEditText.getText().toString())); rememberPassCheckBox.setChecked(getIsRemenberPassword()); } // 添加監聽 loginButton.setOnClickListener(this); registerButton.setOnClickListener(this); } /** * 獲取控件 */ private void initComponent(){ accountEditText = (EditText)findViewById(R.id.editText_account); passwordEditText = (EditText)findViewById(R.id.editText_password); rememberPassCheckBox = (CheckBox)findViewById(R.id.checkBox_remember_password); loginButton = (Button)findViewById(R.id.button_login); registerButton = (Button)findViewById(R.id.button_register); }
3. 給按鈕添加監聽,同時也是在設置登錄注冊流程(Activity 記得 實現 View.onClickListener 接口)
@Override public void onClick(View view) { int btnId = view.getId(); if(btnId == R.id.button_login){ // 檢查是否成功 // 獲取用戶名密碼 String account = accountEditText.getText().toString(); String password = passwordEditText.getText().toString(); // 檢驗是否登錄成功 boolean isLoginSucceed = checkPassword(account,password); // 根據復選框是否被選擇,改變IsRemenberPassword setIsRemenberPassword(rememberPassCheckBox.isChecked()); // 根據登錄結果做出反應 loginResultAction(isLoginSucceed,account); }else if(btnId == R.id.button_register){ // 獲取用戶名密碼 String account = accountEditText.getText().toString(); String password = passwordEditText.getText().toString(); // 獲取 account 對應的密碼,若為 "" 則說明之前沒有該用戶名 String realPassword = getPassword(account); if(realPassword.length() != 0){ Toast.makeText(this,"用戶名已存在",Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this,"注冊成功,請重新登錄",Toast.LENGTH_SHORT).show(); // 將用戶名密碼存進內存 writeAccountPassword(account,password); // 注冊成功后設置上一次登錄用戶為注冊用戶,並將密碼框設置為 空 setLastLoginAccount(account); passwordEditText.setText(""); // 根據復選框是否被選擇,改變IsRemenberPassword setIsRemenberPassword(rememberPassCheckBox.isChecked()); } } }
4. 對 SharedPreferences 的讀寫操作,也是上面方法中使用到的成員方法
/** * 得到上一次登錄的人,若上一次沒有人登錄,返回 "" * @return */ private String getLastLoginAccount(){ // 獲取 SharedPreferences 對象 SharedPreferences shared = getSharedPreferences(LOGIN_SHAREDPREFERENCES_NAME,MODE_PRIVATE); // 從 SharedPreferences 中讀取數據 return shared.getString("last_login_account",""); } /** * 設置上一次登錄的人 * @param account */ private void setLastLoginAccount(String account){ // 獲取 SharedPreferences 對象 SharedPreferences shared = getSharedPreferences(LOGIN_SHAREDPREFERENCES_NAME,MODE_PRIVATE); // 獲取 SharedPreferences.Editor 對象 SharedPreferences.Editor editor = shared.edit(); // 操作 editor.putString("last_login_account",account); // 提交 editor.apply(); }
/** * 得到上一次復選框是否勾選 * @return */ private boolean getIsRemenberPassword(){ // 獲取 SharedPreferences 對象 SharedPreferences shared = getSharedPreferences(LOGIN_SHAREDPREFERENCES_NAME,MODE_PRIVATE); // 從 SharedPreferences 中讀取數據 return shared.getBoolean("isRememberPassword",false); } /** * 設置上一次復選框是否勾選 * @param isRemenberPassword */ private void setIsRemenberPassword(boolean isRemenberPassword){ // 獲取 SharedPreferences 對象 SharedPreferences shared = getSharedPreferences(LOGIN_SHAREDPREFERENCES_NAME,MODE_PRIVATE); // 獲取 SharedPreferences.Editor 對象 SharedPreferences.Editor editor = shared.edit(); // 操作 editor.putBoolean("isRememberPassword",isRemenberPassword); // 提交 editor.apply(); }
/** * 根據 account 從 內存中獲取密碼,若沒有該用戶,返回 "" */ private String getPassword(String account){ // 從內部存儲中獲取 account 的密碼 // 獲取 SharedPreferences 對象 SharedPreferences shared = getSharedPreferences(LOGIN_SHAREDPREFERENCES_NAME,MODE_PRIVATE); // 從 SharedPreferences 中讀取數據 return shared.getString(account,""); } /** * 將用戶名密碼寫入內存中 */ private void writeAccountPassword(String accout,String password){ SharedPreferences shared = getSharedPreferences(LOGIN_SHAREDPREFERENCES_NAME,MODE_PRIVATE); SharedPreferences.Editor editor = shared.edit(); editor.putString(accout,password); editor.apply(); }
/** * 驗證輸入的用戶名密碼是否錯誤 */ private boolean checkPassword(String account,String password){ String realPassword = getPassword(account); // 對比密碼 if (realPassword.length() != 0 && realPassword.equals(password)) { return true; } return false; }
/** * 根據登錄/注冊是否成功,做出相應操作 */ private void loginResultAction(boolean isLoginSucceed,String account){ if(isLoginSucceed){ setLastLoginAccount(account); Intent intent = new Intent(LoginActivity.this,ControlActivity.class); startActivity(intent); this.finish(); }else{ Toast.makeText(this,"用戶名或密碼錯誤",Toast.LENGTH_SHORT).show(); } }
三、SharedPreferences 存儲基礎知識
1. SharedPreferences 是一個輕量級的存儲類,特別適合保存配置信息(例如是否記住密碼,是否自動啟動,用戶特定信息等)
2. SharedPreferences 使用 key-value 的方式存儲數據。根據 key 值獲取 value 值
3. SharedPreferences 支持多種不同數據類型的存儲,可以是 String,int,boolean 等,以下幾種,不支持自定義類型。
4. SharedPreferences 以 xml 文件存儲數據,默認放在 內部存儲中,文件放在
/data/data/<package name>/shared_prefs

四、使用 SharedPreferences
1. 獲取 SharedPreferences 對象
1. Context.getSharedPreferences(arg0,arg1); arg0 : 指定 SharedPreferences 文件的名稱,如果不存在會自動創建。 arg1 : 指定操作模式,只要為 MODE_PRIVATE(默認模式)和 MODE_MULTI_PROCESS(多進程讀寫) 2. Activity 類中的 getPreferences(arg0); arg0 : 操作模式參數 這個方法會自動將當前活動的類名作為 SharedPreferences 的文件名 3. PreferenceManager 類中的 getDefaultSharedPreferences(arg0) 方法 arg0 : Context 參數 靜態方法,自動使用當前應用的包名作為前綴來命名 SharedPreferences 文件。
2. 將數據存儲到 SharedPreferences 中。
使用 SharedPreferences 存儲數據時,獲得 SharedPreferences 對象后,必須獲得該對象的 Editor 對象,通過 Editor 對象的相關方法存儲數據。
1. 獲取 SharedPreferences.Editor 對象
SharedPreferences shared = getSharedPreferences("data",MODE_PRIVATE); SharedPreferences.Editor = shared.edit(); 2. 以鍵值對的方式存儲數據 editor.putString("name","Nane"); editor.putInt("age",12); editor.putBoolean("married",false); 3. 提交數據 editor.commit(); 或 editor.apply();
程序運行以后,在 /data/data/<包名>/shared_prefs/ 目錄下生辰了一個 datalxml 文件,內容如下:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <boolean name="married" value="false" /> <string name="name">Nana</string> <int name="age" value="12" /> </map>
3. 從 SharedPreferences 讀取數據
直接使用 SharedPreferences 對象提供的一系列 get 方法即可,每一種 get 方法對應 Editor 中一種 put 方法。
XXX value = shared.getXXX(arg0,arg1); arg0 : Key 值 arg1 : 該 SharedPreferences 中沒有這個 Key 值時返回的值 XXX 為 value 的數據類型 SharedPreferences shared = getSharedPreferences("data",MODE_PRIVATE); String name = shared.getString("name",""); int age = shared.getInt("age",0); boolean married = shared.getBoolean("married", false);
4. 從 SharedPreferences 中刪除數據
需要或的 SharedPreferences.Editor 對象
1. editor.remove(arg0); arg0 : 要刪除數據的 Key 值 刪除一條數據 2. editor.clear(); 刪除所有數據 3. 記得提修改 editor.apply; SharedPreferences shared = getSharedPreferences("data",MODE_PRIVATE); SharedPreferences.Editor editor = shared.edit();//獲取編輯器 editor.remove("name");刪除一條數據 editor.clear();刪除所有數據 editor.apply();//提交修改