当前位置: 代码迷 >> Android >> Android中应用程序扫除data/data,清除cache,超详细
  详细解决方案

Android中应用程序扫除data/data,清除cache,超详细

热度:90   发布时间:2016-04-24 11:47:15.0
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~~~~~~~~  

 

  相关解决方案