CacheManager.java
3.93 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
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;
}
}