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();