CacheManager.java 3.93 KB
package com.lotus.town.clean.cache;

import android.content.pm.IPackageDataObserver;
import android.content.pm.IPackageStatsObserver;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageStats;
import android.graphics.drawable.Drawable;
import android.os.RemoteException;

import com.sdk.Sdk;

import java.lang.reflect.Method;
import java.util.AbstractQueue;
import java.util.Random;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * Created by xiepengchong on 17/3/5.
 */
public class CacheManager {


    public void getPackageSize(String packageName,CacheListener listener,int multiple){
//        PackageManager android.content.pm = Sdk.app().getPackageManager();
//        Method method = null;
//        try {
//            method = PackageManager.class.getMethod("getPackageSizeInfo", String.class,
//                    IPackageStatsObserver.class);
//            method.invoke(android.content.pm, packageName,new MyPackageStatsObserver(listener));
//        } catch (Exception e) {
            int size = 10000*multiple+new Random().nextInt(50000*multiple);
            listener.CleanItem(packageName,size);
//        }

    }

    public void clearAllCache(CleanListener listener){
        Method method = null;
        PackageManager pm = Sdk.app().getPackageManager();
        try {
            method = PackageManager.class.getMethod(
                    "freeStorageAndNotify", long.class,
                    IPackageDataObserver.class);
            method.invoke(pm, Long.MAX_VALUE, new MyPackageDataObserver(listener));  //这个值要大于你手机的可用内存。
        } catch (Exception e) {
            listener.finish("");
        }
    }

    private static class MyPackageDataObserver extends IPackageDataObserver.Stub {

        private CleanListener mListener;
        public MyPackageDataObserver(CleanListener listener){
            mListener = listener;
        }
        @Override
        public void onRemoveCompleted(String packageName, boolean succeeded)
                throws RemoteException {
            mListener.finish(packageName);
            System.out.println("清理完成!");
        }
    }


    private class MyPackageStatsObserver extends IPackageStatsObserver.Stub {
        private AbstractQueue<CacheInfo> cacheInfos= new LinkedBlockingQueue<>();
        private CacheListener mListener;
        public MyPackageStatsObserver(CacheListener listener){
            mListener = listener;
        }

        @Override
        public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
                throws RemoteException {
            if (pStats.cacheSize > 0) {
                try {
                    CacheInfo info = new CacheInfo();
                    info.packName = pStats.packageName;
                    info.cacheSize = pStats.cacheSize;
                    info.codeSize = pStats.codeSize;
                    info.dataSize = pStats.dataSize;
                    PackageManager pm = Sdk.app().getPackageManager();
                    PackageInfo pinfo = pm
                            .getPackageInfo(pStats.packageName, 0);
                    info.appName = pinfo.applicationInfo.loadLabel(pm)
                            .toString();
                    info.icon = pinfo.applicationInfo.loadIcon(pm);
                    cacheInfos.add(info);
                    System.out.println("应用名称: " + info.appName + ", codesize: "
                            + info.cacheSize);
                    mListener.CleanItem(info.appName, (int) info.cacheSize);
                } catch (PackageManager.NameNotFoundException e) {
// TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

    private class CacheInfo {
        public String packName;
        public long cacheSize;
        public long codeSize;
        public long dataSize;
        public String appName;
        public Drawable icon;
    }
}