练手小项目(5)安全卫士_利用内容提供者进行短信备份 修正版

来源:互联网 发布:淘宝销量代码 编辑:程序博客网 时间:2024/05/19 06:39

     短信备份类,我在上一节基本全部讲完了,代码的迭代开发,是需要的,开发完就需要做代码重构,解耦


可学到的知识点

①接口的应用

②简单的ui线程使用runOnUiThread


上一节,讲到 如果公司老板频繁的话UI需求的话,对于一个项目组来说是很头痛的,因为基本是一个人负责UI,一个人负责业务类的。所以为了解耦,我们要改造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);

当工具类走到这一步,因为接口的抽象方法在调用者那里写着,所以最后还是执行了 调用者类中的

pd.setProgress(progress);

依次类推

//            pd.setProgress(process);            callBack.onSmsBackup(process);
走到这里的时候,确实也是调用了

pd.setMax(max);
这时候 progressbar 就会出现了。就这样解耦了


②简单的ui线程使用runOnUiThread

因为备份短信的时候,顾虑到可能用户的短信比较多,所以开启了一个子线程进行更新,然后又要使用到Toast  这个时候 简单的使用UI更新 就会使用到他


runOnUiThread



runOnUiThread(new Runnable() {@Overridepublic 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);// 把用户的短信一条一条读出来,按照一定的格式写到文件里XmlSerializer serializer = Xml.newSerializer();// 初始化生成器serializer.setOutput(fos, "utf-8");serializer.startDocument("utf-8", 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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.sms_activity);button1 = (Button) findViewById(R.id.button1);button1.setOnClickListener(this);}@Overridepublic void onClick(View v) {pd = new ProgressDialog(this);pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);pd.setMessage("正在备份短信");pd.show();new Thread(){ @Overridepublic void run() {try {SmsUtils.backupSms(SmsActivity.this,new BackUpCallBack() {@Overridepublic void onSmsBackup(int progress) {pd.setProgress(progress);}@Overridepublic void beforeBackup(int max) {pd.setMax(max);}});runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(SmsActivity.this, "备份成功", 0).show();}});} catch (Exception e) {e.printStackTrace();runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(SmsActivity.this, "备份失败", 0).show();}});}finally{pd.dismiss();}};}.start();}}

因为代码在我测试demo里面 还放了一些其他东西,所以源码就不放上了。 最后记得加上权限哦

     <uses-permission android:name="android.permission.READ_SMS"/>     <uses-permission android:name="android.permission.WRITE_SMS"/>


0 0
原创粉丝点击