Android中应用程序清除data/data,清除cache,超详细
yypo5211
9年前
来自: http://www.cnblogs.com/rencm/p/5157114.html
清除data,清除cache,其实在Android原生Setting里面有这个功能的。
需求是把这个功能做到自己的App里面,并计算出cache和data的size。
所以参考了一下Setting的源码。看如何实现该功能:
首先需要写两个aidl去调用系统的清除以及获取size功能:
IPackageStatsObserver.aidl -- 获取data以及cache的size
/* ** ** Copyright 2007, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. ** You may obtain a copy of the License at ** ** http://www.apache.org/licenses/LICENSE-2.0 ** ** Unless required by applicable law or agreed to in writing, software ** distributed under the License is distributed on an "AS IS" BASIS, ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ** See the License for the specific language governing permissions and ** limitations under the License. */ package android.content.pm; import android.content.pm.PackageStats; /** * API for package data change related callbacks from the Package Manager. * Some usage scenarios include deletion of cache directory, generate * statistics related to code, data, cache usage(TODO) * {@hide} */ oneway interface IPackageStatsObserver { void onGetStatsCompleted(in PackageStats pStats, boolean succeeded); }
IPackageDataObserver.aidl -- 清除完成
/* ** ** Copyright 2007, The Android Open Source Project ** ** Licensed under the Apache License, Version 2.0 (the "License"); ** you may not use this file except in compliance with the License. ** You may obtain a copy of the License at ** ** http://www.apache.org/licenses/LICENSE-2.0 ** ** Unless required by applicable law or agreed to in writing, software ** distributed under the License is distributed on an "AS IS" BASIS, ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ** See the License for the specific language governing permissions and ** limitations under the License. */ package android.content.pm; /** * API for package data change related callbacks from the Package Manager. * Some usage scenarios include deletion of cache directory, generate * statistics related to code, data, cache usage(TODO) * {@hide} */ oneway interface IPackageDataObserver { void onRemoveCompleted(in String packageName, boolean succeeded); }
然后Java代码实现:
private Handler handler=new Handler(){ public void handleMessage(android.os.Message msg) { switch (msg.what) { case Constant.Hanler.MSG_GET_DATASIZE: String size=Formatter.formatFileSize(AppDetialActivity.this, catcheSize); tv_catcheSize.setText(size); break; case Constant.Hanler.MSG_CLEAR_DATA_SUCCESS: String pkgname=(String) msg.obj; getSize(pkgname); break; default: break; } }; };
通过包名清除数据
private ClearUserDataObserver mClearDataObserver; private void clearData(String packagename){ if (mClearDataObserver == null) { mClearDataObserver = new ClearUserDataObserver(); } ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); boolean res = am.clearApplicationUserData(packageName, mClearDataObserver); if (!res) { // Clearing data failed for some obscure reason. Just log error for now Log.i(TAG, "Couldnt clear application user data for package:" + packageName); showToast("Clear failed"); } else { } }
清除完成回调
class ClearUserDataObserver extends IPackageDataObserver.Stub { public void onRemoveCompleted(final String packageName, final boolean succeeded) { Logger.d(TAG, "packageName "+packageName +" succeeded "+succeeded); if(succeeded){ Message msg=Message.obtain(); msg.what=Constant.Hanler.MSG_CLEAR_DATA_SUCCESS; msg.obj=packageName; handler.sendMessage(msg); } } }
获取data,cache文件size
private void getSize(String packageName) { if (!Util.isNullStr(packageName)) { PackageManager pManager = getPackageManager(); pManager.getPackageSizeInfo(packageName, statsObserver); } } IPackageStatsObserver statsObserver = new IPackageStatsObserver.Stub() { @Override public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException { // TODO Auto-generated method stub catcheSize = pStats.dataSize; handler.sendEmptyMessage(Constant.Hanler.MSG_GET_DATASIZE); } };
到此就OK~~~~~~~~