1. 程式人生 > >清理應用程式快取

清理應用程式快取

1、獲取應用程式快取資訊

2、清理快取(也可以不用步驟1,直接清理,步驟1只是為了知道哪些程式有快取)

1)

Method getPackageSizeInfo = pm.getClass().getMethod("getPackageSizeInfo", String.class, IPackageStatsObserver.class);   
			List<ApplicationInfo> application = new ArrayList();
			application = pm.getInstalledApplications(0);
			for(int i=0;i<application.size();i++)
			{
				ApplicationInfo app = application.get(i);
				getPackageSizeInfo.invoke(pm, app.packageName,  new IPackageStatsObserver.Stub() 
				{   
					@Override  
					public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException 
					{   
						if(pStats.cacheSize != 0)
						{
							cacheSize += pStats.cacheSize;
							Log.e(TAG, "cacheSize: " + pStats.packageName + "  ;" + pStats.cacheSize); 
						}
					}   
				});
			}


上面的方法 通過反射機制獲取應用程式的快取資訊

2)

Method localMethod = pm.getClass().getMethod("freeStorageAndNotify", Long.TYPE,IPackageDataObserver.class);
			Long localLong = Long.valueOf(getEnvironmentSize() - 1L);
			Object[] arrayOfObject = new Object[2];
		    arrayOfObject[0] = localLong;
		    localMethod.invoke(pm,localLong,new IPackageDataObserver.Stub()
		      {
				@Override
				public void onRemoveCompleted(String packageName,
						boolean succeeded) throws RemoteException 
						{
				}});


同樣通過反射,來清除快取

private long getEnvironmentSize()
    {
      File dataFile = Environment.getDataDirectory();
      if (dataFile == null)
        return 0;
      else
      {
        StatFs localStatFs = new StatFs(dataFile.getPath());
        long l2 = localStatFs.getBlockSize();
        return localStatFs.getBlockCount() * l2;
      }
    }

需要用到3個AIDL:
IPackageDataObserver.aidl 

IPackageStatsObserver.aidl

PackageStats.aidl