Android实现清除应用程序缓存


我使用的是反射的方法来获取某个应用程序的缓存大小,但是没能实现通过反射的方法来清除该应用缓存,所以我只能调用系统的设置意图来清除缓存。而且在真机上没什么问题,模拟器上就有些问题了。


1.需要三个AIDL文件


注意:在添加三个aidl文件后一定要Rebuild Project一下,否则会报错。

1.

IPackageDataObserver.aidl 

package android.content.pm;
oneway interface IPackageDataObserver {
    void onRemoveCompleted(in String packageName, boolean succeeded);
}
2.
IPackageStatsObserver.aidl

package android.content.pm;

import android.content.pm.PackageStats;
oneway interface IPackageStatsObserver {
    
    void onGetStatsCompleted(in PackageStats pStats, boolean succeeded);
}

扫描二维码关注公众号,回复: 3207055 查看本文章

3.

PackageStats.aidl

package android.content.pm;
parcelable PackageStats;


需要的权限:

  <uses-permission android:name="android.permission.GET_PACKAGE_SIZE" />
  <uses-permission android:name="android.permission.CLEAR_APP_CACHE" />
<!--  <uses-permission android:name="android.permission.CLEAR_APP_USER_DATA"/>
  <uses-permission android:name="android.permission.DELETE_CACHE_FILES"/>-->


主要代码:

package zy.just.com.clearcachedemo;

import android.content.Intent;
import android.content.pm.IPackageStatsObserver;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageStats;
import android.net.Uri;
import android.os.Bundle;
import android.os.RemoteException;
import android.support.v7.app.AppCompatActivity;
import android.text.format.Formatter;
import android.view.View;
import android.widget.EditText;

import java.io.BufferedInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;


public class MainActivity extends AppCompatActivity {

    public static final String ENCODING="UTF-8";//常量,代表编码格式。
    private EditText et_size;
    private PackageManager packageManager;
    private PackageInfo packageInfo;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initView();
        init();
        createCache();
    }

    public void createCache() {
        InputStream in = getResources().openRawResource(R.mipmap.pic_1);
        BufferedInputStream bis = new BufferedInputStream(in);
        try {
            FileOutputStream fos = openFileOutput("pic_1.png", MODE_PRIVATE);
            byte[] buffer=new byte[1024];
            int len = -1;
            while ((len=bis.read(buffer))!=-1){
                fos.write(buffer,0,len);
            }
            fos.close();
            bis.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void init() {
        packageManager = getPackageManager();
    }

    private void initView() {
        et_size = (EditText) findViewById(R.id.et_size);
    }

    public void clear(View view){

//        Toast.makeText(MainActivity.this,"点击了clear按钮",0).show();
//        try {
//            Method[] methods = PackageManager.class.getMethods();
//            for(Method m:methods){
//                if("deleteApplicationCacheFiles".equals(m.getName())){
//                    m.invoke(packageManager,packageInfo.packageName,new ClearCacheObserver());
//                }
//                if("deleteApplicationCacheFiles".equals(m.getName())){
//                    m.invoke(packageManager,packageInfo.packageName,new ClearCacheObserver());
//                }
//            }
////            method = PackageManager.class.getDeclaredMethod("clearApplicationUserData",String.class,IPackageDataObserver.class);
////            method.invoke(packageManager,packageInfo.packageName,new ClearCacheObserver());
////            method = PackageManager.class.getDeclaredMethod("deleteApplicationCacheFiles",String.class,IPackageDataObserver.class);
////            method.invoke(packageManager,packageInfo.packageName,new ClearCacheObserver());
//        } catch (InvocationTargetException e) {
//            e.printStackTrace();
//        } catch (IllegalAccessException e) {
//            e.printStackTrace();
//        }

        Intent intent = new Intent();
        intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
        intent.addCategory(Intent.CATEGORY_DEFAULT);
        // dat=package:com.itheima.mobileguard
        intent.setData(Uri.parse("package:" + packageInfo.packageName));
        startActivity(intent);

    }

    @Override
    protected void onResume() {
        super.onResume();
        showCacheSize();
    }

    private void showCacheSize(){

        if(packageManager!=null){
            try {
                packageInfo = packageManager.getPackageInfo("zy.just.com.clearcachedemo", 0);
                getCacheSize(packageInfo);
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }

        }
    }

    /**
     * 获取某个包名对应的应用程序的缓存大小
     * @param packageInfo  应用程序的包信息
     *
     * IPackageStatsObserver.class编译器报找不到的问题,只需要rebuild一下就行了。
     */
    private void getCacheSize(PackageInfo packageInfo) {

        try {
            //通过反射获取到当前的方法。
            Method method = PackageManager.class.getDeclaredMethod("getPackageSizeInfo",String.class,IPackageStatsObserver.class);
            /**
             * 第一个参数:调用该方法的对象
             * 第二个参数:应用包名
             * 第三个参数:IPackageStatsObserver类型的aidl对象。
             */
            method.invoke(packageManager,packageInfo.packageName,new MyPackObserver(packageInfo));
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        } catch (InvocationTargetException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
    }


    private class MyPackObserver extends android.content.pm.IPackageStatsObserver.Stub{

        private PackageInfo info;

        public MyPackObserver(PackageInfo info){
            this.info = info;
        }

        @Override
        public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException {
            long cacheSize = pStats.cacheSize;
            et_size.setText(Formatter.formatFileSize(getApplicationContext(), cacheSize));
        }
    }

//    class ClearCacheObserver extends IPackageDataObserver.Stub {
//        public void onRemoveCompleted(final String packageName, final boolean succeeded) {
//            getCacheSize(packageInfo);
//        }
//    }
}


猜你喜欢

转载自blog.csdn.net/zhangying1994/article/details/51090752