练手小项目(5)安全卫士_利用内容提供者进行短信备份 修正版
来源:程序员人生 发布时间:2014-12-22 08:56:18 阅读次数:2313次
短信备份类,我在上1节基本全部讲完了,代码的迭代开发,是需要的,开发完就需要做代码重构,解耦
可学到的知识点
①接口的利用
②简单的ui线程使用runOnUiThread
上1节,讲到 如果公司老板频繁的话UI需求的话,对1个项目组来讲是很头痛的,由于基本是1个人负责UI,1个人负责业务类的。所以为了解耦,我们要改造Smsutils
由于在类中常常变动的就是 UI,开始备份的时候,设置进度的最大值 ,备份进程中,增加进度 所以我们就把常常变动的抽出来定义成接口,让使用者选择传递甚么样的值。
①接口的利用
/**
* 备份短信的回调接口
*/
public interface BackUpCallBack {
/**
* 开始备份的时候,设置进度的最大值
*
* @param max
* 总进度
*/
public void beforeBackup(int max);
/**
* 备份进程中,增加进度
*
* @param progress
* 当前进度
*/
public void onSmsBackup(int progress);
}
// pd.setMax(max);
callBack.beforeBackup(max);
当工具类走到这1步,由于接口的抽象方法在调用者那里写着,所以最后还是履行了 调用者类中的
pd.setProgress(progress);
顺次类推
// pd.setProgress(process);
callBack.onSmsBackup(process);
走到这里的时候,确切也是调用了
pd.setMax(max);
这时候候 progressbar 就会出现了。就这样解耦了
②简单的ui线程使用runOnUiThread
由于备份短信的时候,顾虑到可能用户的短信比较多,所以开启了1个子线程进行更新,然后又要使用到Toast 这个时候 简单的使用UI更新 就会使用到他
runOnUiThread
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(SmsActivity.this, "备份成功", 0).show();
}
});
SmsUtils.java 备份短信工具类
package com.example.Darkbutton.Utils;
import java.io.File;
import java.io.FileOutputStream;
import org.xmlpull.v1.XmlSerializer;
import android.app.ProgressDialog;
import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
import android.util.Xml;
/**
* 短信的工具类
*
*/
public class SmsUtils {
/**
* 备份短信的回调接口
*/
public interface BackUpCallBack {
/**
* 开始备份的时候,设置进度的最大值
*
* @param max
* 总进度
*/
public void beforeBackup(int max);
/**
* 备份进程中,增加进度
*
* @param progress
* 当前进度
*/
public void onSmsBackup(int progress);
}
public static void backupSms(Context context, BackUpCallBack callBack) throws Exception {
// ProgressDialog pd=new ProgressDialog(context);
// pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
// pd.setMessage("正在备份数据");
// pd.show();
File file = new File(Environment.getExternalStorageDirectory(),
"backup.xml");
FileOutputStream fos = new FileOutputStream(file);
ContentResolver resolver = context.getContentResolver();
Uri uri = Uri.parse("content://sms/");
Cursor cursor = resolver.query(uri, new String[] { "body", "address",
"type", "date" }, null, null, null);
// 开始备份的时候,设置进度条的最大值
int max = cursor.getCount();
// pd.setMax(max);
callBack.beforeBackup(max);
// 把用户的短信1条1条读出来,依照1定的格式写到文件里
XmlSerializer serializer = Xml.newSerializer();
// 初始化生成器
serializer.setOutput(fos, "utf⑻");
serializer.startDocument("utf⑻", true);
serializer.startTag(null, "smss");
serializer.attribute(null, "max", max + "");
int process = 0;
while (cursor.moveToNext()) {
Thread.sleep(500);
String body = cursor.getString(0);
String address = cursor.getString(1);
String type = cursor.getString(2);
String date = cursor.getString(3);
serializer.startTag(null, "sms");
serializer.startTag(null, "body");
serializer.text(body);
serializer.endTag(null, "body");
serializer.startTag(null, "address");
serializer.text(address);
serializer.endTag(null, "address");
serializer.startTag(null, "type");
serializer.text(type);
serializer.endTag(null, "type");
serializer.startTag(null, "date");
serializer.text(date);
serializer.endTag(null, "date");
serializer.endTag(null, "sms");
// 备份进程中,增加进度
process++;
// pb.setProgress(process);
// pd.setProgress(process);
callBack.onSmsBackup(process);
}
cursor.close();
serializer.endTag(null, "smss");
serializer.endDocument();
fos.close();
// pd.dismiss();
}
}
SmsActivity
package com.example.Darkbutton;
import com.example.Darkbutton.Utils.SmsUtils;
import com.example.Darkbutton.Utils.SmsUtils.BackUpCallBack;
import android.app.Activity;
import android.app.ProgressDialog;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.Toast;
public class SmsActivity extends Activity implements OnClickListener {
private Button button1;
private ProgressDialog pd;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sms_activity);
button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(this);
}
@Override
public void onClick(View v) {
pd = new ProgressDialog(this);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setMessage("正在备份短信");
pd.show();
new Thread(){
@Override
public void run() {
try {
SmsUtils.backupSms(SmsActivity.this,new BackUpCallBack() {
@Override
public void onSmsBackup(int progress) {
pd.setProgress(progress);
}
@Override
public void beforeBackup(int max) {
pd.setMax(max);
}
});
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(SmsActivity.this, "备份成功", 0).show();
}
});
} catch (Exception e) {
e.printStackTrace();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(SmsActivity.this, "备份失败", 0).show();
}
});
}finally{
pd.dismiss();
}
};
}.start();
}
}
由于代码在我测试demo里面 还放了1些其他东西,所以源码就不放上了。 最后记得加上权限哦
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.WRITE_SMS"/>
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