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

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