練手小項目(5)安全衛士_利用內容提供者進行簡訊備份 修正版,練手提供者

來源:互聯網
上載者:User

練手小項目(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"/>


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.