標籤:
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類似
Android系統緩衝相關