AmazingCounters.com

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

 

本文为博主原创文章,转载请注明出处

 http://www.cnblogs.com/rencm/p/5157114.html

posted @ 2016-01-25 12:33  rencm  阅读(13931)  评论(8编辑  收藏  举报