有很多的應用都會有保存密碼和賬號的功能,比如QQ。接下來就講講使用SharedPreferences來保存密碼和賬號,也許有些人會考慮的數據庫,但是我個人認爲對於保存簡單的數據,使用的數據庫就大材小用了,SharedPreferences比較輕量級

首先寫好佈局,只有兩個輸入框和一個按鈕

<EditText
        android:id="@+id/number"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:inputType="number" />

<EditText
    android:id="@+id/password"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:inputType="textPassword" />

<Button
    android:id="@+id/save"
    android:text="保存"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />

獲取取控件

private EditText number;
private EditText password;
private Button save;

number = (EditText) findViewById(R.id.number);
password = (EditText) findViewById(R.id.password);
save = (Button) findViewById(R.id.save);

在獲取控件之後,還要獲取SharedPreferences,第一參數爲保存的文件名,第二個爲保存的模型,當文件存在就讀取,如果不存在就創建

private SharedPreferences sp;
//第一參數爲保存的文件名,第二個爲保存的模型,當文件存在就讀取,如果不存在就創建
sp = getSharedPreferences("info",MODE_PRIVATE);

增加按鈕點擊事件,點擊按鈕保存賬號和密碼

save.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        //獲取輸入框的賬號和密碼
        String numberStr = number.getText().toString().trim();
        String passwordStr = password.getText().toString().trim();
        //判斷是否爲空
        if (numberStr.isEmpty() || passwordStr.isEmpty()){
            Toast.makeText(getApplicationContext(),"賬號或密碼不能爲空",Toast.LENGTH_SHORT).show();
        }else {
            //獲取Editor
            SharedPreferences.Editor editor = sp.edit();
            //輸入內容
            editor.putString("number",numberStr);
            editor.putString("password",passwordStr);
            //必須提交纔會生效,也可以使用apply
            editor.commit();
            Toast.makeText(getApplicationContext(),"保存成功",Toast.LENGTH_SHORT).show();
        }
    }
});

當我們保存賬號和密碼後,想要在第二次打開應用時直接寫密碼和賬號,還有在加載頁面時獲取數據

//獲取info文件的內容,第一參數爲保存時的key,第二個是如果獲取不到的默認值
String numberStr1 = sp.getString("number","");
String passwordStr2 = sp.getString("password","");
number.setText(numberStr1);
password.setText(passwordStr2);

效果圖

這個info.xml的文件保存在data/data/包名/shared_prefs/info.xml,可以看到是以XML格式保存的

最後再來理一理整個思路

保存

①通過getSharedPreferences(“文件名”,模式)獲得SharedPreferences

②通過sp.edit()獲取Editor

③使用editor調用putXXX(key,value)保存數據

④使用editor調用apply()或者commit()纔會生效

讀取

①通過getSharedPreferences(“文件名”,模式)獲得SharedPreferences

②通過sp.getXXX(key,defValue)直接可以獲得數據

加密

明文保存好像很不安全,那我們就對密碼簡單加密,下面是加密和解密的方法

    /**
     * 加密方法
     * @param str 要加密的字符串
     * @param key 加密的密匙
     * @return 返回加密後的字符串
     */
    public String encryptionString(String str, int key) {
        char[] chars = str.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            chars[i] = (char) (chars[i] + key);
        }
        return String.valueOf(chars);
    }

    /**
     * 解密方法
     * @param str 要解密的字符串
     * @param key 解密的密匙,跟加密一樣
     * @return 返回解密後的字符串
     */
    public String decodeString(String str, int key) {
        char[] chars = str.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            chars[i] = (char) (chars[i] - key);
        }
        return String.valueOf(chars);
    }

在保存密碼前要對密碼加密

public static final int DECODE_ENCRYPTION_KEY = 64;

String passwordStr = password.getText().toString().trim();
//對密碼進行加密
passwordStr = encryptionString(passwordStr, DECODE_ENCRYPTION_KEY);
editor.putString("password", passwordStr);

顯示密碼前要對密碼解密

public static final int DECODE_ENCRYPTION_KEY = 64;

String passwordStr2 = sp.getString("password", "");
//對密碼進行解密
passwordStr2 = decodeString(passwordStr2,DECODE_ENCRYPTION_KEY);
password.setText(passwordStr2);

在保存後,就算別人看到也不知道真實的密碼是什麼,下面的圖是加密後的,真實密碼是654321

整個代碼如下:

import android.content.SharedPreferences;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private EditText number;
    private EditText password;
    private Button save;
    private SharedPreferences sp;
    public static final int DECODE_ENCRYPTION_KEY = 64;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        number = (EditText) findViewById(R.id.number);
        password = (EditText) findViewById(R.id.password);
        save = (Button) findViewById(R.id.save);

        //第一參數爲保存的文件名,第二個爲保存的模型,當文件存在就讀取,如果不存在就創建
        sp = getSharedPreferences("info", MODE_PRIVATE);

        //獲取info文件的內容,第一參數爲保存時的key,第二個是如果獲取不到的默認值
        String numberStr1 = sp.getString("number", "");
        String passwordStr2 = sp.getString("password", "");
        //對密碼進行解密
        passwordStr2 = decodeString(passwordStr2,DECODE_ENCRYPTION_KEY);
        password.setText(passwordStr2);
        number.setText(numberStr1);


        save.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //獲取輸入框的賬號和密碼
                String numberStr = number.getText().toString().trim();
                String passwordStr = password.getText().toString().trim();
                //對密碼進行加密
                passwordStr = encryptionString(passwordStr, DECODE_ENCRYPTION_KEY);
                //判斷是否爲空
                if (numberStr.isEmpty() || passwordStr.isEmpty()) {
                    Toast.makeText(getApplicationContext(), "賬號或密碼不能爲空", Toast.LENGTH_SHORT).show();
                } else {
                    //獲取Editor
                    SharedPreferences.Editor editor = sp.edit();
                    //輸入內容
                    editor.putString("number", numberStr);
                    editor.putString("password", passwordStr);
                    //必須提交纔會生效,也可以使用apply
                    editor.commit();
                    Toast.makeText(getApplicationContext(), "保存成功", Toast.LENGTH_SHORT).show();
                }
            }
        });
    }

    /**
     * 加密方法
     * @param str 要加密的字符串
     * @param key 加密的密匙
     * @return 返回加密後的字符串
     */
    public String encryptionString(String str, int key) {
        char[] chars = str.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            chars[i] = (char) (chars[i] + key);
        }
        return String.valueOf(chars);
    }

    /**
     * 解密方法
     * @param str 要解密的字符串
     * @param key 解密的密匙,跟加密一樣
     * @return 返回解密後的字符串
     */
    public String decodeString(String str, int key) {
        char[] chars = str.toCharArray();
        for (int i = 0; i < chars.length; i++) {
            chars[i] = (char) (chars[i] - key);
        }
        return String.valueOf(chars);
    }
}
小夜