日本搞逼视频_黄色一级片免费在线观看_色99久久_性明星video另类hd_欧美77_综合在线视频

國內最全IT社區平臺 聯系我們 | 收藏本站
阿里云優惠2
您當前位置:首頁 > php開源 > 綜合技術 > 練手小項目(5)安全衛士_利用內容提供者進行短信備份 修正版

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


生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關閉
程序員人生
主站蜘蛛池模板: 黄a视频在线观看 | 99国产精品久久久 | 国产精品高清在线观看 | 亚洲精品一区二区在线 | 在线看国产 | 日韩精品成人一区二区在线观看 | 国产一区二区三区四 | 欧美日韩国产专区 | 免费看的av| 欧美3区| 国产精品久久久久精 | 中文字幕二区 | 一级毛片观看 | 日韩欧美在线一区二区 | www免费视频 | 国产免费大片 | 天堂中文在线视频 | 黄色免费大片 | 国产精品久久久久久久久免费蜜臀 | 国产一区二区三区四区三区四 | 国产精品69久久久久水密桃 | 久久久精品一区二区三区 | 不卡中文一二三区 | 久热福利视频 | 亚洲 欧美 日韩在线 | 国产成人精品免费视频 | 91精品国产乱码久久久久久久久 | 国产精品久久久久久久久免费 | 亚洲精品视频二区 | 福利视频久久 | 中文字幕二区丶 | 国产精品一区二区免费 | 激情婷婷丁香 | 黄色片在线免费观看 | 亚洲欧美一区二 | 成人在线观看免费网址 | 国产精品免费一区二区三区四区 | 欧美精品成人 | 黄色精品一区 | 91精品成人久久 | 久久久精品久久久久 |