Android获取各个应用程序的缓存文件代码小片段(使用AIDL)

import java.lang.reflect.InvocationTargetException;

import java.lang.reflect.Method;

import java.util.List;

import android.app.Activity;

import android.content.Intent;

import android.content.pm.ApplicationInfo;

import android.content.pm.IPackageDataObserver;

import android.content.pm.IPackageStatsObserver;

import android.content.pm.PackageInfo;

import android.content.pm.PackageManager;

import android.content.pm.PackageManager.NameNotFoundException;

import android.content.pm.PackageStats;

import android.net.Uri;

import android.os.Bundle;

import android.os.RemoteException;

import android.text.format.Formatter;

import android.view.View;

import android.view.View.OnClickListener;

import android.widget.ImageView;

import android.widget.LinearLayout;

import android.widget.ProgressBar;

import android.widget.TextView;

import android.widget.Toast;

public class CleanCacheActivity extends Activity {

private TextView tv_scan_status;

private ProgressBar pb;

private PackageManager pm;

private LinearLayout ll_container;

private boolean flag = false;

private long totalCleanSize = 0;

private long tempCache;

private View romoveview;

private boolean isExitsCache = true;

private Method getPackageSizeInfoMethod = null;  //API隐藏的方法

private String cleanPackgename ; //要清理缓存的包名

private Toast toast;

@Override

protected void onCreate(Bundle savedInstanceState) {

// TODO Auto-generated method stub

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_clean_cache);

tv_scan_status = (TextView) findViewById(R.id.tv_scan_status);

pb = (ProgressBar) findViewById(R.id.pb);

ll_container = (LinearLayout) findViewById(R.id.ll_container);

scanCache();

}

/**

* 扫描手机里面全部应用程序的缓存信息

*/

private void scanCache() {

pm = getPackageManager();

new Thread(){

public void run() {

//1.先找到获取缓存的方法(这种方法是被API隐藏起来的。所以要先获取类的字节码。再反射)

Method[] methods = PackageManager.class.getMethods();

for(Method method : methods){

if("getPackageSizeInfo".equals(method.getName())){

getPackageSizeInfoMethod = method;

break;

}

}

//2.在每个应用程序中使用该方法获取全部的缓存文件

List<PackageInfo> packInfos = pm.getInstalledPackages(0);

pb.setMax(packInfos.size());

int progress = 0;

for(PackageInfo packInfo : packInfos){

try {

getPackageSizeInfoMethod.invoke(pm, packInfo.packageName, new MyDataObserver()); //子线程中运行

Thread.sleep(200);

progress++;

pb.setProgress(progress);

} catch (Exception e) {

e.printStackTrace();

}

}

if(progress >= packInfos.size()){

runOnUiThread(new Runnable() {

@Override

public void run() {

tv_scan_status.setText("扫描完成...");

}

});

}

//所有扫描完成没有发现一个缓存

if(flag == false){

runOnUiThread( new Runnable() {

public void run() {

String text =  "恭喜您手机非常干净。没有缓存须要清理";

showToast(text);

tv_scan_status.setText("扫描完成。没发现缓存");

}

});

}

};

}.start();

}

//请注意,这个父类的方法是在子线程中运行的,所以要更新UI界面的话,要在主线程

private class MyDataObserver extends IPackageStatsObserver.Stub{

@Override

public void onGetStatsCompleted(final PackageStats pStats, boolean succeeded)

throws RemoteException {

final long cache = pStats.cacheSize;

final ApplicationInfo appInfo;

try {

appInfo = pm.getApplicationInfo(pStats.packageName, 0);

//更新界面

runOnUiThread(new Runnable() {

@Override

public void run() {

tv_scan_status.setText("正在扫描"+appInfo.loadLabel(pm).toString());

if(cache > 0){  //有缓存信息的应用

flag = true;//存在缓存文件

totalCleanSize += cache;

final View view = View.inflate(getApplicationContext(), R.layout.list_item_cacheinfo, null);

TextView tv_cache_size = (TextView) view.findViewById(R.id.tv_cache_size);

tv_cache_size.setText("缓存大小: "+

Formatter.formatFileSize(getApplicationContext(), cache));

TextView tv_name = (TextView) view.findViewById(R.id.tv_app_name);

tv_name.setText(appInfo.loadLabel(pm).toString());

ImageView iv_icon = (ImageView) view.findViewById(R.id.iv_app_icon);

iv_icon.setImageDrawable(appInfo.loadIcon(pm));

ImageView iv_clean = (ImageView) view.findViewById(R.id.iv_clean);

iv_clean.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

tempCache = cache;

cleanPackgename = appInfo.packageName;

romoveview = view;

Intent intent = new Intent();

intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");

intent.addCategory("android.intent.category.DEFAULT");

intent.setData(Uri.parse("package:" + cleanPackgename));

startActivityForResult(intent, 0);

}

});

ll_container.addView(view, 0);

}

}

});

} catch (NameNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

//请注意。这个父类的方法是在子线程中运行的。所以要更新UI界面的话,要在主线程

private class MyDataObserver2 extends IPackageStatsObserver.Stub{

@Override

public void onGetStatsCompleted(final PackageStats pStats, boolean succeeded)

throws RemoteException {

isExitsCache = false;

System.out.println(pStats.cacheSize);

if(pStats.cacheSize > 0){   //还存在缓存

isExitsCache = true;

}

}

}

@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

//又一次查询一次看是否缓存已被清理

try {

getPackageSizeInfoMethod.invoke(pm, cleanPackgename, new MyDataObserver2());  //子线程中运行

Thread.sleep(200);

} catch (Exception e) {

e.printStackTrace();

}

if(isExitsCache){

}else{   //此缓存已经不存在了,更新界面

String text =  "释放了"+Formatter.formatFileSize(getApplicationContext(), tempCache)+"的内存空间";

showToast(text);

ll_container.removeView(romoveview);

}

super.onActivityResult(requestCode, resultCode, data);

}

