Android 登錄注冊-SharedPreferences-記住密碼


一、概述及運行結果

  注冊:輸入用戶名、密碼,驗證用戶名是否已存在,若存在提示 ” 用戶名已存在 “,若不存在將用戶名密碼存儲到 內部存儲的 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
  (通過 AS 右下角的 "Device File Explore " 可以看到連接的真機或模擬器的文件信息。
  

 四、使用 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();//提交修改

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM