37.缓存清理

CleanCacheActivity

  • 反射调用系统隐藏的方法
  • 不能自己清理缓冲,需要系统界面去删除,但是系统有个漏洞,当告诉系统清除的数据大于系统的内存的时候,系统会全部清理
  1. publicclassCleanCacheActivityextendsActivity{
  2. protectedstaticfinalint SCANING =1;
  3. publicstaticfinalint SHOW_CACHE_INFO =2;
  4. protectedstaticfinalint SCAN_FINISH =3;
  5. privateProgressBar progressBar1;
  6. privateLinearLayout ll_container;
  7. privateTextView tv_status;
  8. privatePackageManager pm;
  9. privateHandler handler =newHandler(){
  10. publicvoid handleMessage(android.os.Message msg){
  11. switch(msg.what){
  12. case SCANING:
  13. String text =(String) msg.obj;
  14. tv_status.setText("正在扫描:"+text);
  15. break;
  16. case SHOW_CACHE_INFO:
  17. View view =View.inflate(getApplicationContext(), R.layout.list_appcache_item,null);
  18. ImageView iv =(ImageView) view.findViewById(R.id.iv_icon);
  19. TextView tv_name =(TextView) view.findViewById(R.id.tv_name);
  20. TextView tv_cache =(TextView) view.findViewById(R.id.tv_cache);
  21. finalCacheInfo info =(CacheInfo) msg.obj;
  22. iv.setImageDrawable(info.icon);
  23. tv_name.setText(info.name);
  24. tv_cache.setText("缓存大小:"+Formatter.formatFileSize(getApplicationContext(), info.size));
  25. ImageView iv_delete =(ImageView) view.findViewById(R.id.iv_delete);
  26. iv_delete.setOnClickListener(newOnClickListener(){
  27. @Override
  28. publicvoid onClick(View v){
  29. Method[] methods =PackageManager.class.getMethods();
  30. for(Method method : methods){
  31. try{
  32. if("deleteApplicationCacheFiles".equals(method.getName())){
  33. method.invoke(pm, info.packname,newIPackageDataObserver.Stub(){
  34. @Override
  35. publicvoid onRemoveCompleted(String packageName,boolean succeeded)
  36. throwsRemoteException{
  37. }
  38. });
  39. }
  40. }catch(Exception e){
  41. Intent intent =newIntent();
  42. intent.setAction("android.settings.APPLICATION_DETAILS_SETTINGS");
  43. intent.addCategory(Intent.CATEGORY_DEFAULT);
  44. intent.setData(Uri.parse("package:"+info.packname));
  45. startActivity(intent);
  46. e.printStackTrace();
  47. }
  48. }
  49. }
  50. });
  51. ll_container.addView(view,0);
  52. break;
  53. case SCAN_FINISH:
  54. tv_status.setText("扫描完毕");
  55. break;
  56. }
  57. };
  58. };
  59. @Override
  60. protectedvoid onCreate(Bundle savedInstanceState){
  61. super.onCreate(savedInstanceState);
  62. setContentView(R.layout.activity_clean_cache);
  63. progressBar1 =(ProgressBar) findViewById(R.id.progressBar1);
  64. ll_container =(LinearLayout) findViewById(R.id.ll_container);
  65. tv_status =(TextView) findViewById(R.id.tv_status);
  66. newThread(){
  67. publicvoid run(){
  68. pm = getPackageManager();
  69. List<PackageInfo> packageInfos = pm
  70. .getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
  71. progressBar1.setMax(packageInfos.size());
  72. int total =0;
  73. for(PackageInfo packinfo: packageInfos){
  74. try{
  75. String packname = packinfo.packageName;
  76. Method method =PackageManager.class.getMethod("getPackageSizeInfo",String.class,IPackageStatsObserver.class);
  77. //第一个参数:哪个用这个方法,第二个参数:是可变参数,方法里的参数,第三个参数:接口AIDL,需要拷到自己项目里,包名必须和以前一样,然后会在gen目录自动生成文件去调用
  78. method.invoke(pm, packname,newMyObserver());
  79. Message msg =Message.obtain();
  80. msg.what= SCANING;
  81. msg.obj = packinfo.applicationInfo.loadLabel(pm).toString();
  82. handler.sendMessage(msg);
  83. }catch(Exception e){
  84. e.printStackTrace();
  85. }
  86. total ++;
  87. progressBar1.setProgress(total);
  88. try{
  89. Thread.sleep(50);
  90. }catch(InterruptedException e){
  91. e.printStackTrace();
  92. }
  93. }
  94. Message msg =Message.obtain();
  95. msg.what = SCAN_FINISH;
  96. handler.sendMessage(msg);
  97. };
  98. }.start();
  99. }
  100. privateclassMyObserverextendsIPackageStatsObserver.Stub{
  101. //这个是AIDL接口
  102. @Override
  103. publicvoid onGetStatsCompleted(PackageStats pStats,boolean succeeded)
  104. throwsRemoteException{
  105. long cache = pStats.cacheSize;
  106. long codeSize = pStats.codeSize;
  107. if(cache>0){
  108. //System.out.println("当前应用程序:"+pStats.packageName+"有缓存:"+Formatter.formatFileSize(getApplicationContext(), cache));
  109. try{
  110. Message msg =Message.obtain();
  111. msg.what = SHOW_CACHE_INFO;
  112. CacheInfo cacheInfo =newCacheInfo();
  113. cacheInfo.packname = pStats.packageName;
  114. cacheInfo.icon = pm.getApplicationInfo(pStats.packageName,0).loadIcon(pm);
  115. cacheInfo.name = pm.getApplicationInfo(pStats.packageName,0).loadLabel(pm).toString();
  116. cacheInfo.size = cache;
  117. msg.obj = cacheInfo;
  118. handler.sendMessage(msg);
  119. }catch(Exception e){
  120. e.printStackTrace();
  121. }
  122. }
  123. }
  124. }
  125. classCacheInfo{
  126. Drawable icon;
  127. String name;
  128. long size;
  129. String packname;
  130. }
  131. publicvoid cleanAll(View view){
  132. // /freeStorageAndNotify
  133. Method[] methods =PackageManager.class.getMethods();
  134. for(Method method:methods){
  135. if("freeStorageAndNotify".equals(method.getName())){
  136. try{
  137. method.invoke(pm,Integer.MAX_VALUE,newIPackageDataObserver.Stub(){
  138. @Override
  139. publicvoid onRemoveCompleted(String packageName,
  140. boolean succeeded)throwsRemoteException{
  141. System.out.println(succeeded);
  142. }
  143. });
  144. }catch(Exception e){
  145. e.printStackTrace();
  146. }
  147. return;
  148. }
  149. }
  150. }
  151. }

