国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php开源 > 综合技术 > 练手小项目(5)安全卫士_利用内容提供者进行短信备份 修正版

练手小项目(5)安全卫士_利用内容提供者进行短信备份 修正版

来源:程序员人生   发布时间:2014-12-22 08:56:18 阅读次数:2256次

     短信备份类,我在上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"/>


生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生