1. 程式人生 > >Android使用SharedPreferences實現自動登入

Android使用SharedPreferences實現自動登入

今天完善了自己app的登入介面,主要就是添加了記住密碼和自動登入的功能,記錄一下怎麼利用輕量級的儲存SharedPreferences來實現這兩個功能。

先說一下SharedPreferences介紹:

SharedPreferences是Android平臺上一個輕量級的儲存類,主要是儲存一些常用的配置引數,它是採用xml檔案存放資料的,檔案存放在"/data/data<package name>/shared_prefs"目錄下。

SharedPreferences的用法:

由於SharedPreferences是一個介面,而且在這個接口裡沒有提供寫入資料和讀取資料的能力。但它是通過其Editor介面中的一些方法來操作SharedPreference的,用法見下面程式碼:

Context.getSharedPreferences(String name,int mode)來得到一個SharedPreferences例項

name:是指檔名稱,不需要加字尾.xml,系統會自動為我們新增上

mode:是指定讀寫方式,其值有三種,分別為:

Context.MODE_PRIVATE:指定該SharedPreferences資料只能被本應用程式讀、寫

Context.MODE_WORLD_READABLE指定該SharedPreferences資料能被其他應用程式讀,但不能寫

Context.MODE_WORLD_WRITEABLE指定該SharedPreferences資料能被其他應用程式讀寫

老規矩,效果圖:


實現步驟以及需要注意的一些邏輯問題:

在登入程式碼(LoginActivity.class)中:

(1)先宣告變數sp和相關的控制元件(登入按鈕,兩個CheckBox和兩個輸入框),以及註冊監聽登入按鈕

...//這裡省略了匯入的包,程式碼也有所刪減,主要為實現功能的程式碼段,根據自己的專案再進行新增修改
/**
 * xuboyu
 * 登陸實現
 */
public class LoginActivity extends Activity {

    private Button login;//登入按鈕

    private EditText et1;//輸入賬號輸入框
    private EditText et2;//輸入密碼輸入框

    private CheckBox remember_key;//記住密碼勾選框
    private CheckBox automatic_login;//自動登入選框
    private SharedPreferences sp;

    private String userNameValue;
    private String passwordValue;

    private Context mContext = this;

    private Boolean rem_isCheck = false;
    private Boolean auto_isCheck = false;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.login_activity);

        //開啟Preferences,名稱為userInfo,如果存在則開啟它,否則建立新的Preferences
        //Context.MODE_PRIVATE:指定該SharedPreferences資料只能被本應用程式讀、寫
        //Context.MODE_WORLD_READABLE:指定該SharedPreferences資料能被其他應用程式讀,但不能寫
        //Context.MODE_WORLD_WRITEABLE:指定該SharedPreferences資料能被其他應用程式讀寫。
        sp = this.getSharedPreferences("userInfo", Context.MODE_WORLD_READABLE);

        //對but進行例項化
        login = (Button) findViewById(R.id.login_button);
        remember_key = (CheckBox) findViewById(R.id.remember_key);
        automatic_login = (CheckBox) findViewById(R.id.automatic_login);

        //建立but的單擊事件,引數要傳匿名內部類
        et1 = (EditText) findViewById(R.id.login_user_et);
        et2 = (EditText) findViewById(R.id.login_pwd_et);

        rem_isCheck = remember_key.isChecked();
        auto_isCheck = automatic_login.isChecked();

        remember_key.setChecked(true);//設定記住密碼初始化為true

        //判斷記住密碼多選框的狀態
        if (sp.getBoolean("rem_isCheck", false)) {
            //設定預設是記錄密碼狀態
            remember_key.setChecked(true);
            et1.setText(sp.getString("USER_NAME", ""));
            et2.setText(sp.getString("PASSWORD", ""));
            Log.e("自動恢復儲存的賬號密碼", "自動恢復儲存的賬號密碼");

            //判斷自動登陸多選框狀態
            if (sp.getBoolean("auto_isCheck", false)) {
                //設定預設是自動登入狀態
                automatic_login.setChecked(true);
                //跳轉介面
                Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                LoginActivity.this.startActivity(intent);
                Toast toast1 = Toast.makeText(getApplicationContext(), "已自動登入", Toast.LENGTH_SHORT);
                Log.e("自動登陸", "自動登陸");
            }
        }


        //登入按鈕監聽方法
        login.setOnClickListener(new OnClickListener() {
            public void onClick(View v) {
                userNameValue = et1.getText().toString();
                passwordValue = et2.getText().toString();
		//這裡賬號密碼為假設,因為自己的專案有用到網路請求,就沒貼出來,這是簡單的實現思路
                if (userNameValue.equals("xuboyu") && passwordValue.equals("123456")) {
                    Toast.makeText(LoginActivity.this, "登入成功", Toast.LENGTH_SHORT).show();
                    //登入成功和記住密碼框為選中狀態才儲存使用者資訊  
                    if (rem_isCheck.isChecked()) {
                        //記住使用者名稱、密碼、  
                        Editor editor = sp.edit();
                        editor.putString("USER_NAME", userNameValue);
                        editor.putString("PASSWORD", passwordValue);
                        editor.putBoolean("rem_isCheck", rem_isCheck);
                        editor.putBoolean("auto_isCheck", auto_isCheck);
                        editor.commit();

                        Log.e("選中儲存密碼", "賬號:" + userNameValue +
                                "\n" + "密碼:" + passwordValue +
                                "\n" + "是否記住密碼:" + rem_isCheck +
                                "\n" + "是否自動登陸:" + auto_isCheck);
                        editor.commit();
                    }
                    //跳轉介面  
                    Intent intent = new Intent(LoginActivity.this, MainActivity.class);
                    LoginActivity.this.startActivity(intent);
                    //finish();  

                } else {

                    Toast.makeText(LoginActivity.this, "使用者名稱或密碼錯誤,請重新登入", Toast.LENGTH_LONG).show();
                }

            }
        });

    }
}
效果圖如下:


(3)將(2)中的程式碼和(1)的程式碼合併,再根據自己的專案進行修改~

我的執行結果:

*記住密碼*


*自動登入*


(4)退出登入時注意清除原先儲存的資料

//清除登入介面的自動登入和記住密碼的程式碼
sp.edit().putBoolean("automatic_login",false).commit();
sp.edit().putBoolean("rem_isCheck",false).commit();