Android中應用程序清除data/data,清除cache,超詳細
來自: 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); }</pre>
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); }</pre>
然后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; } };
};</pre>
通過包名清除數據
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 { }
}</pre>
清除完成回調
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); } } }</pre>
獲取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); }
};</pre>
到此就OK~~~~~~~~
</div>