Android之——清理手机SD卡缓存
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47375595
眼下,市场上非常多Android手机软件都具有清理SD卡缓存的功能,比方360。金山等等。那么这些软件是怎样实现清理sd卡缓存数据功能的呢?以下,我就给大家演示下。这些功能是怎样实现的吧。
一、原理
首先我们还是讲一下这个功能实现的原理吧。
将Android手机中经常使用的一些应用缓存文件夹。全部放在一个数据库表中。将这个表中的文件夹查询出来放在一个List集合中,我们暂且将这个list集合定义为paths,之后我们去换获取到sd卡中全部的文件文件夹。遍历sdk下全部的文件文件夹。假设paths中包括某一个文件夹,则递归删除这个文件夹文件。
原理又啰嗦完了,非常easy吧,那就让我们一起来实现这些功能吧。
二、实现
实现分为两个步骤,数据库的准备和代码实现
1、数据库准备
这个演示样例中用到了一个存放应用缓存文件夹的数据库clearpath.db。首先将这个数据库放置在应用程序项目的assets文件夹下
如图:
2、代码实现
在这个演示样例中,我将这个功能代码都分成一个个方法写在了MainActivity中,我们主要分析一下这个类中的每一个方法就能够了。
1)拷贝数据库的方法copyDb
这种方法实现的功能是将assets文件夹下的数据库复制到/data/data/应用程序包名/files文件夹下。同一时候返回数据库文件对象。
详细实现代码例如以下:
/**
* 拷贝数据库。并返回数据库文件对象
* @return
*/
private File copyDb(){
//将数据库复制到files文件夹
File file = new File(getFilesDir(), "clearpath.db");
if(!file.exists()){
try {
InputStream in = getAssets().open("clearpath.db");
OutputStream out = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int len = 0;
while((len = in.read(buffer)) != -1){
out.write(buffer, 0, len);
}
out.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return file;
}
2)获取数据库中要清理的文件文件夹集合的方法getPaths
这种方法实现的功能是调用copyDb方法拷贝数据库,并获取数据库文件对象,查询数据库中存放的全部的文件文件夹,并将这些文件夹封装到一个list集合中返回。
详细代码实现例如以下:
/**
* 获取数据库中要清理的文件文件夹集合
* @return
*/
private List<String> getPaths(){
//复制数据库
List<String >list = new ArrayList<String>();
File file = copyDb();
if(file != null){
SQLiteDatabase db = SQLiteDatabase.openDatabase(file.getAbsolutePath(), null, SQLiteDatabase.OPEN_READONLY);
if(db.isOpen()){
Cursor c = db.query("softdetail", new String[]{"filepath"}, null, null, null, null, null);
while(c.moveToNext()){
String path = c.getString(c.getColumnIndex("filepath"));
list.add(path);
}
c.close();
db.close();
}
}
return list;
}
3)递归删除文件delete
这种方法主要实现了递归删除文件的操作,首先遍历文件文件夹,假设当前文件是文件夹,则遍历子文件夹,继续调用自身delete方法,假设是文件。则调用File的delete方法。
详细实现代码例如以下:
/**
* 递归删除文件
* @param file
*/
private void delete(File file){
if(file.isDirectory()){
File[] files = file.listFiles();
for(File f : files){
delete(f);
}
}else{
file.delete();
}
}
4)获取文件集合paths
我们定义一个全局list集合paths,并在oncreate方法中调用getPaths方法,给这个集合赋值。这样这个集合中封装了数据库中全部的文件路径。
之所以我们将paths定义为全局变量。并在oncreate方法中调用getPaths方法为其赋值,是为了提高性能。由于从数据库中读取数据是一个耗费性能的操作,这种方法仅仅在onCreate中运行一次。避免了在点击事件中每点击button一次。就运行一次。这样明显提高了应用程序的性能。
详细实现代码例如以下:
private List<String> paths;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
paths = this.getPaths();
}
5)button点击事件clearData
这种方法主要是响应了button的点击事件。实现清理缓存的功能,在这里我们将清理功能放到一个子线程中运行,通过Looper机制来提醒用户清理完毕。
详细代码实现例如以下:
//button点击事件
public void clearData(View v){
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath());
File[] files = file.listFiles();
if(files != null && files.length > 0){
for(File f : files){
String name = "/" + f.getName();
//paths集合中包括name
if(paths.contains(name)){
delete(f);
}
}
}
Looper.prepare();
Toast.makeText(MainActivity.this, "SD卡缓存清理完毕", Toast.LENGTH_SHORT).show();
Looper.loop();
}
}).start();
}
6)MainActivity总体实现代码
package com.lyz.test.cache; import java.io.File;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List; import android.app.Activity;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.os.Environment;
import android.os.Looper;
import android.view.Menu;
import android.view.View;
import android.widget.Toast; /**
* 主程序入口
* @author liuyazhuang
*
*/
public class MainActivity extends Activity { private List<String> paths; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
paths = this.getPaths();
} @Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
} //button点击事件
public void clearData(View v){
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
File file = new File(Environment.getExternalStorageDirectory().getAbsolutePath());
File[] files = file.listFiles();
if(files != null && files.length > 0){
for(File f : files){
String name = "/" + f.getName();
//paths集合中包括name
if(paths.contains(name)){
delete(f);
}
}
}
Looper.prepare();
Toast.makeText(MainActivity.this, "SD卡缓存清理完毕", Toast.LENGTH_SHORT).show();
Looper.loop();
}
}).start();
} /**
* 递归删除文件
* @param file
*/
private void delete(File file){
if(file.isDirectory()){
File[] files = file.listFiles();
for(File f : files){
delete(f);
}
}else{
file.delete();
}
} /**
* 拷贝数据库,并返回数据库文件对象
* @return
*/
private File copyDb(){
//将数据库复制到files文件夹
File file = new File(getFilesDir(), "clearpath.db");
if(!file.exists()){
try {
InputStream in = getAssets().open("clearpath.db");
OutputStream out = new FileOutputStream(file);
byte[] buffer = new byte[1024];
int len = 0;
while((len = in.read(buffer)) != -1){
out.write(buffer, 0, len);
}
out.close();
in.close();
} catch (Exception e) {
e.printStackTrace();
}
}
return file;
} /**
* 获取数据库中要清理的文件文件夹集合
* @return
*/
private List<String> getPaths(){
//复制数据库
List<String >list = new ArrayList<String>();
File file = copyDb();
if(file != null){
SQLiteDatabase db = SQLiteDatabase.openDatabase(file.getAbsolutePath(), null, SQLiteDatabase.OPEN_READONLY);
if(db.isOpen()){
Cursor c = db.query("softdetail", new String[]{"filepath"}, null, null, null, null, null);
while(c.moveToNext()){
String path = c.getString(c.getColumnIndex("filepath"));
list.add(path);
}
c.close();
db.close();
}
}
return list;
}
}
7)布局文件activity_main
这个布局非常easy,我们就是放置了一个button。
详细实现代码例如以下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" > <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="clearData"
android:text="清理SD卡数据" /> </RelativeLayout>
3、应用授权
这里,我们要清除sd卡中的数据,全部要对写sd卡进行授权。我们在AndroidManifest.xml文件里加入例如以下授权信息
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
三、执行效果
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" height="353" width="413">
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" height="322" width="413">
四、温馨提示
大家能够到链接http://download.csdn.net/detail/l1028386804/8980767下载Android清理SD卡缓存数据库文件,能够到链接http://download.csdn.net/detail/l1028386804/8980789下载Android清理SD卡缓存完整演示样例源码
本实例中,为了方面,我把一些文字直接写在了布局文件里和相关的类中,大家在真实的项目中要把这些文字写在string.xml文件里。在外部引用这些资源。切记。这是作为一个Android程序猿最主要的开发常识和规范。我在这里仅仅是为了方便直接写在了类和布局文件里。
Android之——清理手机SD卡缓存的更多相关文章
- 【Java/Android性能优 6】Android 图片SD卡缓存 使用简单 支持预取 支持多种缓存算法 支持不同网络类型 支持序列化
本文转自:http://www.trinea.cn/android/android-imagesdcardcache/ 本文主要介绍一个支持图片自动预取.支持多种缓存算法.支持数据保存和恢复的图片Sd ...
- Android 读取手机SD卡根目录下某个txt文件的文件内容
1.先看activity_main.xml文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/and ...
- [android] 保存文件到SD卡
/****************2016年5月4日 更新*****************************/ 知乎:为什么很多Android应用要把文件写到/sdcard目录下而不是写到/d ...
- Android数据存储之SD卡
为了更好的存取应用程序的大文件数据,应用程序需要读. 写SD卡上的文件.SD卡大大扩充手机的存储能力. 操作SD首先要加权限: <!--在SDCard中创建与删除文件权限 --> < ...
- Android中播放本地SD卡中歌曲须要的加入的权限
使用MediaPlayer播放本地Mp3文件时.须要注意的訪问路径的问题以及訪问权限的问题. 1.訪问路径:/storage/emulated/0 此路径即为手机的根路径,能够通过下载ES文件浏览器软 ...
- 转 Android:文件下载和写入SD卡学习小结
转自 http://blog.csdn.net/zzp_403184692/article/details/8160739 一.文件下载 Android开发中,有时需要从网上下载一些资源以供用户使 ...
- android 写文件到sd卡问题小记
android 写文件到sd卡问题小记 事情是这样子的.... 这天我开始编写项目调试工具,高大上不?-----其实就是记录实时网络请求和崩溃日志相关等的小工具(此处一个会心的微笑). 然后我是这样写 ...
- Android之外部存储(SD卡)
*手机的外部存储空间,这个我们可以理解成电脑的外接移动硬盘,U盘也行.所有的Android设备都有两个文件存储区域:“内部”和“外部”存储器.这两个名称来自早期的Android,当时大多数设备都提供内 ...
- 数据恢复软件使用经验-支持U盘,手机SD卡,硬盘数据,解决图片恢复后打不开的问题
数据恢复软件使用经验-支持U盘,手机SD卡,硬盘数据.解决图片恢复后打不开的问题. 用过非常多数据恢复软件.最早EasyRecovery pro.恢复过U盘.手机SD卡,硬盘数据.但如今下载不了最新版 ...
随机推荐
- JAVA常见算法题(二十三)
package com.xiaowu.demo; /** * 给一个不多于5位的正整数,要求:①求它是几位数:②逆序打印出各位数字. * * * @author WQ * */ public clas ...
- GLSL实现Glow效果 【转】
http://blog.csdn.net/a3070173/article/details/3220940 Glow即辉光效果现在已成为3D图形中一个引人注目的特效.本文主要介绍如何使用GLSL实现一 ...
- (转)指针的引用(*&)与指针的指针(**)
本文转载而来,转载出处:http://www.cppblog.com/doing5552/archive/2010/09/28/127994.html 在下列函数声明中,为什么要同时使用*和& ...
- 解决Mac安装M2Crypto提示无法找到openssl头文件问题
大概是这种问题 running build running build_py running build_ext building'M2Crypto.__m2crypto' extension swi ...
- NFS网络文件系统的配置
NFS网络文件系统的配置 NFS网络文件系统 NFS(network file system)网络文件系统.一种使用于分散式文件协定,有SUN公司开发.功能是通过网络让不同的机器.不同的操作系统能够分 ...
- 转: Linux 上的常用文件传输方式介绍与比较
from: https://www.ibm.com/developerworks/cn/linux/l-cn-filetransfer/ ftp ftp 命令使用文件传输协议(File Transf ...
- WO+开放平台:API调用开发手记(话费计费接口2.0)
WO+能力共享平台(http://open.wo.com.cn)是中国联通推出的开放平台.拥有的丰富电信能力资源以及深度整合挖掘的第三方能力资源等.WO+平台提供的API均为简洁优雅的RESTful风 ...
- git学习——查看提交历史
git log可以查看提交历史: 用-p选项展开显示每次提交的内容差异,用-2则仅显示最近两次的更新:git log -p -2 在-p选项后面使用--word-diff选项进行单词层面的对比.这其中 ...
- 不是书评 :《我是一只IT小小鸟》
本文转自刘未鹏 博客,写的非常的好 就转回来了 设计你自己的进度条 进度条的设计是一个很多人都知道的故事:同样的耗时,如果不给任何进度提示,只是在完成之后才弹出一个完成消息,中间没有任何动态变化,那么 ...
- kettle入门(七) 之kettle增量方案(一)全量比对取增量-依据唯一标示
引: ods有个project表来自于上游系统,数据量不大 十几万,下游系统须要此数据,而且须要每天提供截止当天的增量数据 要求每条数据给出数据变化时间及标示,即数据若是插入 有插入时间和插入标示 若 ...