转载请注明出处: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卡缓存的更多相关文章

  1. 【Java/Android性能优 6】Android 图片SD卡缓存 使用简单 支持预取 支持多种缓存算法 支持不同网络类型 支持序列化

    本文转自:http://www.trinea.cn/android/android-imagesdcardcache/ 本文主要介绍一个支持图片自动预取.支持多种缓存算法.支持数据保存和恢复的图片Sd ...

  2. Android 读取手机SD卡根目录下某个txt文件的文件内容

    1.先看activity_main.xml文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/and ...

  3. [android] 保存文件到SD卡

    /****************2016年5月4日 更新*****************************/ 知乎:为什么很多Android应用要把文件写到/sdcard目录下而不是写到/d ...

  4. Android数据存储之SD卡

    为了更好的存取应用程序的大文件数据,应用程序需要读. 写SD卡上的文件.SD卡大大扩充手机的存储能力. 操作SD首先要加权限: <!--在SDCard中创建与删除文件权限 --> < ...

  5. Android中播放本地SD卡中歌曲须要的加入的权限

    使用MediaPlayer播放本地Mp3文件时.须要注意的訪问路径的问题以及訪问权限的问题. 1.訪问路径:/storage/emulated/0 此路径即为手机的根路径,能够通过下载ES文件浏览器软 ...

  6. 转 Android:文件下载和写入SD卡学习小结

    转自 http://blog.csdn.net/zzp_403184692/article/details/8160739  一.文件下载  Android开发中,有时需要从网上下载一些资源以供用户使 ...

  7. android 写文件到sd卡问题小记

    android 写文件到sd卡问题小记 事情是这样子的.... 这天我开始编写项目调试工具,高大上不?-----其实就是记录实时网络请求和崩溃日志相关等的小工具(此处一个会心的微笑). 然后我是这样写 ...

  8. Android之外部存储(SD卡)

    *手机的外部存储空间,这个我们可以理解成电脑的外接移动硬盘,U盘也行.所有的Android设备都有两个文件存储区域:“内部”和“外部”存储器.这两个名称来自早期的Android,当时大多数设备都提供内 ...

  9. 数据恢复软件使用经验-支持U盘,手机SD卡,硬盘数据,解决图片恢复后打不开的问题

    数据恢复软件使用经验-支持U盘,手机SD卡,硬盘数据.解决图片恢复后打不开的问题. 用过非常多数据恢复软件.最早EasyRecovery pro.恢复过U盘.手机SD卡,硬盘数据.但如今下载不了最新版 ...

随机推荐

  1. Using ASIHTTPRequest in an iOS project

    1) Add the files Copy the files you need to your project folder, and add them to your Xcode project. ...

  2. jquery 遍历取值问题

    方法一:将a定义在外边 var a = new Array; var i = 0 ; $("img").each(function(){ a[i] = $(this).attr(& ...

  3. jq和js中click 事件的几种方式总结和click事件的累加问题解决办法

     1:常见的三种绑定click事件: 第一种:$("#click").click(function(){ alert("Hello World  click") ...

  4. 设计模式之责任链模式(php实现)

    github地址:https://github.com/ZQCard/design_pattern /** * 责任链模式(Chain of Responsibility Pattern)为请求创建了 ...

  5. MSSQL数据库导入导出大全二(SQL语句)

    Excel文件导入数据库多个Sheet if exists(select 1 from sysobjects where name=N'p_import_excel' and type='P')dro ...

  6. MySQL 事件EVENT

    一.用途用于某一时间执行一个事件或周期性执行一个事件. 二.语法CREATE [DEFINER = { user | CURRENT_USER }] EVENT [IF NOT EXISTS] eve ...

  7. 创建你的第一个ionic+cordova应用(1)

    前面我们安装了前端的神器webstorm11,体验到了强大的开发体验,接着我们来安装ionic 必备: Node.js (npm安装工具) 百度下载 官网下载  注:如果官网新版不能安装请用百度下载0 ...

  8. hdu 4865 Peter&#39;s Hobby (隐马尔可夫模型 dp)

    Peter's Hobby Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) To ...

  9. ExtJs的Ext.grid.GridPanel不能选择复制表格中的内容解决方案

    今天遇到grid复制的问题,在网上找到了一个解决办法,只需改下CSS和JS,给大家分享一下: 本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/dy_paradise/a ...

  10. Excel2007制作直方图和正态分布曲线图

    对同一维度的数据分析数据分布范围及分布趋势,要通过制作直方图和正态分布曲线图体现. 例如:已知所有员工的日收入,分析员工收入分布情况(51.7,50.6,57.9,56.9,56.7,56.7,55. ...