Android---实现登录用户信息保存

简介:

前两天用SharedPreference实现了保存用户历史信息,当用户再次登录的时候在AutoCompleteTextView(仿google搜索自动提示框)中显示历史用户信息。

这次用户信息是通过XML保存的,其中比较中要的包括了XML数据的生成和XML数据的解析,以及生成apk私有数据。

XML数据生成:在将用户信息保存成XML数据前,我们应该先了解一个非常重要的类XmlSerializer,这个类帮助我们将需要保存成XML数据的信息进行序列化。

代码
    public String writeToString(List<UserInfo> users){
        //实现xml信息序列号的一个对象
        XmlSerializer serializer=Xml.newSerializer();
        StringWriter writer=new StringWriter();
        try {
            //xml数据经过序列化后保存到String中,然后将字串通过OutputStream保存为xml文件
            serializer.setOutput(writer);
            
            //文档开始
            serializer.startDocument("utf-8", true);
            
            //开始一个节点
            serializer.startTag("", "users");
            
            //开始一个子节点
            for(UserInfo user : users){
                serializer.startTag("", "user");
                serializer.attribute("", "id", String.valueOf(user.getId()));
                
                serializer.startTag("", "name");
                serializer.text(user.getName());
                serializer.endTag("", "name");
                
                serializer.startTag("", "pwd");
                serializer.text(user.getPwd());
                serializer.endTag("", "pwd");
                
                serializer.startTag("", "isremember");
                serializer.text(String.valueOf(user.getIsRemember()));
                serializer.endTag("", "isremember");
                
                serializer.endTag("", "user");
            }
            
            serializer.endTag("", "users");
            //关闭文档
            serializer.endDocument();
        } catch (IllegalArgumentException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalStateException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return writer.toString();
    }

将字串保存为apk的私有文件

代码
    public boolean writeToXml(Context context,String str){
        try {
            OutputStream out=context.openFileOutput("users.xml", Context.MODE_PRIVATE);
            OutputStreamWriter outw=new OutputStreamWriter(out);
            try {
                outw.write(str);
                outw.close();
                out.close();
                return true;
            } catch (IOException e) {
                // TODO Auto-generated catch block
                return false;
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            return false;
        }
    }

 XML数据解析

由于使用DOM方法需要将整个XML文档加载内存中,对系统资源占用比较多,这对内存比较紧张的Android系统来说,使用DOM方法读取XML文档会有很大的限制。 所以使用SAX方法读取XML,以减少对内存资源的占用。

使用SAX解析xml数据其实很简单,无非就是几个过程,startDocument——startElement——character——endElement——endDocument

startDocument:开始解析xml数据,如果处理的数据很多,在这里实例化一个list对象。

startElement:节点元素数据的处理,获取节点元素的属性值,往往在这里对抽象化的对象进行实例化如一个用户的信息UserInfo user

character:获得杰点元素的内容,在这里专门获得没有属性节点的内容,如<name>cbin</name>

endElement:一个节点的结束,也就相当于一个用户信息的解析完毕,在这里将user添加到list中

endDocument:XML数据解析结束

代码
public class UsersHandler extends DefaultHandler {

    private List<UserInfo> list=null;
    private UserInfo user=null;
    private String tagname;
    
    //开始解析XML文档
    @Override
    public void startDocument() throws SAXException{
        list=new ArrayList<UserInfo>();
        super.startDocument();
    }
    
    //开始处理节点,在这里获得节点属性值的(节点属性)
    @Override
    public void startElement(String uri, String localName, String qName, Attributes attributes)
    throws SAXException{
        if(localName.equals("user")){
            user=new UserInfo();
            user.setId(Integer.parseInt(attributes.getValue("id")));
        }
        this.tagname=localName;
        super.startElement(uri, localName, qName, attributes);
    }
    
    //处理没有属性的节点(节点内容)
    @Override
    public void characters(char[] ch, int start, int length) throws SAXException{
        if(this.tagname!=""){
            if(this.tagname.equals("name")){
                String str=new String(ch, start, length);
                user.setName(str);
            }else if(this.tagname.equals("pwd")){
                String str=new String(ch, start, length);
                user.setPwd(str);
            }else if(this.tagname.endsWith("isremember")){
                String str=new String(ch, start, length);
                user.setIsRemember(Integer.parseInt(str));
            }
        }
        super.characters(ch, start, length);
    }
    
    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException{
        if(localName.equals("user")){
            list.add(user);
        }
        super.endElement(uri, localName, qName);
    }
    
    @Override
    public void endDocument() throws SAXException{
        super.endDocument();
    }
    
    public List<UserInfo> getUserList(){
        return list;
    }
}

表示层与SharedPreferences中实现用户登录大同小异,无非是一个登录的逻辑处理

1、加载页面时,加载xml中数据,将用户名列表绑定AutoCompleteTextView

2、假若从act中选定数据,根据用户名查找密码等信息绑定et、ck;

3、登录成功,是新用户直接添加,老用户删除原有记录,重新记录用户信息。

相关文章
|
3月前
|
数据安全/隐私保护 Android开发
2023安卓逆向 -- 某合伙apk登录加密分析
2023安卓逆向 -- 某合伙apk登录加密分析
26 0
|
6月前
|
JavaScript Java Android开发
Cocos Creator Android 平台 Facebook 原生登录(二)
Cocos Creator Android 平台 Facebook 原生登录
101 0
|
6月前
|
开发工具 Android开发 数据安全/隐私保护
Cocos Creator Android 平台 Facebook 原生登录(一)
Cocos Creator Android 平台 Facebook 原生登录
285 0
|
Android开发
flutter中实现仿Android端的onResume和onPause方法
flutter中实现仿Android端的onResume和onPause方法
|
6月前
|
数据安全/隐私保护 Android开发
2023安卓逆向 -- 某合伙apk登录加密分析
2023安卓逆向 -- 某合伙apk登录加密分析
41 0
|
6月前
|
Java 数据安全/隐私保护 Android开发
Android 实战项目 -- 登录主页、找回密码
Android 实战项目 -- 登录主页、找回密码
97 0
|
6月前
|
存储 JavaScript Java
Cocos Creator Android 平台 Google 原生登录(二)
Cocos Creator Android 平台 Google 原生登录
125 0
|
6月前
|
API 开发工具 Android开发
Cocos Creator Android 平台 Google 原生登录(一)
Cocos Creator Android 平台 Google 原生登录
186 0
|
8月前
|
JavaScript 前端开发 Android开发
uniapp+vue+uview适配安卓4.4项目实现简单登录和操作页面
uniapp+vue+uview适配安卓4.4项目实现简单登录和操作页面
176 0
|
10月前
|
存储 Java 开发工具
如何用Android Studio实现登录跳转
如何用Android Studio实现登录跳转
187 0