代码片段:

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(安卓)SQLiteOpenHelper
  2. android SQLite数据库使用实例
  3. android中操纵sqlite数据库
  4. 用 Kotlin 开发现代 Android(安卓)项目 Part 2
  5. Android(安卓)实战制作简易天气预报
  6. 重磅首发!Android(安卓)Jetpack Compose 完全开发手册,从入门到精
  7. Android(安卓)11 (R) 分区存储
  8. 安卓基础学习 Day01 |第一个安卓应用程序:Hello Word!
  9. android 学习视频

随机推荐

  1. Android(安卓)Camera之常用接口(人脸追踪
  2. Android接收/发送jSON数据
  3. Android(安卓)--- 应用中全局变量的设置
  4. Android(安卓)Service详解(五)---绑定服
  5. Android(安卓)WiFi扫描
  6. Android(安卓)播放本地视频
  7. Android(安卓)studio 2.3.3 调试编译时注
  8. Android(安卓)Material Design Library系
  9. 安卓入门准备第一步
  10. Android(安卓)Activity简介