来自为知笔记(Wiz)

附件列表

时间: 2024-10-13 12:27:57

37.缓存清理的相关文章

手机卫士11_ 自定义控件_缓存清理_病毒库更新

拷贝安卓源码中的逻辑,可以考虑先创建一个小项目实现以下效果 1,病毒数据库的自动更新(连接网络,然后获取特征码保存到数据库?) ①工程师发现病毒apk,获取到它的特征码发布到服务器上 通过 MD5 或者ASH1获取特征码 ②客户端杀毒软件下载特征码(可能是 JSON串)到本地客户端 (在打开软件的时候还是打开查杀界面的时候?其实都不适合,应该开启一个服务去定期更新数据库,访问病毒更新特征码地址) 定期更新,timer和timertask,一般一个小时更新一次(测试的时候写短一点) 连接服务器:U

PHP7 opcache缓存清理问题

PHP7 opcache缓存清理问题 背景 OPcache通过opcode的缓存和优化,提供更快的PHP执行过程.业务在php7环境运营时,为了提升请求的性能,在PHP7环境中配置OPcache扩展.业务在更新代码后,访问业务系统时提示无法找到对应的文件或请求的内容还是更新前的旧内容,webserver重启以后,请求访问到的文件就都是最新的了,问题就貌似解决了. 问题分析 根据现象分析,代码更新后请求找不到新增的文件,尤其是还在请求已有文件更新前的内容,那么可能跟缓存有关系,考虑到跟业务代码逻辑

