Android应用开发之清理手机SD卡缓存
白羽 2018-12-19 来源 :网络 阅读 386 评论 0

摘要:本文将带你了解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频道!


本文由 @白羽 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式IT培训就业服务领导者 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved

208小时内训课程