清理手机应用程序缓存。
拿到模块后,先实现UI界面。界面实现后开始思考整个模块要实现的功能,然后是要使用的API。
第一步:先拿到包管理器
PackageManager pm=getPackageManager();
第二步:利用包管理器拿到所有安装在手机上的apk包信息的集合
pm.getInstalledPackages(0);
第三步:遍历包信息 查看每个包信息的缓存信息。
第四步:查询源码后我们知道了通过包管理的getPackageSizeInfo方法可以得到应用程序的缓存大小。
getPackageSizeInfo(String packageName, IPackageStatsObserver observer)
第五步:由于这个方法加了这样一个注解“@hide”,所以被隐藏了,所以我们要用反射来使用这个方法。
Method method=null;
Method[] methods = PackageManager.class.getMethods();
for(Method m:methods){
if("getPackageSizeInfo".equals(m.getName())){
method=m;
}
}
第六步:得到这个方法后,我们知道使用这个方法需要一个服务的接口对象,所以我们应该得到这个对象,
我们查找源文件得到aidl文件复制到工程里,然后创建接口对象。
IPackageStatsObserver.aidl IPackageDataObserver.aidl
使用远程服务需要aidl文件,找到aidl文件后建好相应的包名后,就可以开始使用这个方法了。
第七步:实现IPackageStatsObserver接口的实现类。
通过源码我们已经知道通过PackageStats可以得到应用程序的大小,缓存大小,代码的大小。
class myDataObserver extends IPackageStatsObserver.Stub{
@Override
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
throws RemoteException {
}
}
第八步:开始实现逻辑,更新UI。
第九步:需要权限。GET_PACKAGE_SIZE
第十步:一键清理全部缓存
利用反射得到清理缓存的方法freeStorageAndNotify(long freeStorageSize, IPackageDataObserver observer)
需要权限:android.permission.CLEAR_APP_CACHE.
PackageManager pm = getPackageManager();
List<PackageInfo> installedPackages = pm.getInstalledPackages(0);
Method[] methods = PackageManager.class.getMethods();
Method method = null;
for(Method m:methods){
if("getPackageSizeInfo".equals(m.getName())){
method=m;
}
}
for(PackageInfo packageinfo:installedPackages){
try {
method.invoke(pm,packageinfo.packageName, new myDataObserver());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
class myDataObserver extends IPackageStatsObserver.Stub{
@Override
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
throws RemoteException {
}
}
拿到模块后,先实现UI界面。界面实现后开始思考整个模块要实现的功能,然后是要使用的API。
第一步:先拿到包管理器
PackageManager pm=getPackageManager();
第二步:利用包管理器拿到所有安装在手机上的apk包信息的集合
pm.getInstalledPackages(0);
第三步:遍历包信息 查看每个包信息的缓存信息。
第四步:查询源码后我们知道了通过包管理的getPackageSizeInfo方法可以得到应用程序的缓存大小。
getPackageSizeInfo(String packageName, IPackageStatsObserver observer)
第五步:由于这个方法加了这样一个注解“@hide”,所以被隐藏了,所以我们要用反射来使用这个方法。
Method method=null;
Method[] methods = PackageManager.class.getMethods();
for(Method m:methods){
if("getPackageSizeInfo".equals(m.getName())){
method=m;
}
}
第六步:得到这个方法后,我们知道使用这个方法需要一个服务的接口对象,所以我们应该得到这个对象,
我们查找源文件得到aidl文件复制到工程里,然后创建接口对象。
IPackageStatsObserver.aidl IPackageDataObserver.aidl
使用远程服务需要aidl文件,找到aidl文件后建好相应的包名后,就可以开始使用这个方法了。
第七步:实现IPackageStatsObserver接口的实现类。
通过源码我们已经知道通过PackageStats可以得到应用程序的大小,缓存大小,代码的大小。
class myDataObserver extends IPackageStatsObserver.Stub{
@Override
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
throws RemoteException {
}
}
第八步:开始实现逻辑,更新UI。
第九步:需要权限。GET_PACKAGE_SIZE
第十步:一键清理全部缓存
利用反射得到清理缓存的方法freeStorageAndNotify(long freeStorageSize, IPackageDataObserver observer)
需要权限:android.permission.CLEAR_APP_CACHE.
PackageManager pm = getPackageManager();
List<PackageInfo> installedPackages = pm.getInstalledPackages(0);
Method[] methods = PackageManager.class.getMethods();
Method method = null;
for(Method m:methods){
if("getPackageSizeInfo".equals(m.getName())){
method=m;
}
}
for(PackageInfo packageinfo:installedPackages){
try {
method.invoke(pm,packageinfo.packageName, new myDataObserver());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
class myDataObserver extends IPackageStatsObserver.Stub{
@Override
public void onGetStatsCompleted(PackageStats pStats, boolean succeeded)
throws RemoteException {
}
}