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

时间: 2025-01-19 23:17:15

Android中应用程序清除data/data,清除cache,超详细的相关文章

如何确定android中的程序入口?

1.如何确定android中的程序入口? 需要在AndroidMainifest.xml文件中添加这个Activity的配置信息,同时将DemoActivity配置中的intent-filter移动到LauncherActivity配置中. <activity android:name=".DemoActivity" android:label="@string/app_name" > </activity> <activity and

Android中应用程序获得系统权限

Android中如何修改系统时间(应用程序获得系统权限) 在 android 的API中有提供 SystemClock.setCurrentTimeMillis()函数来修改系统时间,可惜无论你怎么调用这个函数都是没用的,无论模拟器还是真 机,在logcat中总会得到"Unable to open alarm driver: Permission denied ".这个函数需要root权限或者运行与系统进程中才可以用. 本来以为就没有办法在应用程序这一层改系统时间了,后来在网上搜了好久

Android中多线程编程(四)AsyncTask类的详细解释(附源码)

Android中多线程编程中AsyncTask类的详细解释 1.Android单线程模型 2.耗时操作放在非主线程中执行 Android主线程和子线程之间的通信封装类:AsyncTask类 1.子线程中更新UI 2.封装.简化异步操作. 3.AsyncTask机制:底层是通过线程池来工作的,当一个线程没有执行完毕,后边的线程是无法执行的.必须等前边的线程执行完毕后,后边的线程才能执行. AsyncTask类使用注意事项: 1.在UI线程中创建AsyncTask的实例 2.必须在UI线程中调用As

王立平--android中让程序终止退出的解决办法 System.exit(0)

System.exit(0); System.exit(0)是将你的整个虚拟机里的内容都停掉了, 而finish()只是退出了activity,并没有退出应用,Application还是存在于内存中的,除非被系统回收. System.exit(0)是正常退出程序, System.exit(1)或者说非0表示非正常退出程序 System.exit(status)不管status为何值都会退出程序. 和return 相比有以下不同点:return是回到上一层,而System.exit(status)

Android系统篇之----Android中的run-as命令引出升降权限的安全问题(Linux中的setuid和setgid)

一.前言 最近一周比较忙,没时间写东西了,今天继续开始我们今天的话题:run-as命令,在上周的开发中,遇到一个问题,就是在使用run-as命令的时候出现了一个错误,不过当时因为工作进度的问题,这问题就搁浅没有解决,用了其他一个曲线救国的方式去解决的.那么咋们今天闲来说说Android中的run-as命令吧. 二.遇到的问题&解决问题 Android中我们知道如果设备没有root,我们想看一个应用的沙盒数据(/data/data/目录内容),在以前的方式很难办到,一般人都是选择root之后,去查

Android中的UID和PID意义,及查看方式

Pid是进程ID,Uid是用户ID,只是Android和计算机不一样,计算机每个用户都具有一个Uid,哪个用户start的程序,这个程序的Uid就是那个用户,而Android中每个程序都有一个Uid,默认情况下,Android会给每个程序分配一个普通级别互不相同的 Uid,如果用互相调用,只能是Uid相同才行,这就使得共享数据具有了一定安全性,每个软件之间是不能随意获得数据的.而同一个application 只有一个Uid,所以application下的Activity之间不存在访问权限的问题.

解决Android studio 中的 Android Device Monitor 中 File Explorer 无法打开data目录的方法(转载 http://www.jianshu.com/p/d8a9a2918c61)

Android Device Monitor 文件管理的常见问题  (转自http://www.jianshu.com/p/d8a9a2918c61) 作者 knightaoko 关注 2017.03.21 11:41* 字数 2750 阅读 770评论 5喜欢 9 Android Device Monitor 是 Android Studio 中用于监测模拟器或真机运行状态的一款开发者工具.但开发者在使用它的过程中往往会遇到很多问题,尤其对于新手.本文分析了实际学习中遇到的问题,包括:1. F

在windows操作系统中,查询端口占用和清除端口占用的程序

一.在windows操作系统中,查询端口占用和清除端口占用的程序 提升权限后用:netstat -b或用 1.查询端口占用的进程ID 点击"开始"-->"运行",输入"cmd"后点击确定按钮,进入DOS窗口,接下来分别运行以下命令:netstat -a -n  各个端口占用netstat -ano   各个端口占用和进程PID          netstat -aon | findstr "80"      C:\Us

程序中的bss段,data段,代码段,堆,栈

程序中的bss段,data段,代码段(.text),堆(heap),栈(stack) .bss段:程序中未初始化的和已经初始化为0的全局变量和已经初始化为0的静态局部变量(static) .data段:程序中已经初始化的非零的全局变量和已经初始化的非零的静态局部变量(static) 代码段:用来存放代码的地方(.text段),不可修改,存放在只读区域内. 堆:程序员自己申请的内存区域,也就是用malloc()函数申请的内存区域,用free()函数来释放的区域. 栈:存放局部变量的区域,函数中的局