代码片段:

import java.lang.reflect.Method;import android.content.Context;import android.content.pm.IPackageDataObserver;import android.content.pm.IPackageManager;import android.content.pm.IPackageStatsObserver;import android.content.pm.PackageManager;import android.content.pm.PackageStats;import android.os.RemoteException;import android.os.ServiceManager;import android.util.Log;public class CacheUtils {    private static final String TAG = CacheUtils.class.getSimpleName();    private final long MAX_WAIT_TIME = 60 * 1000;    private final long WAIT_TIME_INCR = 10 * 1000;        /**     * 获取应用数据大小 cache + data     *      * @param context     * @param packageName     * @return     * @throws Exception     */    public long getApplicationCache(Context context, String packageName) throws Exception {        try {            PackageStatsObserver observer = new PackageStatsObserver();            // wait on observer            synchronized (observer) {                Method method = PackageManager.class.getMethod("getPackageSizeInfo", new Class[] { String.class, IPackageStatsObserver.class });                method.invoke(context.getPackageManager(), packageName, observer);//                getPm().getPackageSizeInfo(packageName, UserHandle.myUserId(), observer);                long waitTime = 0;                while ((!observer.isDone()) || (waitTime > MAX_WAIT_TIME)) {                    observer.wait(WAIT_TIME_INCR);                    waitTime += WAIT_TIME_INCR;                }                if (!observer.isDone()) {                    throw new Exception("Timed out waiting for PackageStatsObserver.onGetStatsCompleted");                }            }            Log.d(TAG, "toString " + observer.stats.toString());            return observer.stats.dataSize + observer.stats.cacheSize;        } catch (RemoteException e) {            Log.w(TAG, "Failed to get handle for PackageManger Exception: " + e);            return -1;        } catch (InterruptedException e) {            Log.w(TAG, "InterruptedException :" + e);            return -1;        }    }    /**     * 清除应用数据     *      * @param context     * @param packageName     * @return     * @throws Exception     */    public boolean cleanApplicationUserData(Context context, String packageName) throws Exception {        try {            PackageDataObserver observer = new PackageDataObserver();            // wait on observer            synchronized (observer) {                Method method = PackageManager.class.getMethod("clearApplicationUserData", new Class[] { String.class, IPackageDataObserver.class });                method.invoke(context.getPackageManager(), packageName, observer);//                getPm().deleteApplicationCacheFiles(appid, observer);                long waitTime = 0;                while (!observer.isDone() || (waitTime > MAX_WAIT_TIME)) {                    observer.wait(WAIT_TIME_INCR);                    waitTime += WAIT_TIME_INCR;                }                if (!observer.isDone()) {                    throw new Exception("timed out waiting for PackageDataObserver.onRemoveCompleted");                }            }            Log.d(TAG, "cleanApplicationCache " + observer.retValue);            return observer.retValue;        } catch (RemoteException e) {            Log.w(TAG, "Failed to get handle for PackageManger Exception: " + e);            return false;        } catch (InterruptedException e) {            Log.w(TAG, "InterruptedException :" + e);            return false;        }    }    private IPackageManager getPm() {        return IPackageManager.Stub.asInterface(ServiceManager.getService("package"));    }    class PackageDataObserver extends IPackageDataObserver.Stub {        public boolean retValue = false;        private boolean doneFlag = false;        public void onRemoveCompleted(String packageName, boolean succeeded) throws RemoteException {            synchronized (this) {                retValue = succeeded;                doneFlag = true;                notifyAll();            }        }        public boolean isDone() {            return doneFlag;        }    }    class PackageStatsObserver extends IPackageStatsObserver.Stub {        public boolean retValue = false;        public PackageStats stats;        private boolean doneFlag = false;        public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException {            synchronized (this) {                retValue = succeeded;                stats = pStats;                doneFlag = true;                notifyAll();            }        }        public boolean isDone() {            return doneFlag;        }    }}

AndroidManifest权限要求:

 

 

更多相关文章

  1. android SQLite数据库使用实例
  2. android中操纵sqlite数据库
  3. Android图形系统(八)-app与SurfaceFlinger共享UI元数据过程
  4. android 开发-数据存储之文件存储
  5. 打造android ORM框架opendroid(四)——优雅的删除数据
  6. Android各种访问权限Permission详解
  7. 获取 Android 4.2 的 ROOT 权限(越狱)
  8. Android之ORMLite实现数据持久化的简单使用
  9. android访问远程数据库

随机推荐

  1. Android(安卓)HttpClient
  2. Android(安卓)多线程更新控件
  3. Android之自定义Adapter的ListView
  4. android 弹出视频
  5. Android中Broadcast的Intent大全
  6. Download Android(安卓)1.5 SDK, Release
  7. android典型代码系列(三十)------DES加密
  8. [android]上下文菜单
  9. android studio 0.80多渠道打包
  10. Android网络状态监听