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