摘要:本文将带你了解Android应用开发Android开发之清理手机SD卡缓存,希望本文对大家学Android有所帮助。
本文将带你了解Android应用开发Android开发之清理手机SD卡缓存,希望本文对大家学Android有所帮助。
Android开发之清理手机SD卡缓存。目前,市场上很多Android手机软件都具有清理SD卡缓存的功能,比如360,金山等等。那么这些软件是如何实现清理sd卡缓存数据功能的呢?下面,我就给大家演示下,这些功能是如何实现的吧。
一、原理
首先我们还是讲一下这个功能实现的原理吧。
将Android手机中常用的一些应用缓存目录,全部放在一个数据库表中,将这个表中的目录查询出来放在一个List集合中,我们暂且将这个list集合定义为paths,之后我们去换获取到sd卡中所有的文件目录,遍历sdk下所有的文件目录,如果paths中包含某一个目录,则递归删除这个目录文件。
原理又啰嗦完了,很简单吧,那就让我们一起来实现这些功能吧。
二、实现
实现分为两个步骤,数据库的准备和代码实现
1、数据库准备
这个示例中用到了一个存放应用缓存目录的数据库clearpath.db,首先将这个数据库放置在应用程序项目的assets目录下
如图:
2、代码实现
在这个示例中,我将这个功能代码都分成一个个方法写在了MainActivity中,我们主要分析一下这个类中的每个方法就可以了。
1)拷贝数据库的方法copyDb
这个方法实现的功能是将assets目录下的数据库拷贝到/data/data/应用程序包名/files目录下,同时返回数据库文件对象。
具体实现代码如下:
[java]view plaincopy
/**
*拷贝数据库,并返回数据库文件对象
*@return
*/
privateFilecopyDb(){
//将数据库拷贝到files目录
Filefile=newFile(getFilesDir(),"clearpath.db");
if(!file.exists()){
try{
InputStreamin=getAssets().open("clearpath.db");
OutputStreamout=newFileOutputStream(file);
byte[]buffer=newbyte[1024];
intlen=0;
while((len=in.read(buffer))!=-1){
out.write(buffer,0,len);
}
out.close();
in.close();
}catch(Exceptione){
e.printStackTrace();
}
}
returnfile;
}
2)获取数据库中要清理的文件目录集合的方法getPaths
这个方法实现的功能是调用copyDb方法拷贝数据库,并获取数据库文件对象,查询数据库中存放的所有的文件目录,并将这些目录封装到一个list集合中返回。
具体代码实现如下:
[java]view plaincopy
/**
*获取数据库中要清理的文件目录集合
*@return
*/
privateListgetPaths(){
//复制数据库
Listlist=newArrayList();
Filefile=copyDb();
if(file!=null){
SQLiteDatabasedb=SQLiteDatabase.openDatabase(file.getAbsolutePath(),null,SQLiteDatabase.OPEN_READONLY);
if(db.isOpen()){
Cursorc=db.query("softdetail",newString[]{"filepath"},null,null,null,null,null);
while(c.moveToNext()){
Stringpath=c.getString(c.getColumnIndex("filepath"));
list.add(path);
}
c.close();
db.close();
}
}
returnlist;
}
3)递归删除文件delete
这个方法主要实现了递归删除文件的操作,首先遍历文件目录,如果当前文件是目录,则遍历子目录,继续调用自身delete方法,如果是文件,则调用File的delete方法。
具体实现代码如下:
[java]view plaincopy
/**
*递归删除文件
*@paramfile
*/
privatevoiddelete(Filefile){
if(file.isDirectory()){
File[]files=file.listFiles();
for(Filef:files){
delete(f);
}
}else{
file.delete();
}
}
4)获取文件集合paths
我们定义一个全局list集合paths,并在oncreate方法中调用getPaths方法,给这个集合赋值。这样这个集合中封装了数据库中所有的文件路径。之所以我们将paths定义为全局变量,并在oncreate方法中调用getPaths方法为其赋值,是为了提高性能。因为从数据库中读取数据是一个耗费性能的操作,这个方法只在onCreate中执行一次,避免了在点击事件中每点击按钮一次,就执行一次。这样明显提高了应用程序的性能。
具体实现代码如下:
[java]view plaincopy
privateListpaths;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
paths=this.getPaths();
}[java]view plaincopy
//按钮点击事件
publicvoidclearData(Viewv){
newThread(newRunnable(){
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
Filefile=newFile(Environment.getExternalStorageDirectory().getAbsolutePath());
File[]files=file.listFiles();
if(files!=null&&files.length>0){
for(Filef:files){
Stringname="/"+f.getName();
//paths集合中包含name
if(paths.contains(name)){
delete(f);
}
}
}
Looper.prepare();
Toast.makeText(MainActivity.this,"SD卡缓存清理完成",Toast.LENGTH_SHORT).show();
Looper.loop();
}
}).start();
}[java]view plaincopy
packagecom.lyz.test.cache;
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.InputStream;
importjava.io.OutputStream;
importjava.util.ArrayList;
importjava.util.List;
importandroid.app.Activity;
importandroid.database.Cursor;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.os.Bundle;
importandroid.os.Environment;
importandroid.os.Looper;
importandroid.view.Menu;
importandroid.view.View;
importandroid.widget.Toast;
/**
*主程序入口
*@authorliuyazhuang
*
*/
publicclassMainActivityextendsActivity{
privateList
paths;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
paths=this.getPaths();
}
@Override
publicbooleanonCreateOptionsMenu(Menumenu){
//Inflatethemenu;thisaddsitemstotheactionbarifitispresent.
getMenuInflater().inflate(R.menu.main,menu);
returntrue;
}
//按钮点击事件
publicvoidclearData(Viewv){
newThread(newRunnable(){
@Override
publicvoidrun(){
//TODOAuto-generatedmethodstub
Filefile=newFile(Environment.getExternalStorageDirectory().getAbsolutePath());
File[]files=file.listFiles();
if(files!=null&&files.length>0){
for(Filef:files){
Stringname="/"+f.getName();
//paths集合中包含name
if(paths.contains(name)){
delete(f);
}
}
}
Looper.prepare();
Toast.makeText(MainActivity.this,"SD卡缓存清理完成",Toast.LENGTH_SHORT).show();
Looper.loop();
}
}).start();
}
/**
*递归删除文件
*@paramfile
*/
privatevoiddelete(Filefile){
if(file.isDirectory()){
File[]files=file.listFiles();
for(Filef:files){
delete(f);
}
}else{
file.delete();
}
}
/**
*拷贝数据库,并返回数据库文件对象
*@return
*/
privateFilecopyDb(){
//将数据库拷贝到files目录
Filefile=newFile(getFilesDir(),"clearpath.db");
if(!file.exists()){
try{
InputStreamin=getAssets().open("clearpath.db");
OutputStreamout=newFileOutputStream(file);
byte[]buffer=newbyte[1024];
intlen=0;
while((len=in.read(buffer))!=-1){
out.write(buffer,0,len);
}
out.close();
in.close();
}catch(Exceptione){
e.printStackTrace();
}
}
returnfile;
}
/**
*获取数据库中要清理的文件目录集合
*@return
*/
privateList
getPaths(){
//复制数据库
List
list=newArrayList();
Filefile=copyDb();
if(file!=null){
SQLiteDatabasedb=SQLiteDatabase.openDatabase(file.getAbsolutePath(),null,SQLiteDatabase.OPEN_READONLY);
if(db.isOpen()){
Cursorc=db.query("softdetail",newString[]{"filepath"},null,null,null,null,null);
while(c.moveToNext()){
Stringpath=c.getString(c.getColumnIndex("filepath"));
list.add(path);
}
c.close();
db.close();
}
}
returnlist;
}
}
7)布局文件activity_main
这个布局很简单,我们就是放置了一个按钮。
具体实现代码如下:
[html]view plaincopy
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卡数据"/>
本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!
您输入的评论内容中包含违禁敏感词
我知道了
请输入正确的手机号码
请输入正确的验证码
您今天的短信下发次数太多了,明天再试试吧!
我们会在第一时间安排职业规划师联系您!
您也可以联系我们的职业规划师咨询:
版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
沪公网安备 31011502005948号