在我正在制作的Android应用中,我希望能够以编程方式清除设备上所有应用的缓存。之前曾多次询问过这个问题: Clearing app cache programmatically? Reflecting methods to clear Android app cache Clear another applications cache 并且每个人都说没有root就不可能。
然而,事实显然并非如此。如果您查看应用程序App Cache Cleaner,History Eraser,1Tap Cleaner,Easy History Cleaner以及Google Play中的无数其他类似应用程序(所有这些应用程序都不需要root),您会发现他们都能做到这一点。因此,它可以做到,但我找不到任何公开的例子如何做到这一点。
有谁知道所有这些应用正在做什么?
由于
答案 0 :(得分:34)
这是一种不需要IPackageDataObserver.aidl
的方法:
PackageManager pm = getPackageManager();
// Get all methods on the PackageManager
Method[] methods = pm.getClass().getDeclaredMethods();
for (Method m : methods) {
if (m.getName().equals("freeStorage")) {
// Found the method I want to use
try {
long desiredFreeStorage = 8 * 1024 * 1024 * 1024; // Request for 8GB of free space
m.invoke(pm, desiredFreeStorage , null);
} catch (Exception e) {
// Method invocation failed. Could be a permission problem
}
break;
}
}
您需要在清单中加载:
<uses-permission android:name="android.permission.CLEAR_APP_CACHE"/>
这要求Android清除足够的缓存文件,以便有8GB空闲。如果你设置这个数字足够高,你应该达到你想要的(Android将删除缓存中的所有文件)。
这种方式的工作方式是Android保留所有应用程序缓存目录中所有文件的LRU(最近最少使用)列表。当您调用freeStorage()
时,它会检查存储量(在这种情况下为8GB)是否可用于缓存文件。如果没有,它首先通过删除最旧的文件开始从应用程序的缓存目录中删除文件。它会继续删除文件,直到没有任何文件要删除,或者它已经释放了您请求的存储量(在这种情况下为8GB)。
答案 1 :(得分:4)
您可以使用this(freeStorageAndNotify)方法清除所有应用的数据。您必须使用java反射访问此方法。你需要IPackageDataObserver.aidl。您还需要在清单文件中拥有删除缓存的权限