android中SharedPreferences的使用及实现自动登录功能

一、SharedPreferences的使用

android SharedPreferences的一般用法(存取清删)

 之前做应用时碰到这样一个问题:在“A” Activity 要与 “B” Activity的Fragment进行通信传值,但是忽然发现无法拿到B中Fragment的Handler,又不能发送广播,短暂的思考之后想到了SharedPreferences这个轻型的数据存储方式。

  SharedPreferences的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息,用Sqlite数据库来存放并不划算,因为数据库连接跟操作等耗时大大影响了程序的效率。其存储位置在/data/data/<包名>/shared_prefs目录下。

  另外SharedPreferences只能保存简单类型的数据,例如,String、int等。一般会将复杂类型的数据转换成Base64编码,然后将转换后的数据以字符串的形式保存在 XML文件中,再用SharedPreferences保存。

 使用SharedPreferences保存key-value对的步骤如下:

  (1)使用Activity类的getSharedPreferences方法获得SharedPreferences对象,其中存储key-value的文件的名称由getSharedPreferences方法的第一个参数指定,第二个参数指定访问应用程序私有文件的权限。

  (2)使用SharedPreferences接口的edit获得SharedPreferences.Editor对象。

  (3)通过SharedPreferences.Editor接口的putXxx方法保存key-value对。其中Xxx表示不同的数据类型。例如:字符串类型的value需要用putString方法。

  (4)通过SharedPreferences.Editor接口的commit方法保存key-value对。commit方法相当于数据库事务中的提交(commit)操作。

存放数据信息,步骤如下:

a、打开Preferences,名称为setting,如果存在则打开它,否则创建新的Preferences

SharedPreferences userSettings = getSharedPreferences("setting", 0);

b、让setting处于编辑状态

SharedPreferences.Editor editor = userSettings.edit();

c、存放数据

editor.putString("name","ATAAW");
editor.putString("URL","ATAAW.COM");

d、完成提交

editor.commit();

 读取数据信息,步骤如下:

a、获取Preferences

SharedPreferences userSettings= getSharedPreferences("setting", 0);

b、取出数据

String name = userSettings.getString("name","默认值");
String url = userSettings.getString("URL","default");

清除指定数据,步骤如下:

SharedPreferences.Editor editor = userSettings.edit();
editor.remove("KEY");
editor.commit();

清空数据,步骤如下:

SharedPreferences.Editor editor = userSettings.edit();
editor.clear();
editor.commit();

 注意:如果在 Fragment 中使用SharedPreferences 时,需要放在onAttach(Activity activity)里面进行SharedPreferences 的初始化,否则会报空指针 即 getActivity()会可能返回null !

 

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

 

 

https://blog.csdn.net/ShanYu1198124123/article/details/52516885

https://blog.csdn.net/SSBBY/article/details/65445211

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值