xml文件我們可以用來保存一些數據。例如用來備份短信。這個例子中,我們就用XmlSerializer接口來實現一個備份短信的程序。當然了,為了程序簡單化,這個程序我們並不是真的去備份短信。我們通過一個Message.java文件來作為javabean使用。用他來虛擬一個短信類。然后我們來備份虛擬出來的內容。
備份后,會在對應的目錄下生成一個xml文件。我們可以用瀏覽器來打開,解析出xml來看。
先看程序運行效果。
然后我們直接看代碼,對了,清單文件我就不弄上來了。清單文件沒什么,因為要向sd卡寫文件嘛,所以要添加個向sd卡寫入的權限
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
下面看我生成的xml文件,運行程序后,便會在sd卡的根目錄下生成info.xml的文件。下面是我用瀏覽器打開后解析的效果。
下面看代碼
首先是布局文件
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.savexml.MainActivity" > <Button android:id="@+id/bt" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/hello_world" /> </RelativeLayout>
然后是java文件(兩個類)
首先是Message.java (這個類的作用主要是用來做短信類而已,作為javabean的作用)
package com.example.savexml; public class Message { // 定義短信內容 private String body; // 定義短信日期 private String date; // 定義發件人號碼 private String address; // 定義收發類型 private String type; public String getBody() { return body; } public void setBody(String body) { this.body = body; } public String getDate() { return date; } public void setDate(String date) { this.date = date; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getType() { return type; } public void setType(String type) { this.type = type; } public Message(String body, String date, String address, String type) { super(); this.body = body; this.date = date; this.address = address; this.type = type; } }
然后是MainActivity
package com.example.savexml; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.xmlpull.v1.XmlSerializer; import android.app.Activity; import android.os.Bundle; import android.os.Environment; import android.util.Log; import android.util.Xml; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.Toast; public class MainActivity extends Activity { List<Message> smsList; private Button btButton; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 存放短信的集合 smsList = new ArrayList<Message>(); // 虛擬出20條短信 for (int i = 0; i <= 20; i++) { Message msm = new Message("短信內容" + i, System.currentTimeMillis() + "", "10086", "1"); smsList.add(msm); } btButton = (Button) findViewById(R.id.bt); btButton.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub try { backup(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } private void backup() throws IOException { // 拿到xml序列化器 XmlSerializer xs = Xml.newSerializer(); // 包裝外部存儲路徑 File file = new File(Environment.getExternalStorageDirectory(), "info.xml"); FileOutputStream fos = null; try { // 用輸出流輸出info.xml fos = new FileOutputStream(file); // 指定用utf-8編碼生成文件 xs.setOutput(fos, "UTF_8"); // 生成xml表頭,兩個參數表示表頭屬性 xs.startDocument("UTF-8", true); // 生成根節點 /* * 其實拼接的過程有點像寫html文件, 無非就是一對標簽,一對標簽的寫而已。 * 從代碼可以看出,xs.startTag(),表示標簽開始,endTag()表示標簽結束。 * 第二個參數表示節點名稱。 */ xs.startTag(null, "message"); for (Message sms : smsList) { xs.startTag(null, "sms"); xs.startTag(null, "body"); xs.text(sms.getBody()); xs.endTag(null, "body"); xs.startTag(null, "date"); xs.text(sms.getDate()); xs.endTag(null, "date"); xs.startTag(null, "address"); xs.text(sms.getAddress()); xs.endTag(null, "address"); xs.startTag(null, "type"); xs.text(sms.getType()); xs.endTag(null, "type"); xs.endTag(null, "sms"); } xs.endTag(null, "message"); // 表示文檔生成結束 xs.endDocument(); } catch (Exception e) { e.printStackTrace(); } finally { if (fos != null) { fos.close(); Log.i("Back", "33333"); } } Toast.makeText(this, "備份完成", 0).show(); } }