zoukankan      html  css  js  c++  java
  • 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类似

  • 相关阅读:
    vscode snippet
    OpenGL Type
    [转] fio参数详解
    [转] openchannel SSD( OCSSD)
    [转]linux内存管理
    proc/meminfo && hugepage
    [转] 从free到 page cache
    [转]linux网络协议栈(1)——链路层
    [转]linux 网络协议栈(1)——网络设备
    [转]linux网络协议栈(1)——socket buffer
  • 原文地址:https://www.cnblogs.com/cbooy/p/4774729.html
Copyright © 2011-2022 走看看