Android之SharedPreferences存儲數據實現自動登錄以及退出登錄

使用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);  //發送廣播
            }
        });
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章