关于APP清理缓存

找了很久只找到一直不用ROOT,但清理所有APP的缓存的方法。以下记录:

  /**
     * 清理全部应用程序缓存的点击事件
     *
     * @param view
     */
    public void cleanAll(View view) {
        try {
            PackageManager packageManager = main.this.getPackageManager();
            Method localMethod = packageManager.getClass().getMethod("freeStorageAndNotify", Long.TYPE,
                    IPackageDataObserver.class);
            Long localLong = Long.valueOf(getEnvironmentSize() - 1L);
            Object[] arrayOfObject = new Object[2];
            arrayOfObject[0] = localLong;
            localMethod.invoke(packageManager, localLong, new IPackageDataObserver.Stub() {

                @Override
                public void onRemoveCompleted(String packageName, boolean succeeded) throws RemoteException {
                    Toast.makeText(getApplicationContext(), "清除状态: " + succeeded, Toast.LENGTH_SHORT).show();
                    Log.i("TAG","清除状态: " + succeeded);
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    
    private static long getEnvironmentSize()
    {
        File localFile = Environment.getDataDirectory();
        long l1;
        if (localFile == null)
            l1 = 0L;
        while (true)
        {

            String str = localFile.getPath();
            StatFs localStatFs = new StatFs(str);
            long l2 = localStatFs.getBlockSize();
            l1 = localStatFs.getBlockCount() * l2;
            return l1;
        }
    }

下面还有获取APP缓存信息的方法:

	/**
	 * 获取Android Native App的缓存大小、数据大小、应用程序大小
	 *
	 * @param context
	 *            Context对象
	 * @param pkgName
	 *            需要检测的Native App包名
	 * @throws NoSuchMethodException
	 * @throws InvocationTargetException
	 * @throws IllegalAccessException
	 */
	public static void getPkgSize(final Context context, String pkgName) throws NoSuchMethodException,
	        InvocationTargetException,
	        IllegalAccessException {
	    // getPackageSizeInfo是PackageManager中的一个private方法,所以需要通过反射的机制来调用
	    Method method = PackageManager.class.getMethod("getPackageSizeInfo",
	            new Class[] { String.class, IPackageStatsObserver.class });
	    // 调用 getPackageSizeInfo 方法,需要两个参数:1、需要检测的应用包名;2、回调
	    method.invoke(context.getPackageManager(), new Object[] {
	            pkgName,
	            new IPackageStatsObserver.Stub() {
	                @SuppressLint("NewApi")
					@Override
	                public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException {
	                    // 子线程中默认无法处理消息循环,自然也就不能显示Toast,所以需要手动Looper一下
	                    Looper.prepare();
	                    // 从pStats中提取各个所需数据
	                    Toast.makeText(context,
	                            "缓存大小=" + Formatter.formatFileSize(context, pStats.cacheSize) +
	                            "\n数据大小=" + Formatter.formatFileSize(context, pStats.dataSize) +
	                            "\n程序大小=" + Formatter.formatFileSize(context, pStats.codeSize),
	                            Toast.LENGTH_LONG).show();
	                    Log.i("TAG", 
	                            "内部缓存大小=" + Formatter.formatFileSize(context, pStats.cacheSize) +
	                            "\n数据大小=" + Formatter.formatFileSize(context, pStats.dataSize) +
	                            "\n程序大小=" + Formatter.formatFileSize(context, pStats.codeSize)+
	                            "\n外部缓冲数据大小=" + Formatter.formatFileSize(context, pStats.externalCacheSize )+
	                            "缓存大小=" + Formatter.formatFileSize(context, pStats.cacheSize + pStats.externalCacheSize));
	                    // 遍历一次消息队列,弹出Toast
	                    Looper.loop();
	                }
	            }
	    });
	}

当然他们需要3个 AIDL文件的支持。还有2个权限:

<code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: "Source Code Pro", monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;"><!-- 清除缓存时需要此权限 --></span>
    <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">uses-permission</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">android:name</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"android.permission.CLEAR_APP_CACHE"</span> /></span>
    <span class="hljs-tag" style="color: rgb(0, 102, 102); box-sizing: border-box;"><<span class="hljs-title" style="box-sizing: border-box; color: rgb(0, 0, 136);">uses-permission</span> <span class="hljs-attribute" style="box-sizing: border-box; color: rgb(102, 0, 102);">android:name</span>=<span class="hljs-value" style="box-sizing: border-box; color: rgb(0, 136, 0);">"android.permission.GET_PACKAGE_SIZE"</span>/></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li></li></ul>

在这里就只贴出主要的代码片段。具体看DEMO:DEMO地址



接下来记录下需要root的清缓存方法:

String[] commands = new String[] {"cd sdcard", "ls", "rm -r /data/data/com.UCMobile/downTheme"}; 
首先cd sdcard进度sd卡=-=,然后ls列出项目,最后rm -r删除文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值