手机安全卫士——缓存清理

CleanCacheActivity.java /** * 缓存清理*/ public class CleanCacheActivity extends Activity { private PackageManager packageManager; private List<CacheInfo> cacheLists; private ListView list_view; @Override protected void onCreate(Bundle savedInstanceStat

Android Glide数据更新及内存缓存、硬盘缓存清理

[转] 原文                                         Android Glide数据更新及内存缓存.硬盘缓存清理 Android的Glide在加载图片时候内部默认使用了缓存机制,Glide的缓存机制分为两级,第一级是内存缓存,然后第二级是硬盘缓存.缓存的过程首先是在内存中缓存,然后将加载的图片资源缓存到硬盘,这样就可以在随后的再次加载中使用缓存了,Glide使用缓存时候首先要检查内存这一层级是否缓存了相应的缓存,如果有,则直接使用,如果没有,则深入到硬盘缓

Hibernate中的脏检查和缓存清理机制

脏检查 Session到底是如何进行脏检查的呢?当一个Customer对象被加入到Session缓存中时,Session会为Customer对象的值类型的属性复制一份快照.当Session清理缓存时,会先进行脏检查,即比较Customer对象的当前属性与它的快照,来判断Customer对象的属性是否发生了变化,如果发生了变化,就称这个对象是“脏对象”,Session会根据脏对象的最新属性来执行相关的SQL语句,从而同步更新数据库. 脏数据检查: 什么是脏数据?脏数据并不是废弃和无用的数据,而是状

脏检查 和 缓存清理机制

Session到底是如何进行脏检查的呢?当一个Customer对象被加入到Session缓存中时,Session会为Customer对象的值类型的属性复制一份快照.当Session清理缓存时,会先进行脏检查,即比较Customer对象的当前属性与它的快照,来判断Customer对象的属性是否发生了变化,如果发生了变化,就称这个对象是“脏对象”,Session会根据脏对象的最新属性来执行相关的SQL语句,从而同步更新数据库. 缓存清理机制 当Session缓存中对象的属性每次发生了变化,Sessi

Hibernate——脏检查和缓存清理机制

脏检查 Session到底是如何进行脏检查的呢?当一个Customer对象被加入到Session缓存中时,Session会为Customer对象的值类型的属性复制一份快照.当Session清理缓存时,会先进行脏检查,即比较Customer对象的当前属性与它的快照,来判断Customer对象的属性是否发生了变化,如果发生了变化,就称这个对象是“脏对象”,Session会根据脏对象的最新属性来执行相关的SQL语句,从而同步更新数据库. 缓存清理机制 当Session缓存中对象的属性每次发生了变化,S

关于IE缓存清理——尤其对Web前台开发人员

当我们开发过程中修改了JS等文件之后,发现IE使用的还是原先的文件.这是因为一般情况下,IE会将JS.CSS文件.图片文件进行缓存,下次读取的时候首先从缓存读取,如果没有才获取新的文件.因此,在开发过程中如果这些文件修改过,应该及时清理IE缓存,否则效果无法呈现. 一般清理IE缓存的方法:(我目前是英文版Win7,IE10,中文版类似) IE-->Tools-->Internet Options-->点击Delete按钮. 在弹出的界面中按Delete按钮 上述方法想必大家都知道. 重点

缓存清理

// 显示缓存大小 //NSDocumentDirectory  Document目录中的数据 //NSCachesDirectory     缓存中的数据 - ( float )filePath { //NSDocumentDirectory Document目录中的数据 //NSCachesDirectory 缓存中的数据 NSString * cachPath = [ NSSearchPathForDirectoriesInDomains ( NSCachesDirectory , NSU