删除所有应用缓存 但是有的机器不能全部删除,还剩12KB
解释如下:
Android4.2应用在首次安装时,它们的应用程序目录是不存在cache目录的。这也是为什么一开始为Cache Size为零的原因。而应用被使用Cache目录
便会自动生成。
而
Clear Cache
只清空Cache目录(删除子文件及子文件夹)
,不删除Cache目录本身
。
import java.io.File;
import java.lang.reflect.Method;
import android.content.Context;
import android.content.pm.IPackageDataObserver;
import android.content.pm.PackageManager;
import android.os.Environment;
import android.os.RemoteException;
import android.os.StatFs;
/**
* 1.功能相当于,点击了 应用程序信息 里面的 清楚缓存按钮,而非 清除数据
*
* 2.功能相当于,删除了/data/data/packageName/cache 文件夹里面所有的东西
*
* 3.需要权限 <uses-permission android:name="android.permission.CLEAR_APP_CACHE" />
*/
public class CacheClearHelper {
public static void clearCache(Context context) {
try {
PackageManager packageManager = context.getPackageManager();
Method localMethod = packageManager.getClass().getMethod("freeStorageAndNotify", Long.TYPE,
IPackageDataObserver.class);
Long localLong = Long.valueOf(getEnvironmentSize() - 1L);
Object[] arrayOfObject = new Object[2];
arrayOfObject[0] = localLong;
localMethod.invoke(packageManager, localLong, new IPackageDataObserver.Stub() {
@Override
public void onRemoveCompleted(String packageName, boolean succeeded) throws RemoteException {
}
});
} catch (Exception e) {
e.printStackTrace();
}
}
private static long getEnvironmentSize() {
File localFile = Environment.getDataDirectory();
long l1;
if (localFile == null)
l1 = 0L;
while (true) {
String str = localFile.getPath();
StatFs localStatFs = new StatFs(str);
long l2 = localStatFs.getBlockSize();
l1 = localStatFs.getBlockCount() * l2;
return l1;
}
}
}
IPackageDataObserver.aidl的内容是:
/*
**
** Copyright 2007, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
package android.content.pm;
/**
* API for package data change related callbacks from the Package Manager.
* Some usage scenarios include deletion of cache directory, generate
* statistics related to code, data, cache usage(TODO)
* {@hide}
*/
oneway interface IPackageDataObserver {
void onRemoveCompleted(in String packageName, boolean succeeded);
}
**
** Copyright 2007, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
package android.content.pm;
/**
* API for package data change related callbacks from the Package Manager.
* Some usage scenarios include deletion of cache directory, generate
* statistics related to code, data, cache usage(TODO)
* {@hide}
*/
oneway interface IPackageDataObserver {
void onRemoveCompleted(in String packageName, boolean succeeded);
}
或者直接跳到设置界面里 删除该应用缓存
Intent intent = new Intent();
intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
intent.setData(Uri.parse("package:" + cacheInfos.get(position).getPackageName()));
startActivity(intent);