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

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();
      
      
      
}

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值