栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

【Android】6.0SharedPreferences简单数据存储(模拟QQ登录)

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【Android】6.0SharedPreferences简单数据存储(模拟QQ登录)

【Android】6.0SharedPreferences简单数据存储
  • 官网简介
  • SharedPreferences的使用(模拟QQ登录)
      • 简单的为登录界面加一些组件
      • 在LoginActivity中写验证登录的逻辑代码
      • 用户首页界面添加文本组件
      • 在`MainActivity`中获取到user文件
      • 藍为用户欢迎界面设置背景
      • 在`WelcomeActivity`中写一个新线程,获取到用户登录状态
      • 运行效果

注意:不是教程只是笔记,如有错误欢迎批评指正

官网简介

保存键值对数据 | Android 开发者 | Android Developers (google.cn)

如果您有想要保存的相对较小键值对集合,则应使用 SharedPreferences API。SharedPreferences 对象指向包含键值对的文件,并提供读写这些键值对的简单方法。每个 SharedPreferences 文件均由框架进行管理,可以是私有文件,也可以是共享文件。

例如:我们登录qq并不是每次都会要输入账号密码,而是会记住密码和用户的登录状态,这些轻量的数据可以通过SharedPreferences以键值对的方式存储在本地

SharedPreferences的使用(模拟QQ登录)

这里我们创建三个Activity,分别代表QQ欢迎界面,用户登录界面和用户首页界面

简单的为登录界面加一些组件

activtiy_login.xml关键代码




    

    

    

    

    
在LoginActivity中写验证登录的逻辑代码

用户如果验证登录成功,我们要将用户的用户名以及登录状态通过SharedPreferences以键值对的形式保存在本地磁盘中,关键代码如下:

//SharedPreferences是接口,并不是类

//获取SharedPreferences对象
SharedPreferences sp=getSharedPreferences("user",MODE_PRIVATE);
//获取Editor对象的引用
SharedPreferences.Editor editor=sp.edit();
//将获取过来的值放入文件
editor.putString("username","Starry陆离");
editor.putBoolean("isLogin",true);
//最后要提交数据到本地
editor.commit();

可以看到getSharedPreferences();方法存储数据的方式有多种,其中3种已经在Android7.0中弃用

MODE_PRIVATE指定该SharedPreferences数据只能被本应用程序
MODE_APPEND该模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件;
MODE_WORLD_READABLE指定该SharedPreferences数据能被其他应用程序读,但不能写(不安全,已弃用)
MODE_WORLD_WRITEABLE指定该SharedPreferences数据能被其他应用程序读取和写入(不安全,已弃用)

注意:自 API 级别 17 起,MODE_WORLD_READABLE 和 MODE_WORLD_WRITEABLE 模式已被弃用。 从 Android 7.0(API 级别 24)开始,如果您使用这些模式,Android 会抛出 SecurityException。如果您的应用需要与其他应用共享私有文件,可以通过 FLAG_GRANT_READ_URI_PERMISSION 使用 FileProvider。如需了解详情,另请参阅共享文件。

除了可以储存字符串和布尔类型的数据,储存boolean,string,float,int,long,set六种数据类型。

它也有两个参数,前者是”键“,或者是“值”

LoginActivity完整代码

public class LoginActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        EditText userNameEdit=findViewById(R.id.editTextTextPersonName);
        EditText userPwdEdit=findViewById(R.id.editTextTextPassword);

        Button loginBtn=findViewById(R.id.button);

        loginBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String userName=userNameEdit.getText().toString();
                String userPwd=userPwdEdit.getText().toString();
                if(userName.equals("starry")&&userPwd.equals("lx0411")){
                    //todo 跳转到主页面+保存用户名+登录状态

                    //SharedPreferences是接口,并不是类
                    
                    //获取SharedPreferences对象

                    SharedPreferences sp=getSharedPreferences("user",MODE_PRIVATE);
                    //获取Editor对象的引用
                    SharedPreferences.Editor editor=sp.edit();
                    //将获取过来的值放入文件
                    editor.putString("username",userName);
                    editor.putBoolean("isLogin",true);
                    
                    //最后要提交数据到本地
                    editor.commit();

                    //登录成功,跳转到用户首页界面
                    Intent intent=new Intent(LoginActivity.this,MainActivity.class);
                    startActivity(intent);
                    Toast.makeText(LoginActivity.this,"登录成功",Toast.LENGTH_LONG).show();

                }else{
                    Toast.makeText(LoginActivity.this,"登录失败",Toast.LENGTH_LONG).show();
                }
            }
        });

    }
}
用户首页界面添加文本组件

然后简单的为用户首页界面添加一个文本组件用来接受等会储存在SharedPreferences中的用户名

activity_main.xml中的完整代码




    


在MainActivity中获取到user文件

MainActivity完整代码

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        TextView textView = findViewById(R.id.textView);
        //通过文件名获取到user文件
        SharedPreferences sp=getSharedPreferences("user",MODE_PRIVATE);
        //取出键名为username的用户名
        String userName=sp.getString("username","");
        //将用户名设置到文本组件中
        textView.setText(userName);

    }
}
藍为用户欢迎界面设置背景

图片可以在在网络上下载qq欢迎界面 - Bing images

activity_welcome.xml中的完整代码





在WelcomeActivity中写一个新线程,获取到用户登录状态

WelcomeActivity完整代码

public class WelcomeActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_welcome);

        Thread thread = new Thread() {
            public void run() {
                super.run();

                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                //读取用户的登录状态
                SharedPreferences sp = getSharedPreferences("user", MODE_PRIVATE);
                Boolean isLogin = sp.getBoolean("isLogin", false);
                    //如果登录状态是true则直接进入用户首页
                if (isLogin) {
                    Intent intent = new Intent(WelcomeActivity.this, MainActivity.class);
                    startActivity(intent);
                } else {
                    //否则跳转到用户登录界面
                    Intent intent = new Intent(WelcomeActivity.this, LoginActivity.class);
                    startActivity(intent);
                }
            }
        };
        thread.start();
    }
}
运行效果

通过动图可以发现用户第一次登录时是需要验证身份的,而第二次登录用户可以直接进入”qq首页界面“,这是因为我们第一次登录的时候将用户的登录状态记录在了user文件里,再次登陆时WelcomeActivity代码中读取到了用户的登录状态是true,所以直接跳转到用户首页界面

那么这个user文件保存在哪里呢?

可以看到在data/data/项目包名的shared_prefs文件夹下生成了一个user.xml的文件,里面存放就是我们的用户名和登录状态信息


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/848298.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号