手机安全卫士第七天实现的功能:
1.短信备份。
2.快捷图标的创建。
3.进程的界面显示。
首先进行的是短信备份功能,在高级工具布局文件中添加"短信备份",并处理其点击事件,点击之后备份短信到sd卡,备份短信需要使用内容提供者和解析者得到数据,然后用serializer进行xml存储,如果短信过多的话在主线程运行可能出现ANR,所有需要在子线程中进程存储,由于可能有经常改需求的必要,所有可以把不确定需求的抽取为接口,然后进行回调。接口的代码如下,在接口中,首先抽取了两个方法供实现类实现,分别为ProgressDialog的最大值和当前值,然后提供备份短信的方法,首先判断有无SD卡,然后拿到短信的数据用serializer进行存储。
<span style="font-size:14px;">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 backUpCallBackSms){
/**
* 目的 : 备份短信:
* 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的最大值
backUpCallBackSms.befor(count);
//设置当前的已备份的短信值
int process = 0;
try {
// 把短信备份到sd卡 第二个参数表示名字
File file = new File(Environment.getExternalStorageDirectory(),"sms.xml");
FileOutputStream fos = new FileOutputStream(file);
// 得到序列化器
// 在android系统里面所有有关xml的解析都是pull解析
XmlSerializer serializer = Xml.newSerializer();
// 把短信序列化到sd卡然后设置编码格式
serializer.setOutput(fos, "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()){
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++;
backUpCallBackSms.onBackUpSms(process);
SystemClock.sleep(50);
}
cursor.close();
serializer.endTag(null, "smss");
serializer.endDocument();
fos.flush();
fos.close();
return true;
} catch (Exception e) {
e.printStackTrace();
}
}
return false;
}
}</span>
然后实现点击备份短信的监听事件,直接调用备份短信的方法即可。
/**
* 备份短信
* @param view
*/
public void backUpsms(View view) {
mProgressDialog = new ProgressDialog(AtoolsActivity.this);
mProgressDialog.setTitle("提示");
mProgressDialog.setMessage("稍安勿躁,正在更新...");
mProgressDialog.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
mProgressDialog.show();
new Thread(new Runnable() {
@Override
public void run() {
boolean result = SmsUtils.backUp(AtoolsActivity.this, new SmsUtils.BackUpCallBackSms() {
@Override
public void befor(int count) {
mProgressDialog.setMax(count);
}
@Override
public void onBackUpSms(int process) {
mProgressDialog.setProgress(process);
}
});
if(result){
//安全弹吐司的方法
UIUtils.showToast(AtoolsActivity.this, "备份成功");
}else{
UIUtils.showToast(AtoolsActivity.this, "备份失败");
}
mProgressDialog.dismiss();
}
}).start();
}
然后进行的就是一运行程序就调价一个快捷图标了,添加快捷图标的流程是
1.干什么事情
2.叫什么名字
3.长成什么样子
创建快捷图标的方法如下,
/**
* 创建快捷方式
*/
private void createShortcut() {
Intent intent = new Intent();
intent.setAction("com.android.launcher.action.INSTALL_SHORTCUT");
//如果设置为true表示可以创建重复的快捷方式
intent.putExtra("duplicate", false);
/**
* 1 干什么事情
* 2 你叫什么名字
* 3你长成什么样子
*/
intent.putExtra(Intent.EXTRA_SHORTCUT_ICON,
BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
intent.putExtra(Intent.EXTRA_SHORTCUT_NAME, "手机安全卫士");
//干什么事情
/**
* 这个地方不能使用显示意图
* 必须使用隐式意图
*/
Intent shortcut_intent = new Intent();
shortcut_intent.setAction("mobileSafe_HomeActivity");
shortcut_intent.addCategory("android.intent.category.DEFAULT");
intent.putExtra(Intent.EXTRA_SHORTCUT_INTENT, shortcut_intent);
sendBroadcast(intent);
}
当然,还要去注册一下过滤
<span style="font-size:14px;"><activity android:name=".activity.HomeActivity" >
<intent-filter>
<!-- 这个名字可以随便取 -->
<action android:name="mobileSafe_HomeActivity" >
</action>
<category android:name="android.intent.category.DEFAULT" >
</category>
</intent-filter>
</activity></span>
今天最后进行的是进程管理这一功能中的进程界面显示
首先在界面上显示进程有多少个,剩余内存和总内存。
首先得到进程管理者,然后调用api得到有多少个进程在运行。
/**
* 返回进程的总个数
*
* @param context
* @return
*/
public static int getProcessCount(Context context) {
// 得到进程管理者
ActivityManager activityManager = (ActivityManager) context
.getSystemService(context.ACTIVITY_SERVICE);
// 获取到当前手机上面所有运行的进程
List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = activityManager
.getRunningAppProcesses();
// 获取手机上面一共有多少个进程
return runningAppProcesses.size();
}
然后获取到剩余内存和总内存,剩余内存直接调用api可以得到,但是总内存由于版本太低不能使用api所有不能直接读取,要使用到android手机自带的文件进行查询,市面上的安兔兔,鲁大师也是通过此种方法进行查询的
。
/**
* 得到剩余内存
* @param context
* @return
*/
public static long getAvailMem(Context context) {
// 得到进程管理者
ActivityManager activityManager = (ActivityManager) context
.getSystemService(context.ACTIVITY_SERVICE);
ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo();
// 获取到内存的基本信息
activityManager.getMemoryInfo(memoryInfo);
// 获取到剩余内存
return memoryInfo.availMem;
}
/**
* 得到总内存
* @param context
* @return
*/
public static long getTotalMem(Context context) {
// 获取到总内存
/*
* 这个地方不能直接跑到低版本的手机上面 MemTotal: 344740 kB "/proc/meminfo"
*/
try {
// /proc/meminfo 配置文件的路径
FileInputStream fis = new FileInputStream(new File("/proc/meminfo"));
BufferedReader reader = new BufferedReader(new InputStreamReader(
fis));
String readLine = reader.readLine();
StringBuffer sb = new StringBuffer();
for (char c : readLine.toCharArray()) {
if (c >= '0' && c <= '9') {
sb.append(c);
}
}
return Long.parseLong(sb.toString()) * 1024;
} catch (Exception e) {
e.printStackTrace();
}
return 0;
}
然后是实现了显示所有的进程信息,实现这个功能和第6天实现的显示所有程序功能大同小异,只是使用到的系统服务不一样而已,从使用java类用来封装信息,通过接口得到所有的进程,然后在listView中设置adapter显示给用户都是一样的过程。
详情参考:http://blog.csdn.net/dzh_19950513/article/details/51335798
源代码GitHub地址:https://github.com/AndroidDai/mobliesafe