package com.yzy.supercleanmaster.engine; import android.content.Context; import android.content.pm.ApplicationInfo; 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.Handler; import android.os.RemoteException; import com.yzy.supercleanmaster.model.CacheInfo; import com.yzy.supercleanmaster.utils.TextFormater; import java.lang.reflect.Method; import java.util.List; import java.util.Vector; public class CacheInfoProvider { private Handler handler; private PackageManager packageManager; private Vector<CacheInfo> cacheInfos; private int size = 0; public CacheInfoProvider(Handler handler, Context context) { // 拿到一个包管理器 packageManager = context.getPackageManager(); this.handler = handler; cacheInfos = new Vector<CacheInfo>(); } public void initCacheInfos() { // 获取到所有安装了的应用程序的信息,包括那些卸载了的,但没有清除数据的应用程序 List<PackageInfo> packageInfos = packageManager .getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES); size = packageInfos.size(); for (int i = 0; i < size; i++) { PackageInfo packageInfo = packageInfos.get(i); CacheInfo cacheInfo = new CacheInfo(); // 拿到包名 String packageName = packageInfo.packageName; cacheInfo.setPackageName(packageName); // 拿到应用程序的信息 ApplicationInfo applicationInfo = packageInfo.applicationInfo; // 拿到应用程序的程序名 String name = applicationInfo.loadLabel(packageManager).toString(); cacheInfo.setName(name); // 拿到应用程序的图标 Drawable icon = applicationInfo.loadIcon(packageManager); cacheInfo.setIcon(icon); initDataSize(cacheInfo, i); } } /** * 通过AIDL的方法来获取到应用的缓存信息,getPackageSizeInfo是PackageManager里面的一个私有方法来的 * 我们通过反射就可以调用到它的了,但是这个方法里面会传递一个IPackageStatsObserver.Stub的对象 * 里面就可能通过AIDL来获取我们想要的信息了 * * 因为这样的调用是异步的,所以当我们完成获取完这些信息之后,我们就通过handler来发送一个消息 * 来通知我们的应用,通过getCacheInfos来获取到我们的Vector * * 为什么要用Vector呢,因为下面的方法是异步的,也就是有可能是多线程操作,所以我们就用了线程安全的Vector * * @param cacheInfo * @param position */ private void initDataSize(final CacheInfo cacheInfo, final int position) { try { Method method = PackageManager.class.getMethod( "getPackageSizeInfo", new Class[] { String.class, IPackageStatsObserver.class }); method.invoke(packageManager, new Object[] { cacheInfo.getPackageName(), new IPackageStatsObserver.Stub() { @Override public void onGetStatsCompleted( PackageStats pStats, boolean succeeded) throws RemoteException { System.out.println("onGetStatsCompleted" + position); long cacheSize = pStats.cacheSize; long codeSize = pStats.codeSize; long dataSize = pStats.dataSize; cacheInfo.setCacheSize(TextFormater .dataSizeFormat(cacheSize)); cacheInfo.setCodeSize(TextFormater .dataSizeFormat(codeSize)); cacheInfo.setDataSize(TextFormater .dataSizeFormat(dataSize)); cacheInfos.add(cacheInfo); if (position == (size - 1)) { // 当完全获取完信息之后,发送一个成功的消息 // 1对应的就是CacheClearActivity里面的FINISH handler.sendEmptyMessage(1); } } } }); } catch (Exception e) { e.printStackTrace(); } } public Vector<CacheInfo> getCacheInfos() { return cacheInfos; } public void setCacheInfos(Vector<CacheInfo> cacheInfos) { this.cacheInfos = cacheInfos; } }