練手小項目(5)安全衛士_利用內容提供者進行簡訊備份 修正版,練手提供者
簡訊備份類,我在上一節基本全部講完了,代碼的反覆式開發法,是需要的,開發完就需要做代碼重構,解耦
可學到的知識點
①介面的應用
②簡單的ui線程使用runOnUiThread
上一節,講到 如果公司老闆頻繁的話UI需求的話,對於一個項目組來說是很頭痛的,因為基本是一個人負責UI,一個人負責業務類的。所以為瞭解耦,我們要改造Smsutils
因為在類中經常變動的就是 UI,開始備份的時候,設定進度的最大值 ,備份過程中,增加進度 所以我們就把經常變動的抽出來定義成介面,讓使用者選擇傳遞什麼樣的值。
①介面的應用
/** * 備份簡訊的回調介面 */public interface BackUpCallBack {/** * 開始備份的時候,設定進度的最大值 * * @param max * 總進度 */public void beforeBackup(int max);/** * 備份過程中,增加進度 * * @param progress * 當前進度 */public void onSmsBackup(int progress);}
// pd.setMax(max);
callBack.beforeBackup(max);
當工具類走到這一步,因為介面的抽象方法在調用者那裡寫著,所以最後還是執行了 調用者類中的
pd.setProgress(progress);
依次類推
// pd.setProgress(process); callBack.onSmsBackup(process);
走到這裡的時候,確實也是調用了
pd.setMax(max);
這時候 progressbar 就會出現了。就這樣解耦了
②簡單的ui線程使用runOnUiThread
因為備份簡訊的時候,顧慮到可能使用者的簡訊比較多,所以開啟了一個子線程進行更新,然後又要使用到Toast 這個時候 簡單的使用UI更新 就會使用到他
runOnUiThread
runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(SmsActivity.this, "備份成功", 0).show();}});
SmsUtils.java 備份簡訊工具類
package com.example.Darkbutton.Utils;import java.io.File;import java.io.FileOutputStream;import org.xmlpull.v1.XmlSerializer;import android.app.ProgressDialog;import android.content.ContentResolver;import android.content.Context;import android.database.Cursor;import android.net.Uri;import android.os.Environment;import android.util.Xml;/** * 簡訊的工具類 * */public class SmsUtils {/** * 備份簡訊的回調介面 */public interface BackUpCallBack {/** * 開始備份的時候,設定進度的最大值 * * @param max * 總進度 */public void beforeBackup(int max);/** * 備份過程中,增加進度 * * @param progress * 當前進度 */public void onSmsBackup(int progress);}public static void backupSms(Context context, BackUpCallBack callBack) throws Exception {//ProgressDialog pd=new ProgressDialog(context);//pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);//pd.setMessage("正在備份資料");//pd.show();File file = new File(Environment.getExternalStorageDirectory(),"backup.xml");FileOutputStream fos = new FileOutputStream(file);ContentResolver resolver = context.getContentResolver();Uri uri = Uri.parse("content://sms/");Cursor cursor = resolver.query(uri, new String[] { "body", "address","type", "date" }, null, null, null);// 開始備份的時候,設定進度條的最大值int max = cursor.getCount();//pd.setMax(max);callBack.beforeBackup(max);// 把使用者的簡訊一條一條讀出來,按照一定的格式寫到檔案裡XmlSerializer serializer = Xml.newSerializer();// 初始化產生器serializer.setOutput(fos, "utf-8");serializer.startDocument("utf-8", true);serializer.startTag(null, "smss");serializer.attribute(null, "max", max + "");int process = 0;while (cursor.moveToNext()) {Thread.sleep(500);String body = cursor.getString(0);String address = cursor.getString(1);String type = cursor.getString(2);String date = cursor.getString(3);serializer.startTag(null, "sms");serializer.startTag(null, "body");serializer.text(body);serializer.endTag(null, "body");serializer.startTag(null, "address");serializer.text(address);serializer.endTag(null, "address");serializer.startTag(null, "type");serializer.text(type);serializer.endTag(null, "type");serializer.startTag(null, "date");serializer.text(date);serializer.endTag(null, "date");serializer.endTag(null, "sms");// 備份過程中,增加進度process++;// pb.setProgress(process);//pd.setProgress(process);callBack.onSmsBackup(process);}cursor.close();serializer.endTag(null, "smss");serializer.endDocument();fos.close();// pd.dismiss();}}
SmsActivity
package com.example.Darkbutton;import com.example.Darkbutton.Utils.SmsUtils;import com.example.Darkbutton.Utils.SmsUtils.BackUpCallBack;import android.app.Activity;import android.app.ProgressDialog;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.Toast;public class SmsActivity extends Activity implements OnClickListener {private Button button1;private ProgressDialog pd;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.sms_activity);button1 = (Button) findViewById(R.id.button1);button1.setOnClickListener(this);}@Overridepublic void onClick(View v) {pd = new ProgressDialog(this);pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);pd.setMessage("正在備份簡訊");pd.show();new Thread(){ @Overridepublic void run() {try {SmsUtils.backupSms(SmsActivity.this,new BackUpCallBack() {@Overridepublic void onSmsBackup(int progress) {pd.setProgress(progress);}@Overridepublic void beforeBackup(int max) {pd.setMax(max);}});runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(SmsActivity.this, "備份成功", 0).show();}});} catch (Exception e) {e.printStackTrace();runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(SmsActivity.this, "備份失敗", 0).show();}});}finally{pd.dismiss();}};}.start();}}
因為代碼在我測試demo裡面 還放了一些其他東西,所以源碼就不放上了。 最後記得加上許可權哦
<uses-permission android:name="android.permission.READ_SMS"/> <uses-permission android:name="android.permission.WRITE_SMS"/>