[android] xml文件的序列化

生成xml文件,模拟备份短信,创建短信的业务bean,创建一个domain的包放业务bean,这个业务bean里面,定义成员属性,生成get set方法,生成有参和无参的构造方法。

生成随机数,实例化Random,调用Random对象的nextInt(n)方法,生成0到n之间的随机数,获取当前系统的时间戳System.currentTimeMillis(),使用for循环,循环生成一个list集合,代表短信的内容

点击保存按钮以后,使用StringBuilder对象append()拼接成一个xml的文件内容,根据上几节内容保存的SD卡中。记住要在清单文件中加权限

android.permission.WRITE_EXTERNAL_STORAGE,如果出现两个清单文件,不能删除这个,是工具bug。如果右键部署的时候,又开启了一个模拟器,那么这是adb挂掉了,关闭eclipse,在任务管理器中关闭adb.exe,重新打开eclipse。

以上是传统方式,android提供了一个面向对象的方式

获取XmlSerilier对象,通过Xml.newSerilier()方法

调用XmlSerilier对象的setOutput(os,encoding)方法,文件输出流,编码

调用XmlSerilier对象的startDocument(encoding,standalone)方法,xml文件的声明,编码,是否独立

调用XmlSerilier对象的startTag(namespace,name)方法,开始节点,命名空间,节点名称

调用XmlSerilier对象的endTag(namespace,name)方法,结束节点,命名空间,节点名称

调用XmlSerilier对象的attribute(namespace,name,value)方法,节点属性,命名空间,属性名称,属性值

调用XmlSerilier对象的text()方法,节点内容

activity代码:

package com.tsh.makexml;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import org.xmlpull.v1.XmlSerializer;

import com.tsh.makexml.domain.SmsInfo;

import android.app.Activity;
import android.os.Bundle;
import android.os.Environment;
import android.provider.Telephony.Sms;
import android.util.Xml;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {
    private List<SmsInfo> smsInfos;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        smsInfos=new ArrayList<SmsInfo>();
        Random random=new Random();
        String num="188000000";
        for(int i=0;i<10;i++){
            int type=random.nextInt(2)+1;
            smsInfos.add(new SmsInfo(System.currentTimeMillis(),type,"短信内容"+i,num+i));
        }
    }
    /**
     * 备份短信第一种
     * @param v
     */
    public void backSms(View v){
        StringBuilder sb=new StringBuilder();
        sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
        sb.append("<smss>");
        for(SmsInfo sms:smsInfos){
            sb.append("<body>"+sms.getMessage()+"</body>");
            sb.append("<date>"+sms.getDate()+"</date>");
            sb.append("<type>"+sms.getType()+"</type>");
            sb.append("<tel>"+sms.getAddress()+"</tel>");
        }
        sb.append("</smss>");
        try {
            File file=new File(Environment.getExternalStorageDirectory(),"backup.xml");
            FileOutputStream fos=new FileOutputStream(file);
            fos.write(sb.toString().getBytes());
            fos.close();
            Toast.makeText(this, "保存成功", 0).show();
        } catch (Exception e) {
            Toast.makeText(this, "保存失败", 0).show();
        }
    }
    /**
     * 备份短信第二种
     * @param v
     */
    public void backSms2(View v){
        XmlSerializer serializer=Xml.newSerializer();
        try {
            File file=new File(Environment.getExternalStorageDirectory(),"backup2.xml");
            FileOutputStream os=new FileOutputStream(file);
            serializer.setOutput(os, "utf-8");
            serializer.startDocument("utf-8", true);
            serializer.startTag(null, "smss");
            for(SmsInfo sms:smsInfos){
                serializer.startTag(null, "sms");
                serializer.attribute(null, "tel", sms.getAddress());
                serializer.text(sms.getMessage());
                serializer.endTag(null, "sms");
            }
            serializer.endTag(null, "smss");
            serializer.endDocument();
            os.close();
            Toast.makeText(this, "保存成功", 0).show();
        } catch (Exception e) {
            Toast.makeText(this, "保存失败", 0).show();
        }
    }
}

业务bean代码:

package com.tsh.makexml.domain;

public class SmsInfo {
    private long date;
    private int type;
    private String message;
    private String address;
    public SmsInfo() {
    }    
    public SmsInfo(long date, int type, String message, String string) {
        super();
        this.date = date;
        this.type = type;
        this.message = message;
        this.address = string;
    }
    public long getDate() {
        return date;
    }
    public void setDate(long date) {
        this.date = date;
    }
    public int getType() {
        return type;
    }
    public void setType(int type) {
        this.type = type;
    }
    public String getMessage() {
        return message;
    }
    public void setMessage(String message) {
        this.message = message;
    }
    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏程序亦非猿

【连载】聊聊 APK(四) —— 脱离 AS 手工创造 APK 文件

想进大厂,就关注「 程序亦非猿 」 时不时 8:38 推送优质文章,觉得有用,置顶加星标

11950
来自专栏Java架构学习路线

3年java开发面试BAT,你必须彻底搞定Maven!

Maven的仓库管理、依赖管理、继承和聚合等特性为项目的构建提供了一整套完善的解决方案,如果你搞不懂Maven,那么一个多模块的项目足以让你头疼,依赖冲突就会让...

8500
来自专栏技术圈

Window下安装Scrapy

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。

6410
来自专栏JavaEdge

Dubbo实战(一) - 入门

随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。

10150
来自专栏DevOps时代的专栏

Nexus 制品库管理:使用 mvn deploy 进行发布

Nexus 可以用来管理二进制制品,如果是 Java 的应用,则可以与 Apache Maven 结合使用进行二进制制品的部署,这篇文章使用简单的示例来对使用方...

17010
来自专栏奔跑的人生

Docker部署网站之后映射域名

Docker中部署tomcat相信大家也都知道,不知道的可以google 或者bing 一下。这里主要是为了记录在我们启动容器之后,tomcat需要直接定位到网...

12220
来自专栏Android机器圈

RecyclerView实现混合布局

PS:好长时间不写博客了,起初是不知道写些什么,后来接触了到了很多东西,原本看似简单的东西,背后都隐藏着巨大的秘密,想handler的使用,一般情况下会引起内存...

29920
来自专栏Java周某人

跳槽季必须的知道的Mybatis面试题汇总(含答案)

2. 通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

9200
来自专栏Android技术分享

Android View源码解读:浅谈DecorView与ViewRootImpl

对于Android开发者来说,View无疑是开发中经常接触的,包括它的事件分发机制、测量、布局、绘制流程等,如果要自定义一个View,那么应该对以上流程有所了解...

12420
来自专栏Android机器圈

自定义Dialog---实现优美对话框

PS:自定义dialog,一些系统的dialog已经不能满足开发人员的需求了,所以,我们需要自定义一个属于并且适合自己项目的对话框,无论是颜色还是功能需求上都是...

11210

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励