【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】进度条的百分比

【回调的四个步骤】

 

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

 

【最后备份的内容】

【回调方法调用的回顾】可以参照视频:回调回顾;

 

posted @ 2018-02-06 20:52  OzTaking  阅读(324)  评论(0)    收藏  举报