业务逻辑经常改的话,那么定义接口是很有用的。
这样就可以做到,别人说一句话,你就改一句话。而不是别人说一句话,你改一坨代码。
接口里面可以通过参数把数据传递给接口的实现类,那么接口,以及原来的东西都不需要改。
例子:
package com.itheima.mobileguard.utils;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import org.xmlpull.v1.XmlSerializer;
import android.R.integer;
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.os.SystemClock;
import android.util.Xml;
import android.widget.ProgressBar;
/**
* ============================================================
*
* 版 权 : 黑马程序员教育集团 版权所有 (c) 2015
*
* 作 者 : 马伟奇
*
* 版 本 : 1.0
*
* 创建日期 : 2015-3-3 上午9:15:03
*
* 描 述 :
*
* 短信备份的工具类 修订历史 :
*
* ============================================================
**/
public class SmsUtils {
/**
* 备份短信的接口
* @author Administrator
*
*/
public interface BackUpCallBackSms{
public void befor(int count);
public void onBackUpSms(int process);
}
public static boolean backUp(Context context, BackUpCallBackSms callback) {
/**
* 目的 : 备份短信:
*
* 1 判断当前用户的手机上面是否有sd卡
* 2 权限 ---
* 使用内容观察者
* 3 写短信(写到sd卡)
*
*
*/
// 判断当前sd卡的状态
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
// 如果能进来就说明用户有SD卡
ContentResolver resolver = context.getContentResolver();
// 获取短信的路径
Uri uri = Uri.parse("content://sms/");
// type = 1 接收短信
// type = 2 发送短信
// cursor 表示游标的意思
Cursor cursor = resolver.query(uri, new String[] { "address",
"date", "type", "body" }, null, null, null);
//获取当前一共有多少条短信
int count = cursor.getCount();
//设置pd的最大值
// pd.setMax(count);
// progressBar1.setMax(count);
callback.befor(count);
//进度条默认是0
int process = 0;
// 写文件
try {
// 把短信备份到sd卡 第二个参数表示名字
File file = new File(Environment.getExternalStorageDirectory(),
"backup.xml");
FileOutputStream os = new FileOutputStream(file);
// 得到序列化器
// 在android系统里面所有有关xml的解析都是pull解析
XmlSerializer serializer = Xml.newSerializer();
// 把短信序列化到sd卡然后设置编码格式
serializer.setOutput(os, "utf-8");
// standalone表示当前的xml是否是独立文件 ture表示文件独立。yes
serializer.startDocument("utf-8", true);
// 设置开始的节点 第一个参数是命名空间。第二个参数是节点的名字
serializer.startTag(null, "smss");
//设置smss节点上面的属性值 第二个参数是名字。第三个参数是值
serializer.attribute(null, "size", String.valueOf(count));
// 游标往下面进行移动
while (cursor.moveToNext()) {
System.err.println("----------------------------");
System.out.println("address = " + cursor.getString(0));
System.out.println("date = " + cursor.getString(1));
System.out.println("type = " + cursor.getString(2));
System.out.println("body = " + cursor.getString(3));
serializer.startTag(null, "sms");
serializer.startTag(null, "address");
// 设置文本的内容
serializer.text(cursor.getString(0));
serializer.endTag(null, "address");
serializer.startTag(null, "date");
serializer.text(cursor.getString(1));
serializer.endTag(null, "date");
serializer.startTag(null, "type");
serializer.text(cursor.getString(2));
serializer.endTag(null, "type");
serializer.startTag(null, "body");
//读取短信的内容
/**
* 加密:第一个参数表示加密种子(密钥)
* 第二个参数表示加密的内容
*/
serializer.text(Crypto.encrypt("123", cursor.getString(3)));
serializer.endTag(null, "body");
serializer.endTag(null, "sms");
//序列化完一条短信之后就需要++
process++;
// pd.setProgress(process);
//
// progressBar1.setProgress(process);
callback.onBackUpSms(process);
SystemClock.sleep(200);
}
cursor.close();
serializer.endTag(null, "smss");
serializer.endDocument();
os.flush();
os.close();
return true;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return false;
}
}
package com.itheima.mobileguard.activities;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;
import com.itheima.mobileguard.R;
import com.itheima.mobileguard.utils.SmsUtils;
import com.itheima.mobileguard.utils.SmsUtils.BackUpCallBackSms;
import com.itheima.mobileguard.utils.UIUtils;
import com.lidroid.xutils.ViewUtils;
import com.lidroid.xutils.view.annotation.ViewInject;
/**
* ============================================================
*
* 版 权 : 黑马程序员教育集团 版权所有 (c) 2015
*
* 作 者 : 马伟奇
*
* 版 本 : 1.0
*
* 创建日期 : 2015-3-3 上午9:10:18
*
* 描 述 :
*
* 高级工具
* 修订历史 :
*
* ============================================================
**/
public class AtoolsActivity extends Activity {
private Button button;
private ProgressDialog pd;
@ViewInject(R.id.progressBar1)
private ProgressBar progressBar1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_atools);
ViewUtils.inject(this);
}
public void numberAddressQuery(View view){
Intent intent = new Intent(this,NumberAddressQueryActivity.class);
startActivity(intent);
}
/**
* 备份短信
* @param view
*/
public void backUpsms(View view){
//初始化一个进度条的对话框
pd = new ProgressDialog(AtoolsActivity.this);
pd.setTitle("提示");
pd.setMessage("稍安勿躁。正在备份。你等着吧。。");
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.show();
new Thread(){
public void run() {
boolean result = SmsUtils.backUp(AtoolsActivity.this,new BackUpCallBackSms() {
@Override
public void onBackUpSms(int process) {
pd.setProgress(process);
progressBar1.setProgress(process);
}
@Override
public void befor(int count) {
pd.setMax(count);
progressBar1.setMax(count);
}
});
if(result){
//安全弹吐司的方法
UIUtils.showToast(AtoolsActivity.this, "备份成功");
}else{
UIUtils.showToast(AtoolsActivity.this, "备份失败");
}
pd.dismiss();
};
}.start();
}
}