昨天在学习回调的时候,发现了其独特的魅力之处,它将业务代码逻辑和我们的工具类耦合性大大降低了。
应用场景:在实际开发中,经常会随着用户的需求的改变而对对话框的样式进行相应修改,在短信的备份过程中,往往需要给用户显示一个对话框,以提示用户进度。
常见的回调的步骤分为4步:
//1,定义一个接口
//2,定义业务逻辑的抽象2个方法
//3,传递一个实现了第一步接口的实现类的对象进来(实现了未实现的抽象方法(将抽象的逻辑具体话))
//4,在合适的地方去调用实现类对象中,已经实现好的方法
代码如下:
1 public class SmsUtil { 2 private static Cursor cursor; 3 private static FileOutputStream fos; 4 private static int index = 0; 5 /** 6 * @param path 备份到的文件路径 7 * @param ctx 上下文环境 8 * @param pd 显示进度条的对话框 9 */ 10 public static void backUp(String path,Context ctx,SmsCallBack callBack) { 11 //1,在指定路径下去创建文件 12 File file = new File(path); 13 try { 14 fos = new FileOutputStream(file); 15 16 //2,准备要备份的数据,内容解析者要上下文环境 17 cursor = ctx.getContentResolver().query(Uri.parse("content://sms/"), 18 new String[]{"address","date","type","body"}, 19 null, null, null); 20 //设置对话框中进度条100%短信条数 21 if(callBack!=null){ 22 callBack.setMax(cursor.getCount()); 23 } 24 25 //3,获取xml的序列化器,做写入xml节点操作 26 XmlSerializer newSerializer = Xml.newSerializer(); 27 //向那个文件写入数据 28 newSerializer.setOutput(fos,"utf-8"); 29 newSerializer.startDocument("utf-8", true); 30 //设置跟节点(名空间,名称) 31 newSerializer.startTag(null, "smss"); 32 while(cursor.moveToNext()){ 33 //在循环遍历过程中,获取每一条短信,四个字段,对应着就是xm中的一个节点 34 newSerializer.startTag(null, "sms"); 35 36 newSerializer.startTag(null, "address"); 37 newSerializer.text(cursor.getString(cursor.getColumnIndex("address"))); 38 newSerializer.endTag(null, "address"); 39 40 newSerializer.startTag(null, "date"); 41 newSerializer.text(cursor.getString(cursor.getColumnIndex("date"))); 42 newSerializer.endTag(null, "date"); 43 44 newSerializer.startTag(null, "type"); 45 newSerializer.text(cursor.getString(cursor.getColumnIndex("type"))); 46 newSerializer.endTag(null, "type"); 47 48 newSerializer.startTag(null, "body"); 49 newSerializer.text(cursor.getString(cursor.getColumnIndex("body"))); 50 newSerializer.endTag(null, "body"); 51 52 newSerializer.endTag(null, "sms"); 53 54 //叠加进度条百分比 55 index++; 56 57 if(callBack!=null){ 58 //设置对话框的最大进度 59 callBack.setProgress(index); 60 } 61 62 Thread.sleep(500); 63 } 64 newSerializer.endTag(null, "smss"); 65 newSerializer.endDocument(); 66 } catch (Exception e) { 67 e.printStackTrace(); 68 }finally{ 69 try { 70 if(cursor!=null && fos!=null){ 71 cursor.close(); 72 fos.close(); 73 } 74 } catch (IOException e) { 75 e.printStackTrace(); 76 } 77 } 78 } 79 public interface SmsCallBack{ 80 //1,设置总进度方法 81 public void setMax(int max); 82 //2,设置当前进度的方法 83 public void setProgress(int progress); 84 } 85 }
这样在调用工具类实现短信备份功能的时候,就可以很方便的自定义对话框样式,而不需要再去修改业务逻辑。
SmsUtil.backup(sdPath, getApplicationContext(),new SmsCallBack() {public void setProgress(int progress) {}public void setMax(int max) {}、});