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

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

 

 

 

<think>根据用户的问题,用户想知道在GCC 4.8中如何支持C++11的std::regex_match函数。然而,从引用[3]中可以看到,GCC 4.9.0以下版本虽然有regex头文件,但库未实现,因此编译通过但运行时会抛出异常。所以,GCC 4.8并不完全支持std::regex。 解决方案: 1. 升级GCC到4.9.0及以上版本,因为从4.9.0开始,GCC才完全支持std::regex。 2. 如果无法升级,可以考虑使用第三方正则表达式库,如Boost.Regex(用户引用中提到了boost::regex,它兼容C++98,可以在GCC 4.8中使用)。 因此,我们可以给出两种方案:升级GCC或使用Boost.Regex。 具体实现步骤: 方案一:升级GCC 步骤1:下载并安装更高版本的GCC(至少4.9.0) 步骤2:使用新版本的GCC编译代码 方案二:使用Boost.Regex 步骤1:安装Boost库(如果尚未安装) 步骤2:包含头文件<boost/regex.hpp> 步骤3:使用boost::regex_match等函数替代std::regex_match 示例代码(使用Boost.Regex): ```cpp #include <boost/regex.hpp> #include <iostream> #include <string> int main() { std::string str = "Hello, world!"; boost::regex pattern("Hello.*"); if (boost::regex_match(str, pattern)) { std::cout << "Match!" << std::endl; } else { std::cout << "No match." << std::endl; } return 0; } ``` 编译时需要链接Boost.Regex库,例如: g++ -o test test.cpp -lboost_regex 注意:Boost.Regex的用法与std::regex非常相似,但命名空间是boost。 由于用户引用[1]中提到了std::regex的用法,我们可以对比一下std::regex和boost::regex的用法差异: | 功能 | std::regex (C++11) | boost::regex | |--------------|--------------------------------|----------------------------------| | 完全匹配 | std::regex_match(str, pattern) | boost::regex_match(str, pattern) | | 搜索 | std::regex_search | boost::regex_search | | 替换 | std::regex_replace | boost::regex_replace | | 迭代匹配 | std::sregex_iterator | boost::sregex_iterator | 因此,如果用户无法升级GCC,使用Boost.Regex是一个可行的替代方案。 另外,引用[3]明确指出了GCC 4.9.0以下版本的问题,所以用户如果坚持使用GCC 4.8,那么只能避免使用std::regex,而选择其他方案。 总结: 在GCC 4.8中,由于标准库对std::regex的支持不完整,建议使用Boost.Regex作为替代。 相关问题: 1. 如何安装Boost库? 2. 除了Boost.Regex,还有哪些正则表达式库可以在C++中使用? 3. GCC 4.8中还有哪些C++11特性不被支持?</think>### GCC 4.8 中实现 std::regex_match 的解决方案 在 GCC 4.8 中,虽然包含 `<regex>` 头文件,但其标准库对 `std::regex` 的实现**不完整**(引用[^3])。编译时可能通过,但运行时会抛出异常。以下是两种可行的解决方案: --- ### 方案一:升级 GCC 编译器(推荐) **直接升级到 GCC 4.9.0 或更高版本**(如 GCC 5+),这些版本已完整实现 `std::regex` 功能。 **安装示例**(Ubuntu): ```bash sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt-get update sudo apt-get install gcc-9 g++-9 # 安装 GCC 9 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 # 设为默认 ``` --- ### 方案二:使用 Boost.Regex 库(兼容 GCC 4.8) 若无法升级 GCC,可用 **Boost.Regex** 替代(兼容 C++98/C++11): 1. **安装 Boost 库**: ```bash sudo apt-get install libboost-regex-dev # Debian/Ubuntu ``` 2. **代码改造**: ```cpp #include <boost/regex.hpp> // 替换 #include <regex> #include <iostream> int main() { std::string str = "Hello123"; boost::regex pattern("\\w+\\d{3}"); // 使用 boost::regex 而非 std::regex if (boost::regex_match(str, pattern)) { // 使用 boost::regex_match std::cout << "匹配成功!" << std::endl; } return 0; } ``` 3. **编译命令**: ```bash g++ -std=c++11 test.cpp -lboost_regex -o test ``` --- ### 关键差异对比 | 功能 | `std::regex` (GCC ≥4.9) | `boost::regex` (GCC 4.8) | |--------------|-------------------------------|--------------------------------| | **头文件** | `<regex>` | `<boost/regex.hpp>` | | **命名空间** | `std` | `boost` | | **兼容性** | 仅 GCC 4.9+ | 支持 GCC 4.8 及更低版本 | | **性能** | 较慢(引用[^1]) | 中等 | | **安装** | 无需额外库 | 需安装 `libboost-regex-dev` | --- ### 注意事项 1. **第三方库的局限性** 若需跨平台或高性能场景(如大文本处理),可考虑 **PCRE 库**(Perl兼容正则),但需额外安装(引用[^1])。 2. **简单场景的替代方案** 对于基础字符串匹配(如固定子串),直接使用 `std::string::find()` 更高效(引用[^1])。 3. **GCC 4.8 的 C++11 支持缺陷** `std::regex` 并非 GCC 4.8 唯一未完整实现的特性,类似问题可能出现在 `<thread>`, `<future>` 等模块中(引用[^3])。 > **总结**:优先升级编译器;若受环境限制,用 Boost.Regex 是可靠替代方案。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值