Android获取/清除应用数据

代码片段:

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权限要求:

<uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/>
<uses-permission android:name="android.permission.DELETE_CACHE_FILES"/>

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值