Android 手机卫士9--短信备份

手机APP开发 2016-10-19

AToolActivity.java

protected void showSmsBackUpDialog() {
     //1,创建一个带进度条的对话框
     final ProgressDialog progressDialog = new ProgressDialog(this);
     progressDialog.setIcon(R.drawable.ic_launcher);
     progressDialog.setTitle("短信备份");
     //2,指定进度条的样式为水平
     progressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
     //3,展示进度条
     progressDialog.show();
     //4,直接调用备份短信方法即可
     new Thread(){
         @Override
         public void run() {
             String path = Environment.getExternalStorageDirectory().getAbsolutePath()+File.separator+"sms74.xml";
             SmsBackUp.backup(getApplicationContext(), path, new CallBack() {
                 @Override
                 public void setProgress(int index) {
                     //由开发者自己决定,使用对话框还是进度条
                     progressDialog.setProgress(index);
                     pb_bar.setProgress(index);
                 }
                 
                 @Override
                 public void setMax(int max) {
                     //由开发者自己决定,使用对话框还是进度条
                     progressDialog.setMax(max);
                     pb_bar.setMax(max);
                 }
             });
             
             progressDialog.dismiss();
         }
     }.start();
 }

SmsBackUp.java

package com.itheima.mobilesafe74.engine;
 
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import org.xmlpull.v1.XmlSerializer;
 import android.content.Context;
 import android.database.Cursor;
 import android.net.Uri;
 import android.util.Xml;
 
 public class SmsBackUp {
     private static int index = 0;
     
     //备份短信方法
     //ProgressDialog pd    原来的对话框
     //现在改为进度条
     
     //A,传递一个进度条所在的对话框
     //B,传递一个进度条
     
     public static void backup(Context ctx,String path,CallBack callBack) {
         FileOutputStream fos = null;
         Cursor cursor = null;
         try {
             //需要用到的对象上下文环境,备份文件夹路径,进度条所在的对话框对象用于备份过程中进度的更新
             //1,获取备份短信写入的文件
             File file = new File(path);
             //2,获取内容解析器,获取短信数据库中数据
             cursor = ctx.getContentResolver().query(Uri.parse("content://sms/"), 
                     new String[]{"address","date","type","body"}, null, null, null);
             //3,文件相应的输出流
             fos = new FileOutputStream(file);
             //4,序列化数据库中读取的数据,放置到xml中
             XmlSerializer newSerializer = Xml.newSerializer();
             //5,给次xml做相应设置
             newSerializer.setOutput(fos, "utf-8");
             //DTD(xml规范)
             newSerializer.startDocument("utf-8", true);
             
             newSerializer.startTag(null, "smss");
             
             //6,备份短信总数指定
             //A 如果传递进来的是对话框,指定对话框进度条的总数
             //B    如果传递进来的是进度条,指定进度条的总数
 //            pd.setMax(cursor.getCount());
             
             if(callBack!=null){
                 callBack.setMax(cursor.getCount());
             }
             
             //7,读取数据库中的每一行的数据写入到xml中
             while(cursor.moveToNext()){
                 newSerializer.startTag(null, "sms");
                 
                 newSerializer.startTag(null, "address");
                 newSerializer.text(cursor.getString(0));
                 newSerializer.endTag(null, "address");
                 
                 newSerializer.startTag(null, "date");
                 newSerializer.text(cursor.getString(1));
                 newSerializer.endTag(null, "date");
                 
                 newSerializer.startTag(null, "type");
                 newSerializer.text(cursor.getString(2));
                 newSerializer.endTag(null, "type");
                 
                 newSerializer.startTag(null, "body");
                 newSerializer.text(cursor.getString(3));
                 newSerializer.endTag(null, "body");
                 
                 newSerializer.endTag(null, "sms");
                 
                 //8,每循环一次就需要去让进度条叠加
                 index++;
                 Thread.sleep(500);
                 //ProgressDialog可以在子线程中更新相应的进度条的改变
                 
                 //A 如果传递进来的是对话框,指定对话框进度条的当前百分比
                 //B    如果传递进来的是进度条,指定进度条的当前百分比
 //                pd.setProgress(index);
                 
                 if(callBack!=null){
                     callBack.setProgress(index);
                 }
             }
             newSerializer.endTag(null, "smss");
             newSerializer.endDocument();
         } catch (Exception e) {
             e.printStackTrace();
         }finally{
             try {
                 if(cursor!=null && fos!=null){
                     cursor.close();
                     fos.close();
                 }
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
     }
     //回调
     //1.定义一个接口
     //2,定义接口中未实现的业务逻辑方法(短信总数设置,备份过程中短信百分比更新)
     //3.传递一个实现了此接口的类的对象(至备份短信的工具类中),接口的实现类,一定实现了上诉两个为实现方法(就决定了使用对话框,还是进度条)
     //4.获取传递进来的对象,在合适的地方(设置总数,设置百分比的地方)做方法的调用
     public interface CallBack{
         //短信总数设置为实现方法(由自己决定是用    对话框.setMax(max) 还是用    进度条.setMax(max))
         public void setMax(int max);
         //备份过程中短信百分比更新(由自己决定是用    对话框.setProgress(max) 还是用    进度条.setProgress(max))
         public void setProgress(int index);
     }
 }
SmsBackUp