Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android中應用程序清除data/data,清除cache,超詳細,androidcache

Android中應用程序清除data/data,清除cache,超詳細,androidcache

編輯:關於android開發

Android中應用程序清除data/data,清除cache,超詳細,androidcache


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

 

  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved