备份短信与回调

来源:互联网 发布:网络推广职责 编辑:程序博客网 时间:2024/06/16 18:44
1.找到短信所在数据库对应的表
data/data/com.android.providers.telephony/databases/mmssms.db/sms表

获取其相应的四个字段(address 电话号码 date 时间 type:接收,发送 body:短信内容)

2.访问数据库方式,系统数据库有提供内容提供者(),通过内容解析器解析,Uri地址(源码)
3.访问数据库中sms表的Uri地址content://sms/
4.将获取短信的查询过程封装到单独的一个引擎类中去SmsBackUp

package com.example.phone.engine;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import org.xmlpull.v1.XmlSerializer;import android.app.ProgressDialog;import android.content.Context;import android.database.Cursor;import android.net.Uri;import android.os.SystemClock;import android.util.Xml;public class SmsBackup {public static void backup(Context context, String path, Callback callback) {Cursor cursor = null;FileOutputStream fos = null;try {int index = 0;cursor = context.getContentResolver().query(Uri.parse("content://sms"),new String[] { "address", "date", "type", "body" }, null, null, null);if(callback != null) {callback.setMax(cursor.getCount());}File file = new File(path);fos = new FileOutputStream(file);XmlSerializer serializer = Xml.newSerializer();serializer.setOutput(fos, "utf-8");serializer.startDocument("utf-8", true);serializer.startTag(null, "smss");while(cursor.moveToNext()) {serializer.startTag(null, "sms");serializer.startTag(null, "address");serializer.text(cursor.getString(0));serializer.endTag(null, "address");serializer.startTag(null, "date");serializer.text(cursor.getString(1));serializer.endTag(null, "date");serializer.startTag(null, "type");serializer.text(cursor.getString(2));serializer.endTag(null, "type");serializer.startTag(null, "body");serializer.text(cursor.getString(3));serializer.endTag(null, "body");serializer.endTag(null, "sms");index++;if(callback != null) {callback.setProgress(index);}SystemClock.sleep(100);}serializer.endTag(null, "smss");serializer.endDocument();} catch (Exception e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {try {cursor.close();fos.close();} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}public interface Callback {public void setMax(int max);public void setProgress(int index);}}
在短信备份过程中显示一个对话框或进度条,因为备份方法中要更新进度而且要同时满足对话框和进度条的更新,所以用回调。

1.定义一个接口
2,定义接口中未实现的业务逻辑方法
3.传递一个实现了此接口的类的对象,一定实现了上诉接口未实现方法
4.获取传递进来的对象,在合适的地方,做方法的调用
如上代码,创建了一个接口callback,其中声明了更新进度需要的方法,并在备份方法中传入该接口的实例,使用该实例来调用方法。

而在传入该参数的方法时则需要重写接口里的方法,即对话框和进度条的方法。

SmsBackup.backup(getApplication(), path , new Callback() {@Overridepublic void setProgress(int index) {// TODO Auto-generated method stubprogressDialog.setProgress(index);}@Overridepublic void setMax(int max) {// TODO Auto-generated method stubprogressDialog.setMax(max);}});



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 淘宝购物出现质量问题怎么办 淘宝购物降价了怎么办 淘宝购物物流慢怎么办 在淘宝购物退货怎么办 淘宝购物未付款怎么办 淘宝购物余额不足怎么办 淘宝购物漏发货怎么办 京东618无货怎么办 iis默认文档无效怎么办? 购物卡没有磁性怎么办 墙面贴纸没有贴怎么办 车显示电池符号怎么办 遇上北京购物团怎么办 钱柜老是钱不见怎么办 写真顾客退单怎么办 电视不支持投屏怎么办 qq转错账的钱怎么办 qq关注不了别人怎么办 换货忘记要单号怎么办 快递提前签收了怎么办 签收了不明快递怎么办 京东签收了怎么办 快递被签收了怎么办 香港旅游团强制购物怎么办 爱奇艺京东会员领不了怎么办 买手机买到翻新机怎么办 买了翻新机怎么办 苹果四激活出错怎么办 电脑登陆密码忘记了怎么办 手机号不用微信怎么办 笔记本无限重启怎么办 键盘c键失灵怎么办 买到假避孕套用了怎么办 聚爆装备栏已满怎么办 银行卡被限制了怎么办 身份证被限制了怎么办 手机上网被限制怎么办 转转被限制了怎么办 上班想要拍拍拍怎么办 我下面好想要怎么办 企业资金链断裂怎么办