Android工具开发一(清除手机所有app缓存)
2016-03-22 01:11
666 查看
Android手机缓存的清理
步骤1.获取手机所有app缓存
2.清理缓存
3.获取所有app缓存(检查第二步是否成功)
代码
package com.pythoncat.clearcache; import android.content.pm.IPackageDataObserver; import android.content.pm.IPackageStatsObserver; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.content.pm.PackageStats; import android.os.Bundle; import android.os.Handler; import android.os.RemoteException; import android.support.v7.app.AppCompatActivity; import android.text.format.Formatter; import android.util.Log; import android.view.View; import android.widget.Button; import android.widget.TextView; import android.widget.Toast; import java.lang.reflect.Method; import java.util.List; public class MainActivity extends AppCompatActivity implements View.OnClickListener { private TextView tvShowCaches, tvAppCache; private Button btnScanCache, btnClearAll; private PackageManager pm; StringBuilder sb = new StringBuilder(); StringBuilder sbCache = new StringBuilder(); private long cacheS; Handler mHadler = new Handler(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); btnScanCache = (Button) findViewById(R.id.btn_scanCache); btnClearAll = (Button) findViewById(R.id.btn_clearAll); tvShowCaches = (TextView) findViewById(R.id.tv_showAppInfo); tvAppCache = (TextView) findViewById(R.id.tv_appCache); sbCache.append("所有缓存:\n"); tvAppCache.setText(sbCache.toString()); btnScanCache.setOnClickListener(this); btnClearAll.setOnClickListener(this); } @Override public void onClick(View v) { cacheS = 0; if (v.getId() == btnScanCache.getId()) { getCaches(); // ==========获取每个app的缓存 } else if (v.getId() == btnClearAll.getId()) { cleanAll(v); getCaches(); } } class MyPackageStateObserver extends IPackageStatsObserver.Stub { @Override public void onGetStatsCompleted(PackageStats pStats, boolean succeeded) throws RemoteException { String packageName = pStats.packageName; long cacheSize = pStats.cacheSize; long codeSize = pStats.codeSize; long dataSize = pStats.dataSize; cacheS += cacheSize; // sb.delete(0, sb.length()); if (cacheSize > 0) { sb.append("packageName = " + packageName + "\n") .append(" cacheSize: " + cacheSize + "\n") .append(" dataSize: " + dataSize + "\n") .append("-----------------------\n") ; Log.e("aaaa", sb.toString()); } } } class ClearCacheObj extends IPackageDataObserver.Stub { @Override public void onRemoveCompleted(String packageName, final boolean succeeded) throws RemoteException { mHadler.post(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(), "清楚状态: " + succeeded, Toast.LENGTH_SHORT).show(); } }); } } /** * 清理全部应用程序缓存的点击事件 * * @param view */ public void cleanAll(View view) { //freeStorageAndNotify Method[] methods = PackageManager.class.getMethods(); for (Method method : methods) { if ("freeStorageAndNotify".equals(method.getName())) { try { method.invoke(pm, Long.MAX_VALUE, new ClearCacheObj()); } catch (Exception e) { e.printStackTrace(); } return; } } } private void getCaches(){ // scan pm = getPackageManager(); List<PackageInfo> packages = pm.getInstalledPackages(0); int max = packages.size(); int current = 0; sb.delete(0, sb.length()); sb.append("所有已安装的app信息:\n"); sb.append("所有App 总和:" + max + " \n"); tvShowCaches.setText(sb.toString()); for (PackageInfo pinfo : packages) { String packageName = pinfo.packageName; try { Method getPackageSizeInfo = PackageManager.class .getDeclaredMethod("getPackageSizeInfo", String.class, IPackageStatsObserver.class); getPackageSizeInfo.invoke(pm, packageName, new MyPackageStateObserver()); current++; } catch (Exception e) { current++; e.printStackTrace(); } } //===到这里,数据准备完成 mHadler.postDelayed(new Runnable() { @Override public void run() { Toast.makeText(getApplicationContext(),"缓存信息获取完成",Toast.LENGTH_SHORT).show(); sbCache.append(Formatter.formatFileSize(getApplicationContext(),cacheS)+"\n"); tvShowCaches.setText(sb.toString()); tvAppCache.setText(sbCache.toString()); sbCache.delete(0,sbCache.length()); } }, 1000); //ok,所有应用程序信息显示完成 } }
所需权限
<!-- 清除缓存时需要此权限 --> <uses-permission android:name="android.permission.CLEAR_APP_CACHE" /> <uses-permission android:name="android.permission.GET_PACKAGE_SIZE"/>
4.所需AIDL文件
android/content/pm/IPackageDataObserver.aidl android/content/pm/IPackageStatsObserver.aidl android/content/pm/PackageStats.aidl
*1.PackageStats.aidl
/* //device/java/android/android/view/WindowManager.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; parcelable PackageStats;
* 2.IPackageDataObserver
/* ** ** 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); }
* 3.IPackageStatsObserver
/* ** ** 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); }
5.运行环境 Android 5.0
6.开发环境 Android Studio
7.运行效果,OK。
8.完整项目已上传csdn,下载地址
相关文章推荐
- Android——关于Activity跳转的返回(无返回值和有返回值)——总(Test)
- Android——关于Activity跳转的返回(无返回值和有返回值)——有返回值
- Android菜鸟App开发,第一个App(第二天)
- iOS开发中拉伸图片的几种方式
- iOS图片圆角优化
- Android之使用getIdentifier()获取资源Id
- Android自定义View
- Android BLE学习(三):编写自己的 BLE蓝牙读写工具(功能仿照nrf master control panel)
- android学习笔记——viewPager(适配器、常用函数、监听器、切换动画)
- android学习笔记——webView
- android学习笔记——Fragment
- android学习笔记——intent
- app按手机返回键,弹出Toast提示用户功能。
- Android studio ndk 环境搭建
- android官方文档关于oncreate()的参数说明
- Android 百分比布局库(percent-support-lib) 解析与扩展
- 用Tensorflow基于Deep Q Learning DQN 玩Flappy Bird
- AIDL在android系统中的作用
- android 开发之如何让toolbar 透明并且覆盖到系统状态栏上面
- 实现全局关闭所有键盘,actionSheet和alertView