//请注意。这个父类的方法是在子线程中运行的,所以要更新UI界面的话,要在主线程

private class MypackDataObserver extends IPackageDataObserver.Stub{

@Override

public void onRemoveCompleted(String packageName, boolean succeeded)

throws RemoteException {

runOnUiThread(new Runnable() {

@Override

public void run() {

ll_container.removeAllViews();

String text = "释放了"+ Formatter.formatFileSize(getApplicationContext(), totalCleanSize)+

"的内存空间\n恭喜您手机非常干净,没有缓存须要清理";

showToast(text);

totalCleanSize = 0;

tv_scan_status.setText("缓存清理完成");

}

});

}

}

/**

* 清理手机的所有缓存

* freeStorageAndNotify() 为系统隐藏的API,所以要用反射把它找出来

* @param view

*/

public void cleanAll(View view){

Method[] methods = PackageManager.class.getMethods();

for(Method method : methods){

if("freeStorageAndNotify".equals(method.getName())){

try {

method.invoke(pm, Integer.MAX_VALUE, new MypackDataObserver());

} catch (Exception e) {

e.printStackTrace();

}

}

}

}

private void showToast(String text) {

if(toast == null){

toast = Toast.makeText(getApplicationContext(), text, 0);

}else{

toast.setText(text);

toast.setDuration(0);

}

toast.show();

}

}

时间: 2024-10-12 08:11:01

Android获取各个应用程序的缓存文件代码小片段(使用AIDL)的相关文章

Android获取桌面应用程序

首先在看这个博客之前, 你可以先看下这个博客,http://blog.csdn.net/harryweasley/article/details/50057707 里面介绍了两种方式来获取应用程序的信息,一种是packageInfo,一种是ResolveInfo,通过packageInfo来获取应用信息,会出现一个bug,那就是如果该应用,有多个图标和名字,那么只会默认显示第一个.所以我现在用ResolveInfo来获取用户信息. 关于多个图标和名字,不理解的,可以看这篇文章.http://bl

Android获取网页上的图片的代码

public Bitmap getWebBitmap(String imgUrl) { Bitmap bitmap =null; try { InputStream inputStream = null; URL url; url = new URL(imgUrl); if (url != null) { // 打开连接 HttpURLConnection httpURLConnection = (HttpURLConnection) url .openConnection(); httpURL

android获取当前应用程序路径

// 获取当前程序路径 getApplicationContext().getFilesDir().getAbsolutePath(); // 获取该程序的安装包路径 String path=getApplicationContext().getPackageResourcePath(); // 获取程序默认数据库路径 getApplicationContext().getDatabasePath(s).getAbsolutePath();

Android下最小化程序到后台代码

procedure TForm1.Button4Click(Sender: TObject); var    Intent: JIntent; begin    Intent := TJIntent.JavaClass.init(TJIntent.JavaClass.ACTION_MAIN);    Intent.addCategory(TJIntent.JavaClass.CATEGORY_HOME);    Intent.setFlags(TJIntent.JavaClass.FLAG_AC

JavaScript 代码小片段

获取对象 obj 的所有属性(自有属性和继承属性),保存到数组 lst 中 1 //获取对象obj的所有属性(自有属性和继承属性),保存到数组lst 中 2 var lst = []; 3 function getAllAttrs(obj){ 4 var arr = Object.getOwnPropertyNames(obj); 5 for(r in arr){ 6 lst.push(arr[r]); 7 } 8 if(obj.__proto__ !== null){ 9 obj = obj.

算法代码小片段

/* * 求两点夹角 */ public static float GetAngleTwoPoint(float px1, float py1, float px2, float py2) { float x1 = px2 - px1; float y1 = py2 - py1; float hypotenuse = Mathf.Sqrt(Mathf.Pow(x1, 2) + Mathf.Pow(y1, 2)); float cos = x1 / hypotenuse; float radian

Android获取正在运行的程序并kill掉它

获取正在运行的程序并把它加入到一个listview的adapter类面,方法如下: // 正在运行的 public List<Programe> getRunningProcess() { pi = new PackagesInfo(this); am = (ActivityManager) getSystemService(ACTIVITY_SERVICE); // 获取正在运行的应用 run = am.getRunningAppProcesses(); // 获取包管理器,在这里主要通过包

android 获取手机的所有程序和widget的包名和启动类名

获取 widget可以 AppWidgetManager 来获取 List<AppWidgetProviderInfo> widget=AppWidgetManager.getInstance(Context(上下文)).getInstalledProviders(); 得到所有AppWidgetProviderInfo for (int i = 0; i < widget.size(); i++) {        AppWidgetProviderInfo info=widget.g

请给出程序,功能为获取“一段程序代码”运行时长

有一天看到了几个java题目,我就写了一下,废话少说,直接上代码了 3.已知int型数组arr[t], 请:① 打印该数组.输出格式为:[arr1,arr2,arr3,...]. ② 输出数组的最大值max与最小值min. ③ 使用冒泡排序对数组进行排序,并打印排序后数组. 4. 请给出程序,功能为获取“一段程序代码”运行时长.要求: ① 程序框架在父类中定义. ② “一段程序代码”在子类中给出,并覆盖父类中对应方法. ③ “一段程序代码”为:打印一个由“*”组成的图形,见图1. 图1 第三题: