Android之——清理手机SD卡缓存
来源:互联网 发布:小米电视直播软件 编辑:程序博客网 时间:2024/04/30 07:00
转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47375595
目前,市场上很多Android手机软件都具有清理SD卡缓存的功能,比如360,金山等等。那么这些软件是如何实现清理sd卡缓存数据功能的呢?下面,我就给大家演示下,这些功能是如何实现的吧。
一、原理
首先我们还是讲一下这个功能实现的原理吧。
将Android手机中常用的一些应用缓存目录,全部放在一个数据库表中,将这个表中的目录查询出来放在一个List集合中,我们暂且将这个list集合定义为paths,之后我们去换获取到sd卡中所有的文件目录,遍历sdk下所有的文件目录,如果paths中包含某一个目录,则递归删除这个目录文件。
原理又啰嗦完了,很简单吧,那就让我们一起来实现这些功能吧。
二、实现
实现分为两个步骤,数据库的准备和代码实现
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中执行一次,避免了在点击事件中每点击按钮一次,就执行一次。这样明显提高了应用程序的性能。
具体实现代码如下:
private List<String> paths;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);paths = this.getPaths();}
5)按钮点击事件clearData
这个方法主要是响应了按钮的点击事件,实现清理缓存的功能,在这里我们将清理功能放到一个子线程中执行,通过Looper机制来提醒用户清理完成。
具体代码实现如下:
//按钮点击事件public void clearData(View v){new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubFile 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集合中包含nameif(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;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);paths = this.getPaths();}@Overridepublic 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;}//按钮点击事件public void clearData(View v){new Thread(new Runnable() {@Overridepublic void run() {// TODO Auto-generated method stubFile 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集合中包含nameif(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
这个布局很简单,我们就是放置了一个按钮。
具体实现代码如下:
<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"/>
三、运行效果
四、温馨提示
大家可以到链接http://download.csdn.net/detail/l1028386804/8980767下载Android清理SD卡缓存数据库文件,可以到链接http://download.csdn.net/detail/l1028386804/8980789下载Android清理SD卡缓存完整示例源代码
本实例中,为了方面,我把一些文字直接写在了布局文件中和相关的类中,大家在真实的项目中要把这些文字写在string.xml文件中,在外部引用这些资源,切记,这是作为一个Android程序员最基本的开发常识和规范,我在这里只是为了方便直接写在了类和布局文件中。
- Android之——清理手机SD卡缓存
- Android模块化编程——WebView使用之清理缓存
- android开发之清理缓存
- Android开发之系统信息——获取Android手机中SD卡内存信息
- Android开发之系统信息【1】——获取Android手机中SD卡存储信息
- Android开发之系统信息——获取Android手机中SD卡内存信息
- android SD卡缓存
- android SD卡缓存
- android学习笔记之——获取SD卡及手机ROM容量
- android学习笔记之——获取SD卡及手机ROM容量
- 清理手机缓存
- 手机清理缓存文件
- android开发——获取手机SD卡的容量
- Android——手机sd卡的大小查看
- Android 异步加载图片-LruCache和SD卡或手机缓存-三级缓存原理加载图片
- (转)Android开发之系统信息——获取Android手机中SD卡内存信息
- android AIDL实践之清理应用缓存
- Android开发之----客户端清理缓存
- C语言:串匹配的一般方法
- windows下mysql忘记root密码的解决方法
- 为什么String要设计成不可变的?
- one to many的注意点
- 【Android基础篇】AutoCompleteTextView和MultiAutoCompleteTextView
- Android之——清理手机SD卡缓存
- 安卓程序崩溃时的错误信息log至本地
- Linux Per-cpu变量
- NYOJ -11--奇偶数分离
- 02 俄罗斯方块
- UVa - 424 Integer Inquiry
- Dcloud开发套件初学
- HDU 1207 汉诺塔II
- win7+ii7+tomcat7运行javaWeb开发的程序