Android系统缓存相关

1. 如何获取每个应用的缓存文件及大小

PackageManager pm = context.getPackageManager();
try {
    Method mmethod = PackageManager.class.getMethod("getPackageSizeInfo", String.class,IPackageStatsObserver.class);

    List<PackageInfo> packageInfos = pm.getInstalledPackages(0);

    // 数据变化的观察者,来自IPackageStatsObserver.Stub
    DataChangedObserver dataChangedObserver = new DataChangedObserver();

    for (PackageInfo packageInfo : packageInfos) {
        // 系统的方法背hide,因此使用反射机制来获取该方法
        mmethod.invoke(pm, packageInfo.packageName, dataChangedObserver);
    }
} catch (Exception e) {
    e.printStackTrace();
}
/**
 * 扫描结果的观察者 需要权限 <uses-permission
 * android:name="android.permission.GET_PACKAGE_SIZE"/>
 *
 * @author chenhao24
 *
 */
private class DataChangedObserver extends IPackageStatsObserver.Stub {
    @Override
    public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException {

        if (!succeeded) {
            return;
        }

        // 获取缓存大小
        long cacheSize = pStats.cacheSize;

        // 获取应用的名称
        String packageName = pStats.packageName;
    }
}

IPackageStatsObserver.Stub 的引入.手动建android.content.pm包拷贝文件到此目录下

2. 如何清空缓存?可以使用上面类似的方法反射进行相关的操作,但是此操作需要系统级别的应用才可以清理,市面上的软件如何做到清理的呢?跳到应用信息页去手动的清理,但是市面上的软件做到了可以清理全部缓存文件,利用了Android系统的一个机制,当向系统申请空间(很大超过了目前系统空闲的大小)时,如果系统没有足够的空间可供使用,系统会删除所有应用的缓存文件,进而做到了清理全部缓存文件的目的。

PackageManager pm = context.getPackageManager();
try {
    // 使用反射
    Method mmethod = PackageManager.class.getMethod("freeStorageAndNotify", Long.class,IPackageDataObserver.class);
    mmethod.invoke(pm, Integer.MAX_VALUE,new ApplyDataObserver());
} catch (Exception e) {
    e.printStackTrace();
}
/**
 * 申请空间,消除缓存的数据观察者
 * @author chenhao24
 *
 */
private class ApplyDataObserver extends IPackageDataObserver.Stub{
    @Override
    public void onRemoveCompleted(String packageName, boolean succeeded)throws RemoteException {
        if(! succeeded){
            Log.i(TAG,"release sys cache error");
            return;
        }
        Log.i(TAG,"release sys cache success");
    }
}

IPackageDataObserver.Stub获取与IPackageStatsObserver.Stub类似

时间: 2024-08-05 08:10:15

Android系统缓存相关的相关文章

20151007_手动刷新Android系统SD卡

问题背景 ETTS项目过程中,向SD卡写入数据库文件作为与电脑交互的中间媒介:问题出现在吸入文件写入文件到SD卡后在手机端的文件管理系统中可以查看到,但是使用USB数据线连接电脑后无法显示新的文件,即出现了数据更新不同步的问题. 问题描述 SD卡数据刷新不及时. 问题来源 “android系统缓存没处理好这个”... 具体原因不清楚... ... 解决方法 (http://www.111cn.net/sj/android/44870.htm) <1>. 通过 Intent.ACTION_MED

对Android系统权限的认识

Android系统是运行在Linux内核上的,Android与Linux分别有自己的一套严格的安全及权限机制 Android系统权限相关的内容 (一)linux文件系统上的权限 -rwxr-x--x system system 4156 2012-06-30 16:12 test.apk. 代表的是相应的用户/用户组及其他人对此文件的访问权限,与此文件运行起来具有的权限完全不相关. 比如上面的例子只能说明system用户拥有对此文件的读写执行权限:system组的用户对此文件拥有读.执行权限:其

Android开发之清理系统缓存错误

最近在做清理系统缓存功能时,用到以下方法 PackageManager pm = context.getPackageManager(); Method localMethod = pm.getClass().getMethod("freeStorageAndNotify", Long.TYPE, IPackageDataObserver.class); Long localLong = Long.valueOf(getEnvironmentSize() - 1L); Object[]

android系统cpu资源相关查询

android系统cpu资源相关查询 我们都知道android是基于linux系统内核的,在linux系统中我们查看系统资源消耗情况,一个可以直接通过命令行的top命令来看,里面有cpu具体的使用情况,当然在android系统上也还是保留了的.top还是很有用,那在android应用上怎么表现出来呢? 在[设置]应用中,在开发者选项里面就有一项现成的看cpu使用情况的,具体情况的显示是显示在ui的系统层,而不是activities,是始终高于activities的,保障在任何应用界面里都可以显示

Android系统应用信息中存储和缓存的计算方法

进行如下操作: 设置->应用->选择一个应用->应用信息 会到达如下界面: 可以看到这个应用占用的磁盘空间. 先说结果,这几项会计算哪些文件(夹). 1.应用,由三项相加组成 /data/data/com.myapp/lib,即so库文件夹大小 /data/app/com.myapp-1.apk,原始apk文件的复制 /data/dalvik-cache/[email protected]@[email protected],dalvik虚拟机对dex文件的缓存 2.USB存储(应用).

近期小结--Android系统时间获取及AVD模拟GPS相关调试

GPS应用调试 近期在AVD上调试GPS应用时,获取location信息,但是往往在调试中loc是null的,因为首先需要在AVD中手动添加GPS信息,有两种手动添加方法 1.在eclipse下,windows-->open perspective-->DDMS-->Emulator control-->Manual下手动设置经纬度,并按send按钮. 2.在cmd下手动添加信息. (1)首先打开模拟器,然后运行cmd,输入telnet localhost 5554(注:5554是

关于获取Android系统所有已安装App信息的一些操作(详细)

转载请注明出处:http://blog.csdn.net/qinjuning       本节内容是如何获取Android系统中应用程序的信息,主要包括packagename.label.icon.占用大小等.具体分为两个 部分,计划如下:  第一部分: 获取应用程序的packagename.label.icon等 :             第二部分:获取应用程序的占用大小,包括:缓存大小(cachsize).数据大小(datasize). 每部分都为您准备了简单丰富的实例,您一定不会错过.

深入浅出 - Android系统移植与平台开发(十二)- Android JNI机制

第五章.JNI机制 4.1 JNI概述 由前面基础知识可知,Android的应用层由Java语言编写,Framework框架层则是由Java代码与C/C++语言实现,之所以由两种不同的语言组合开发框架层,是由于Java代码是与硬件环境彻底"隔离"的跨平台语言,Java代码无法直接操作硬件. 比方:Android系统支持大量传感器.Java运行在虚拟机中,无法直接得到传感器数据.而Android系统基于Linux操作系统.在Linux操作系统中C/C++通过Linux提供的系统调用接口能

分享基于Android系统的XMPP即时通讯技术项目实战(仿微信开发架构,自定义控件)

即时通讯技术是 网络技术中的明珠.即时通讯产品改变了人们的生活习惯.经过十几年的发展,即时通讯功能的应用也逐渐从专门软件才能实现的功能逐渐成为标准配置.即时通讯技术的应用不仅仅只是用于社交领域,在大多的协同工作领域,以及需要分布结构的网络通讯领域都是非常重要的.讲师本人在android领域有多年的开发经验,在即时通讯系统方面也有深入的研究.在本课程中,详细讲解了android开发中要解决的一些主要的问题,即时通讯在客户端实现的过程,并手把手的进行操作,方便学习和理解.因为课时的原因,对于一些初级