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

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


可学到的知识点

①接口的应用

②简单的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() {
						
						@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);
		// 把用户的短信一条一条读出来,按照一定的格式写到文件里
		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;
	@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里面 还放了一些其他东西,所以源码就不放上了。 最后记得加上权限哦

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


你可能感兴趣的:(android,备份,短信,安全卫士)