手机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