短信备份(原)
昨天在學習回調的時候,發現了其獨特的魅力之處,它將業務代碼邏輯和我們的工具類耦合性大大降低了。
應用場景:在實際開發中,經常會隨著用戶的需求的改變而對對話框的樣式進行相應修改,在短信的備份過程中,往往需要給用戶顯示一個對話框,以提示用戶進度。
常見的回調的步驟分為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 } View Code這樣在調用工具類實現短信備份功能的時候,就可以很方便的自定義對話框樣式,而不需要再去修改業務邏輯。
SmsUtil.backup(sdPath, getApplicationContext(),new SmsCallBack() {public void setProgress(int progress) {}public void setMax(int max) {}、});
轉載于:https://www.cnblogs.com/adv-qbj/p/4719794.html
總結
- 上一篇: 求方程解问题
- 下一篇: import-module的注意事项与N