【0068】【项目实战】-【手机安全卫士】-【8】高级工具-短信备份
1.短信备份
1.1 短信备份的功能

1.2 布局增加


【源码】


【目前的效果】

【说明】
【1】最大的短信条目的数据应该根据实际的数据条目进行改写;
【2】每备份一条短信就应该随时改变短信的已经备份的数目;
【3】进度百分比也应该随着进行改变;

1.3 短信获取的思路分析
【总结】


【短信的数据库】


【短信备份的地址】



【源码的查看】




【创建短信的引擎类】

【需要传递三个参数】

1.4 对话框显示短信备份进度设置
【数据库的数据写入到xml中】

【短信备份的格式】xml的数据字段的定义

【源码】将数据库中的数据读取写入到xml中;
1 package com.itheima.mobilesafe74.engine; 2 3 import java.io.File; 4 import java.io.FileOutputStream; 5 import java.io.IOException; 6 import org.xmlpull.v1.XmlSerializer; 7 import android.content.Context; 8 import android.database.Cursor; 9 import android.net.Uri; 10 import android.util.Xml; 11 12 public class SmsBackUp { 13 private static int index = 0; 14 15 //备份短信方法 16 //ProgressDialog pd 原来的对话框 17 //现在改为进度条 18 19 //A,传递一个进度条所在的对话框 20 //B,传递一个进度条 21 22 public static void backup(Context ctx,String path,CallBack callBack) { 23 FileOutputStream fos = null; 24 Cursor cursor = null; 25 try { 26 //需要用到的对象上下文环境,备份文件夹路径,进度条所在的对话框对象用于备份过程中进度的更新 27 //1,获取备份短信写入的文件 28 File file = new File(path); 29 //2,获取内容解析器,获取短信数据库中数据 30 cursor = ctx.getContentResolver().query(Uri.parse("content://sms/"), 31 new String[]{"address","date","type","body"}, null, null, null); 32 //3,文件相应的输出流 33 fos = new FileOutputStream(file); 34 //4,序列化数据库中读取的数据,放置到xml中 35 XmlSerializer newSerializer = Xml.newSerializer(); 36 //5,给次xml做相应设置 37 newSerializer.setOutput(fos, "utf-8"); 38 //DTD(xml规范) 39 newSerializer.startDocument("utf-8", true); 40 41 newSerializer.startTag(null, "smss"); 42 43 44 //7,读取数据库中的每一行的数据写入到xml中 45 while(cursor.moveToNext()){ 46 newSerializer.startTag(null, "sms"); 47 48 newSerializer.startTag(null, "address"); 49 newSerializer.text(cursor.getString(0)); 50 newSerializer.endTag(null, "address"); 51 52 newSerializer.startTag(null, "date"); 53 newSerializer.text(cursor.getString(1)); 54 newSerializer.endTag(null, "date"); 55 56 newSerializer.startTag(null, "type"); 57 newSerializer.text(cursor.getString(2)); 58 newSerializer.endTag(null, "type"); 59 60 newSerializer.startTag(null, "body"); 61 newSerializer.text(cursor.getString(3)); 62 newSerializer.endTag(null, "body"); 63 64 newSerializer.endTag(null, "sms"); 65 66 } 67 newSerializer.endTag(null, "smss"); 68 newSerializer.endDocument(); 69 } catch (Exception e) { 70 e.printStackTrace(); 71 }finally{ 72 try { 73 if(cursor!=null && fos!=null){ 74 cursor.close(); 75 fos.close(); 76 } 77 } catch (IOException e) { 78 e.printStackTrace(); 79 } 80 } 81 } 82 83 }
【源码】对话框的需要备份的最大值

【源码】进度条的增加


【源码】关流


【bug】增加权限



【效果】

【源码】关闭对话框-可以在子线程中执行,因为progressDialog比较特殊;

【效果】短信对话框在备份结束之后自动消失;

2.回调的应用-重要的知识点
【功能】每个短信备份之后进度条走过对应的宽度;将原来的对话框进度条改为现在进度条显示;
2.1 回调应用场景分析
【说明】在上述是使用对话框进度条进行指示短信的备份,现在使用的是进度条的形式指示,如果在引擎代码中可以同时兼容这两种模式,哪种都可以用的话,该怎么兼容?
【水平进度条】





【效果】四条短信进行备份;

【说明】在上述是使用对话框进度条进行指示短信的备份,现在使用的是进度条的形式指示,如果在引擎代码中可以同时兼容这两种模式,哪种都可以用的话,该怎么兼容?
【答】解决的办法 使用回调机制;
2.2 回调在短信备份中的使用-回调的四个步骤
【说明】按钮的点击事件是典型的回调的应用;google只维护了回调的机制,但是具体的调用做哪些工作由程序猿自己完成;
1 package com.example.demo; 2 3 import android.os.Bundle; 4 import android.app.Activity; 5 import android.view.Menu; 6 import android.view.View; 7 import android.view.View.OnClickListener; 8 import android.widget.Button; 9 10 public class MainActivity extends Activity { 11 12 @Override 13 protected void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 setContentView(R.layout.activity_main); 16 17 //典型回调 18 Button bt_click = (Button) findViewById(R.id.bt_click); 19 bt_click.setOnClickListener(new OnClickListener() { 20 @Override 21 public void onClick(View v) { 22 23 } 24 }); 25 //1.抬起的时候,做onClick方法的调用 26 //2.android在sdk调用onClick方法的是,知道此方法要去做什么? 27 //3.onclick方法中所做操作由自己决定 28 //A(程序员用户):打印一个吐司 29 //B(程序员用户):打印一段日志 30 //C(程序员用户):请求网络 31 //D(程序员用户):弹出一张图片 32 //....... 33 34 // 35 } 36 }
【需要兼容的代码】
【1】备份短信的总数

【2】进度条的百分比

【回调的四个步骤】







【测试效果】两种效果都存在;增加了随意性,可以任意屏蔽一种;


【最后备份的内容】

【回调方法调用的回顾】可以参照视频:回调回顾;
浙公网安备 33010602011771号