使用SharedPreferences存儲登錄信息
SharedPreferences是android存儲數據的方式之一,適合用於存儲少量的數據,常用於存儲配置信息,如登錄信息。
存數據
public static int MODE = Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE;
······
SharedPreferences sp = getSharedPreferences("userInfo", MODE);
SharedPreferences.Editor editor = sp.edit();
editor.putString("USER_NAME", name).commit();
editor.putString("ID", String.valueOf(id)).commit();
取數據
SharedPreferences preferences = getSharedPreferences("userInfo", Activity.MODE_PRIVATE);
String username= preferences.getString("USER_NAME", "");
String id= preferences.getString("ID", "");
創建一個userinfo的實體類。
public class UserInfo {
private String userName;
private String id;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
}
然後創建UserManage 保存用戶信息的管理類。
import android.content.Context;
import android.content.SharedPreferences;
import android.text.TextUtils;
import android.util.Log;
public class UserManage {
private static UserManage instance;
private UserManage() {
}
public static UserManage getInstance() {
if (instance == null) {
instance = new UserManage();
}
return instance;
}
/**
* 保存自動登錄的用戶信息
*/
public void saveUserInfo(Context context, String username, String password) {
SharedPreferences sp = context.getSharedPreferences("userInfo", Context.MODE_PRIVATE);//Context.MODE_PRIVATE表示SharePrefences的數據只有自己應用程序能訪問。
SharedPreferences.Editor editor = sp.edit();
editor.putString("USER_NAME", username);// edit.putString("鍵名","值");
editor.putString("ID", id);
// editor.commit();
editor.apply();
}
public static String takeName(Context context){
SharedPreferences sharedPreferences=context.getSharedPreferences("usesrInfo",0);
String name=sharedPreferences.getString("USER_NAME",null);
return name;
}
/**
* 獲取用戶信息model
*
* @param context
* @param
* @param
*/
public UserInfo getUserInfo(Context context) {
SharedPreferences sp = context.getSharedPreferences("userInfo", Context.MODE_PRIVATE);
UserInfo userInfo = new UserInfo();
userInfo.setUserName(sp.getString("USER_NAME", ""));
userInfo.setId(sp.getString("ID", ""));
return userInfo;
}
/**
* userInfo中是否有數據
*/
public boolean hasUserInfo(Context context) {
UserInfo userInfo = getUserInfo(context);
if (userInfo != null) {
if ((!TextUtils.isEmpty(userInfo.getUserName())) && (!TextUtils.isEmpty(userInfo.getId()))) {//有數據
return true;
} else {
return false;
}
}
return false;
}
public static void clear(Context context) {
SharedPreferences preferences = context.getSharedPreferences("userInfo", Context.MODE_PRIVATE);
SharedPreferences.Editor editor = preferences.edit();
editor.clear();
editor.commit();
}
}
如果登錄成功存儲用戶登錄的用戶名和從數據庫中獲取的ID,因爲在後面的數據庫操作操作需要經常用到這2個數據,如果後面用戶操作過程中修改了用戶名可以調用SharePrefences存儲數據方法再存儲一下,存儲的數據會替換。
判斷SharedPreferences 中是否存儲有數據,在用戶第二次進入APP時,判斷如果有數據就跳轉到APP首頁,如果沒有存儲數據就跳轉登錄頁。我是在MainActivity.java中判斷。
//自動登錄判斷,SharePrefences中有數據,則跳轉到主頁,沒數據則跳轉到登錄頁
if (UserManage.getInstance().hasUserInfo(this))
{
//有數據跳轉首頁
} else {
//無數據跳轉登錄頁
}
退出登錄操作,
創建ActivityCollector類
//管理所有的活動,這個是對於用戶退出登錄
public class ActivityCollector {
public static List<Activity> activityList=new ArrayList<>();
public static void addActivity(Activity activity){
activityList.add(activity);
}
public static void remove(Activity activity){
activityList.remove(activity);
}
public static void finishAll(){
for (Activity activity:activityList){
if (!activity.isFinishing()){ //判斷activity是否銷燬
activity.finish(); //銷燬activity
}
}
}
}
創建BaseActivity.java父類
public class BaseActivity extends AppCompatActivity {
private MyForceExitReceiver receiver; //聲明一個自己的廣播接收者內部類
private MyBaseActiviy_Broad oBaseActiviy_Broad;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ActivityCollector.addActivity(this);
}
//定義一個廣播
public class MyBaseActiviy_Broad extends BroadcastReceiver {
public void onReceive(Context arg0, Intent intent) {
//接收發送過來的廣播內容
int closeAll = intent.getIntExtra("closeAll", 0);
if (closeAll == 1) {
finish();//銷燬BaseActivity
}
}
}
/**
* 在activity處於返回棧頂,即處於焦點時,註冊一個廣播接收者
*/
public void onResume(){
super.onResume();
IntentFilter intentFilter=new IntentFilter(); //實例化一個intent過濾器
intentFilter.addAction("com.yuanlp.exit.FORCEXIT"); //只關心自己想要的廣播
receiver=new MyForceExitReceiver();
registerReceiver(receiver,intentFilter); //動態註冊廣播
}
public void onPause(){ //噹噹前activity被彈出框佔用時,解除註冊
super.onPause();
if (receiver!=null){
unregisterReceiver(receiver);
receiver=null;
}
}
public void onDestroy(){
super.onDestroy();
ActivityCollector.remove(this);
}
/**
* 一個廣播接收者,接收到廣播後,彈出框提示用戶退出登錄,
*/
private class MyForceExitReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, final Intent intent) {
AlertDialog.Builder builder=new AlertDialog.Builder(context);
builder.setTitle("提示");
builder.setMessage("確定要退出登錄?");
builder.setCancelable(false);
builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
ActivityCollector.finishAll(); //銷燬所有活動
Intent intent=new Intent(context,LoginActivity.class); //跳轉至登錄界面
context.startActivity(intent);
}
});
builder.setNegativeButton(getResources().getString(R.string.tips_limit_false), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//取消按鈕
}
});
builder.setCancelable(true);
builder.show();
}
}
}
退出登錄界面,activity_set_user.xml文件就一個退出登錄按鈕,在這裏代碼省略。
public class SetUserActivity extends BaseActivity {
private TextView tvCancel;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_set_user);
tvCancel = findViewById(R.id.tvCancel);
//退出登錄按鈕點擊事件
tvCancel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
UserManage.clear(SetUserActivity.this);
Intent intent = new Intent("com.exit.FORCEXIT");
sendBroadcast(intent); //發送廣播
}
});
}
}