練手小項目(5)安全衛士_利用內容提供者進行短信備份 修正版
來源:程序員人生 發布時間:2014-12-22 08:56:18 閱讀次數:2519次
短信備份類,我在上1節基本全部講完了,代碼的迭代開發,是需要的,開發完就需要做代碼重構,解耦
可學到的知識點
①接口的利用
②簡單的ui線程使用runOnUiThread
上1節,講到 如果公司老板頻繁的話UI需求的話,對1個項目組來講是很頭痛的,由于基本是1個人負責UI,1個人負責業務類的。所以為了解耦,我們要改造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);
當工具類走到這1步,由于接口的抽象方法在調用者那里寫著,所以最后還是履行了 調用者類中的
pd.setProgress(progress);
順次類推
// pd.setProgress(process);
callBack.onSmsBackup(process);
走到這里的時候,確切也是調用了
pd.setMax(max);
這時候候 progressbar 就會出現了。就這樣解耦了
②簡單的ui線程使用runOnUiThread
由于備份短信的時候,顧慮到可能用戶的短信比較多,所以開啟了1個子線程進行更新,然后又要使用到Toast 這個時候 簡單的使用UI更新 就會使用到他
runOnUiThread
runOnUiThread(new Runnable() {
@Override
public 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);
// 把用戶的短信1條1條讀出來,依照1定的格式寫到文件里
XmlSerializer serializer = Xml.newSerializer();
// 初始化生成器
serializer.setOutput(fos, "utf⑻");
serializer.startDocument("utf⑻", 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;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.sms_activity);
button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(this);
}
@Override
public void onClick(View v) {
pd = new ProgressDialog(this);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setMessage("正在備份短信");
pd.show();
new Thread(){
@Override
public void run() {
try {
SmsUtils.backupSms(SmsActivity.this,new BackUpCallBack() {
@Override
public void onSmsBackup(int progress) {
pd.setProgress(progress);
}
@Override
public void beforeBackup(int max) {
pd.setMax(max);
}
});
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(SmsActivity.this, "備份成功", 0).show();
}
});
} catch (Exception e) {
e.printStackTrace();
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(SmsActivity.this, "備份失敗", 0).show();
}
});
}finally{
pd.dismiss();
}
};
}.start();
}
}
由于代碼在我測試demo里面 還放了1些其他東西,所以源碼就不放上了。 最后記得加上權限哦
<uses-permission android:name="android.permission.READ_SMS"/>
<uses-permission android:name="android.permission.WRITE_SMS"/>
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