1. 获取应用数据/缓存大小

其中pm为实例化的PackageManager,因为需要遍历所有的已安装的应用。因此需要开启子线程进行处理。

还有需要注意的是,在Android4.2之前getPackageSizeInfo方法参数是没有第二个int类型的参数的,贴出来的代码适合4.2以后的版本,在反射获取方法时,增加了userHandle的参数信息。至于增加的参数userHandle的解释是:The user whose size information should be retrieved。我们是通过系统类的UserHandle.myUserId()获取。

还有需要注意的是,因为调用了远程服务,需要在自己的工程里引入两个aidl文件,分别是IPackageStatsObserver.aidl以及PackageStats.aidl,放在新建的android.content.pm包下。

    private void scanCache() {
pm = getPackageManager();
new Thread(){
@Override
public void run() {
List<PackageInfo> installedPackages = pm.getInstalledPackages(0);
for( PackageInfo info : installedPackages){
try {
Method myUserId = UserHandle.class.getDeclaredMethod("myUserId");
int userID = (Integer) myUserId.invoke(pm,null);
Method getPackageSizeInfo = pm.getClass().getDeclaredMethod("getPackageSizeInfo", String.class,
int.class, IPackageStatsObserver.class);
getPackageSizeInfo.invoke(pm, info.packageName, userID, new MyDataObserver());
} catch (Exception e) {
e.printStackTrace();
}
}
runOnUiThread(new Runnable() {
@Override
public void run() {
//扫描结束后的UI操作
}
});
}
}.start();
} private class MyDataObserver extends IPackageStatsObserver.Stub{
@Override
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
throws RemoteException {
final long cache = pStats.cacheSize; //应用缓存的大小
long code = pStats.codeSize;
long data = pStats.dataSize;//这里便可以拿到应用数据的大小
String packageName = pStats.packageName;
ApplicationInfo appinfo = null;
try {
appinfo = pm.getApplicationInfo(packageName,0);
final ApplicationInfo finalAppinfo = appinfo;
runOnUiThread(new Runnable() {
@Override
public void run() {
//拿到cache,处理UI
}
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
}

2. 清理缓存

据我所知,是不可以在应用里根据包名只清理一个应用的缓存的,除非是系统级别的应用才有DELETE_CACHE_FILES权限。但是可以通过PackageManager的freeStorageAndNotify方法,声称需要一个比较大的内存空间,从而达到清理所有应用的缓存文件的目的。

同样需要注意添加IPackageDataObserver.aidl接口声明,包位置依旧是android.content.pm。

    private void deleteAllCache() {
pm = getPackageManager();
Method[] methods = PackageManager.class.getMethods();
for(Method method : methods){
if( "freeStorageAndNotify".equals(method.getName()) ) {
try {
method.invoke(pm,Long.MAX_VALUE,new MyPackageDataObserver());
} catch (Exception e) {
e.printStackTrace();
}
return;
}
}
}

同时在清理完成时,会回调onRemoveCompleted方法。比较适合做清理完毕后的UI逻辑。

本例是弹出一个对话框提示用户清理完毕。

    private  class MyPackageDataObserver extends IPackageDataObserver.Stub{
@Override
public void onRemoveCompleted(String packageName, boolean succeeded) throws RemoteException {
runOnUiThread(new Runnable() {
@Override
public void run() {
AlertDialog.Builder builder = new AlertDialog.Builder(CleanCacheActivity.this);
builder.setMessage("恭喜,已清理所有垃圾");
builder.setTitle("提示");
builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
finish();
}
});
builder.create().show();
}
});
}
}

Android开发——获取应用数据/缓存大小并清理缓存的更多相关文章

  1. ios 计算缓存大小并清理缓存

    SDWebImage.WebView产生的缓存 1.计算缓存大小 //SDWebImage缓存大小  UILabel *cleanDetailText = [[UILabel alloc]init]; ...

  2. Android记录20-获取缓存大小和清除缓存功能

    Android开发记录20-获取缓存大小和清除缓存功能 转载请注明:IT_xiao小巫 博客地址:http://blog.csdn.net/wwj_748 前言 本篇博客要给大家分享的如何获取应用缓存 ...

  3. Android之计算缓存大小并且清空缓存

    转载博客:http://www.2cto.com/kf/201503/385492.html 项目中碰到了计算缓存大小和清空缓存的功能,这个很常见的功能,几乎每个APP都有,以为实现很简单,网上搜了一 ...

  4. android开发获取网络状态,wifi,wap,2g,3g.工具类(一)

    android开发获取网络状态整理: package com.gzcivil.utils; import android.content.Context; import android.net.Con ...

  5. SDWebimage如何获取缓存大小以及清除缓存

    sdwebimage如何获取缓存大小以及清除缓存 1.找到SDImageCache类 2.添加如下方法: - (float)checkTmpSize {    float totalSize = 0; ...

  6. Android开发8:数据存储(二)——SQLite数据库和ContentProvider的使用

    前言 啦啦啦各位小伙伴们许久不见了~学期末和过年期间自己忙着做其他事没能及时更新Android开发系列课程的博客,实在是罪过罪过~ 好啦~废话不多说,进入我们今天的主题.今天我们将和大家学习其他的数据 ...

  7. Android开发笔记——以Volley图片加载、缓存、请求及展示为例理解Volley架构设计

    Volley是由Google开源的.用于Android平台上的网络通信库.Volley通过优化Android的网络请求流程,形成了以Request-RequestQueue-Response为主线的网 ...

  8. Android开发-API指南-数据存储

    Storage Options 英文原文:http://developer.android.com/guide/topics/data/data-storage.html 采集日期:2015-02-0 ...

  9. Android 开发 获取Android设备的屏幕高宽

    获得屏幕的宽度和高度有很多种方法: //1.通过WindowManager获取 DisplayMetrics dm = new DisplayMetrics(); heigth = dm.height ...

随机推荐

  1. bzoj 5017 [Snoi2017]炸弹

    题面 https://www.lydsy.com/JudgeOnline/problem.php?id=5017 题解 如果数据范围小一点那么就缩点 然后跑一个基础的DAG上的dp就好了 但是边数是$ ...

  2. Mysql数据类型简介(大概了解)

    知道有整型,浮点型,定点数类型( DECIMAL(M,D)M是数据总长度,是小数位 ),日期类,字符串类,二进制类型(存图片路径,视频路径一般用BLOG就行了喔)……不会再去查 讲一下几个专有名词: ...

  3. html制作简单框架网页二 实现自己的影音驿站 操作步骤及源文件下载 (可播放mp4、avi、mpg、asx、swf各种文件的视频播放代码)

    新增视频播放功能如下图: 左侧网页left.html代码如下: <meta charset="utf-8"> <body style="backgrou ...

  4. iOS 从相册中拿到 图片名 ,截取后缀,图片名

    //从路径中获得完整的文件名 (带后缀) 对从相册中取出的图片,视频都有效. NSString *fileName = [filePath lastPathComponent]; //获得文件名 (不 ...

  5. Java长存!12个Java长久占居主要地位的原因

    Java长存!12个Java长久占居主要地位的原因 我们很容易就会遗忘那些曾经在猿群中大热而又被各种新技术掩盖直至堙灭的技术的价值.就拿COBOL这个老猿们当年所用的神器来说,就跟条死鱼一样被现代猿基 ...

  6. OCP 11g 第一章练习

    练习 1-1 研究所在环境的DBMS 这是一个书面练习,没有具体的解决方案. 确定自己所在环境使用的应用程序, 应用服务器 , 和数据库. 然后集中精力研究数据库, 体验一下数据库的规模和忙碌程度. ...

  7. Java Script 学习笔记(一)

    示例如下: JavaScript-警告(alert 消息对话框) 我们在访问网站的时候,有时会突然弹出一个小窗口,上面写着一段提示信息文字.如果你不点击“确定”,就不能对网页做任何操作,这个小窗口就是 ...

  8. Linux系统使用iftop查看带宽占用情况

    Linux系统下如果服务器带宽跑满了,查看跟哪个ip通信占用带宽比较多,可以通过iftop命令进行查询,使用方法如下: 1 安装方法[软件官网地址:http://www.ex-parrot.com/~ ...

  9. Summary of 2016 International Trusted Computing and Cloud Security Summit

    1)      Welcome Remarks 2)      The advancement of Cloud Computing and Tursted Computing national st ...

  10. SQL的top 100 percent用法

    sql="select top 30 * from data where title='"&title1&"' order by id desc" ...