你的位置:首页 > 操作系统

[操作系统]Android中应用程序清除data/data,清除cache,超详细


清除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~~~~~~~~