4.8 抽象接口, 回调函数: 短信备份

本文介绍了一种用于备份Android系统短信到SD卡XML文件的方法。通过SmsUtils工具类实现短信序列化,并提供了备份进度回调机制。在Activity中调用该工具类,实现了短信备份的全过程。

1.创建读取短信的一个工具类,读取系统短信序列化到SDcard下的xml文件下

2.smsUtils提供一个接口,接口内提供两个回调函数, 将接口作为参数传给工具类

3.在activity中调用dao层内的方法,重写借口内的回调函数,得到短信的总数和序列化短信的条数

 

 

 

---------------------------------------------------------------------------------------------------------------------------
1.创建读取短信的一个工具类,读取系统短信序列化到SDcard下的xml文件下
2.smsUtils提供一个接口,接口内提供两个回调函数, 将接口作为参数传给工具类

/**
 * 备份短信工具类
 * @author Administrator
 *
 */
public class SmsUtils {
      
      
      /**
       * 得到总共需要 备份多少条短信的条数,和当前备份了多少条短信的条数的接口
       * @author Administrator
       *
       */
      public interface  BackupCallback{
            
             /**
             * 在备份短信之前调用的方法
             * @param total 一共有多少个短信需要备份
             */
             public void beforeBackup( int total);    //把total传给调用类
            
             /**
             * 在短信备份的过程中调用的方法
             * @param process 当前已经备份了多少条的数据
             */
             public void onBackupProcess( int process);    //把process传给调用类
            
            
      }
      
      
      
      
      
      
      private static final String TAG = "SmsUtils";

      public  static void  backupSms(Context context,String path,BackupCallback  callback) throws Exception{
            
             //读取系统短信序列化到 sd卡中的xml文件上
            XmlSerializer serializer = Xml. newSerializer();
            
            File file= new File(path);
            FileOutputStream  fos= new FileOutputStream(file);
            serializer.setOutput(fos, "UTF-8");
            
             //创建内容解析这读取系统短信内容
              ContentResolver resolver = context.getContentResolver();
              Cursor cursor = resolver.query(Uri.parse("content://sms/"), new String[]{"address","date" ,"type" ,"body" }, null, null, null);
              int total = cursor.getColumnCount();   //得到数据库有多少条数据
              Log. i(TAG, "总共有" +total+"条短信" );
              callback.beforeBackup(total); //总共需要备份多少条短信
            
             
              //系列化系统短信到 xml文件上
              serializer.startDocument( "UTF-8", true);
              serializer.startTag( null, "smss");
             
              int process=0;
              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");
                    fos.flush();
                   
                    process++;
                    callback.onBackupProcess(process);   //当前备份了多少条数据
              }
              serializer.endTag( null, "smss");
              serializer.endDocument();
             
              //关闭资源
              cursor.close();
              fos.close();
             
      }
      
      
      
      

}



-------------------------------------------------------------------------------------------------------------------------------------

3.在activity中调用dao层内的方法,重写借口内的回调函数,得到短信的总数和序列化短信的条数


/**
 * 短信的备份
 * @param v
 */
private ProgressDialog pd  //声明进度条对话框
private ProgressBar  pb_progress ;

public void backupSms(View v){
      Log.i(TAG , "备份短信......." );
      
   //获取并判断手机的SD卡状态
    String state = Environment. getExternalStorageState();
     if(!Environment. MEDIA_MOUNTED.equals(state)){
          Toast. makeText(getApplicationContext(), "SD卡不存在", 0).show();
           return;
      }
    
        //创建进度条对话框
        pd = new ProgressDialog( this);
             pd.setTitle( "提醒:");
             pd.setMessage( "正在备份短信" );
             pd.setProgressStyle(ProgressDialog. STYLE_HORIZONTAL);
             pd.show();
        //找到进度条控件
             pb_progress=(ProgressBar) findViewById(R.id.pb_progress);
      
      
     //在子线程中进行耗时操作
      new Thread(){
             public void run() {
                  Log. i(TAG, "备份短信" );
                  
                   //在SD卡下创建xml文件
                   File file= new File(Environment.getExternalStorageDirectory(), "sms.xml");
                  
                   //调用短信备份工具类
                   try {
                        
                        SmsUtils. backupSms(getApplicationContext(), file.getAbsolutePath(),new BackupCallback(){

                               @Override
                               public void beforeBackup( int total) {
                                    
                                     //进度条最大值
                                     pd.setMax(total); 
                                     pb_progress.setMax(total);
                              }

                               @Override
                               public void onBackupProcess( int process) {
                                     //进度条进度
                                     pd.setProgress(process);
                                     pb_progress.setProgress(process);
                              }
                              
                              
                              
                        });
                        ToastUtils. showToastInThread(AtoolsActivity.this, "备份成功");
                         pd.dismiss(); //关闭进度条对话框
                        
                  } catch (Exception e) {
                        e.printStackTrace();
                        ToastUtils. showToastInThread(AtoolsActivity.this, "备份失败");
                  }
                  

            }
            
      }.start();
      
      
      
}

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值