Android获取/清除应用数据
16lz
2021-01-23
代码片段:
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权限要求:
更多相关文章
- android SQLite数据库使用实例
- android中操纵sqlite数据库
- Android图形系统(八)-app与SurfaceFlinger共享UI元数据过程
- android 开发-数据存储之文件存储
- 打造android ORM框架opendroid(四)——优雅的删除数据
- Android各种访问权限Permission详解
- 获取 Android 4.2 的 ROOT 权限(越狱)
- Android之ORMLite实现数据持久化的简单使用
- android访问远程数据库