前言

  在Android设备中,我们经常会看到与系统或者应用相关的清除功能有:清除数据、清除缓存、一键清理,这么多清除功能对于一个程序猿就够难理解了,偏偏很多安卓设备上都有这些功能,对于用户来说就更难理解,趁着在把玩手机的时候想到了这一点,索引追根究底了解他们的具体区别。

清除数据、清除缓存、一键清理的区别

清除数据

  清除数据主要是清除用户配置,比如SharedPreferences、数据库等等,这些数据都是在程序运行过程中保存的用户配置信息,清除数据后,下次进入程序就和第一次进入程序时一样;

清除缓存

  缓存是程序运行时的临时存储空间,它可以存放从网络下载的临时图片,从用户的角度出发清除缓存对用户并没有太大的影响,但是清除缓存后用户再次使用该APP时,由于本地缓存已经被清理,所有的数据需要重新从网络上获取,注意:为了在清除缓存的时候能够正常清除与应用相关的缓存,请将缓存文件存放在getCacheDir()或者 getExternalCacheDir()路径下。比如对微信清除缓存,则聊天记录、朋友圈缓存的用户头像、图片、文字等信息都会被清除掉,清除缓存后再次进入微信时你会发现消息记录被清空了,朋友圈的图片和用户头像需要加载一会才能正常显示。

一键清理

  一键清理是系统级别的功能,它主要是杀后台进程,以达到释放内存的目的,但杀掉哪些进程和清理时设置的重要值阈值有关,重要值越大说明进程重要程度越低,如果在清理时某个进程的重要值大于该阈值,该进程就会被杀掉。比如微信等应用在后台,一件清理后会将微信和与之相关的服务都杀掉(有的服务做了特殊处理,杀不死!!!)。

参考资料

  • What’s the difference between clear cache & clear data in android settings

  • Android中系统设置中的清除数据究竟会清除哪些数据

  • Android 一键清理、内存清理功能实现

  • How to delete files created by the application on uninstall?

说明

  为了让程序被卸载后不在文件系统中留下毫无关联的无用文件,建议将应用相关的配置和缓存文件存放在程序被卸载时会删掉的文件夹下面(音乐文件、视频文件、图片、电子书这种适合多个应用阅读和浏览的文件除外),具体路径有:

  • /data/data/package/

  • getFilesDir()

  • getCacheDir()

  • getExternalCacheDir()(是否能够在程序被卸载时被删除与API的等级有关)

  • getExternalFilesDir()(是否能够在程序被卸载时被删除与API的等级有关)

--------------------------------------------------

Android 一键清理、内存清理功能实现:

360桌面、金山清理大师等都提供了一键清理、一键加速等功能,其实就是杀一些后台进程来达到释放内存的目的。

基本思路就是列出所有运行的进程,查看其重要值(RunningAppProcessInfo.importance,值越大说明进程重要程度越低),可以设定一个阈值,

如果该进程的重要值大于该阈值,就可以杀掉该进程。

进程的重要值有以下几个等级:

[java] view plain copy

  1. /**
  2. * Constant for {@link #importance}: this is a persistent process.
  3. * Only used when reporting to process observers.
  4. * @hide
  5. */
  6. public static final int IMPORTANCE_PERSISTENT = 50;
  7. /**
  8. * Constant for {@link #importance}: this process is running the
  9. * foreground UI.
  10. */
  11. public static final int IMPORTANCE_FOREGROUND = 100;
  12. /**
  13. * Constant for {@link #importance}: this process is running something
  14. * that is actively visible to the user, though not in the immediate
  15. * foreground.
  16. */
  17. public static final int IMPORTANCE_VISIBLE = 200;
  18. /**
  19. * Constant for {@link #importance}: this process is running something
  20. * that is considered to be actively perceptible to the user.  An
  21. * example would be an application performing background music playback.
  22. */
  23. public static final int IMPORTANCE_PERCEPTIBLE = 130;
  24. /**
  25. * Constant for {@link #importance}: this process is running an
  26. * application that can not save its state, and thus can't be killed
  27. * while in the background.
  28. * @hide
  29. */
  30. public static final int IMPORTANCE_CANT_SAVE_STATE = 170;
  31. /**
  32. * Constant for {@link #importance}: this process is contains services
  33. * that should remain running.
  34. */
  35. public static final int IMPORTANCE_SERVICE = 300;
  36. /**
  37. * Constant for {@link #importance}: this process process contains
  38. * background code that is expendable.
  39. */
  40. public static final int IMPORTANCE_BACKGROUND = 400;
  41. /**
  42. * Constant for {@link #importance}: this process is empty of any
  43. * actively running code.
  44. */
  45. public static final int IMPORTANCE_EMPTY = 500;

直接上代码:

[java] view plain copy

  1. package com.android.clearmemory;
  2. import android.app.Activity;
  3. import android.app.ActivityManager;
  4. import android.app.ActivityManager.MemoryInfo;
  5. import android.app.ActivityManager.RunningAppProcessInfo;
  6. import android.content.Context;
  7. import android.os.Bundle;
  8. import android.util.Log;
  9. import android.view.View;
  10. import android.widget.Button;
  11. import android.widget.Toast;
  12. import java.util.List;
  13. public class ClearMemoryActivity extends Activity {
  14. private static final String TAG = "ClearMemoryActivity";
  15. /**
  16. * Called when the activity is first created.
  17. */
  18. @Override
  19. public void onCreate(Bundle savedInstanceState) {
  20. super.onCreate(savedInstanceState);
  21. setContentView(R.layout.main);
  22. Button clear = (Button) findViewById(R.id.clear);
  23. clear.setOnClickListener(new View.OnClickListener() {
  24. @Override
  25. public void onClick(View v) {
  26. //To change body of implemented methods use File | Settings | File Templates.
  27. ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
  28. List<RunningAppProcessInfo> infoList = am.getRunningAppProcesses();
  29. List<ActivityManager.RunningServiceInfo> serviceInfos = am.getRunningServices(100);
  30. long beforeMem = getAvailMemory(ClearMemoryActivity.this);
  31. Log.d(TAG, "-----------before memory info : " + beforeMem);
  32. int count = 0;
  33. if (infoList != null) {
  34. for (int i = 0; i < infoList.size(); ++i) {
  35. RunningAppProcessInfo appProcessInfo = infoList.get(i);
  36. Log.d(TAG, "process name : " + appProcessInfo.processName);
  37. //importance 该进程的重要程度  分为几个级别,数值越低就越重要。
  38. Log.d(TAG, "importance : " + appProcessInfo.importance);
  39. // 一般数值大于RunningAppProcessInfo.IMPORTANCE_SERVICE的进程都长时间没用或者空进程了
  40. // 一般数值大于RunningAppProcessInfo.IMPORTANCE_VISIBLE的进程都是非可见进程,也就是在后台运行着
  41. if (appProcessInfo.importance > RunningAppProcessInfo.IMPORTANCE_VISIBLE) {
  42. String[] pkgList = appProcessInfo.pkgList;
  43. for (int j = 0; j < pkgList.length; ++j) {//pkgList 得到该进程下运行的包名
  44. Log.d(TAG, "It will be killed, package name : " + pkgList[j]);
  45. am.killBackgroundProcesses(pkgList[j]);
  46. count++;
  47. }
  48. }
  49. }
  50. }
  51. long afterMem = getAvailMemory(ClearMemoryActivity.this);
  52. Log.d(TAG, "----------- after memory info : " + afterMem);
  53. Toast.makeText(ClearMemoryActivity.this, "clear " + count + " process, "
  54. + (afterMem - beforeMem) + "M", Toast.LENGTH_LONG).show();
  55. }
  56. });
  57. ClearMemoryFloatView.instance(getApplicationContext()).createView();
  58. }
  59. //获取可用内存大小
  60. private long getAvailMemory(Context context) {
  61. // 获取android当前可用内存大小
  62. ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
  63. MemoryInfo mi = new MemoryInfo();
  64. am.getMemoryInfo(mi);
  65. //mi.availMem; 当前系统的可用内存
  66. //return Formatter.formatFileSize(context, mi.availMem);// 将获取的内存大小规格化
  67. Log.d(TAG, "可用内存---->>>" + mi.availMem / (1024 * 1024));
  68. return mi.availMem / (1024 * 1024);
  69. }
  70. }

注意:

我这里选择阈值是IMPORTANCE_VISIBLE级别的,也就是非可见的后台进程和服务会被杀掉(一些系统进程肯定除外)。

清理的效果跟金山清理大师和360桌面的一键清理效果差不多。

如果不想杀的太凶,可以选择IMPORTANCE_SERVICE级别,杀掉那些长时间没用或者空进程了,

这个级别的清理力度不够大,达不到金山清理大师的效果。

android 一键清除 清理相关推荐

  1. android+内存清理+代码,最新版本:Android一键式清理,内存清理功能的实现

    Android一键式清理,内存清理功能的实山清理大师等均提供一键式清理和一键加速等功能.实际上,它们杀死了一些后台进程以达到释放内存的目的. 基本思想是列出所有正在运行的进程,检查它们的重要值(Run ...

  2. android 清除所有缓存,Android一键清除所有应用的缓存

    最近有一个需求,需要在最近任务页面的一键清除任务按钮中添加一键清除页面缓存的功能,网上找了一圈,看不到什么便捷的版本,基本上是遍历xxx/cache然后删除,其实是没有这个必要的. 模仿:想一想,哪里 ...

  3. Android 一键清除其他app的数据

    如何在自己的app里面,一键清除其他应用的数据??? 看了很多网上的教程,80%都说需要将自己的app打包为系统应用,我想说这也太麻烦了吧,那几个aidl文件就得折腾好久,再别说拿到对应手机系统的签名 ...

  4. Android 一键清除其他app的数据(快捷方便)

    如何在自己的app里面,一键清除其他应用的数据??? 看了很多网上的教程,80%都说需要将自己的app打包为系统应用,我想说这也太麻烦了吧,那几个aidl文件就得折腾好久,再别说拿到对应手机系统的签名 ...

  5. 织梦cms一键清除清理回收站文章

    dedecms sql语句清理如何操作?首先进入:网站后台-->系统---->SQL命令行工具-->运行SQL命令行:多行命令 输入以下命令执行即可:如果您的网站改了表前缀,请将代码 ...

  6. android+清除循环动画,android自定义View之(4)-一键清除动画

    android自定义View之(四)------一键清除动画 1.前言: 自己也是参考别人的一些自定义view例子,学习了一些基本的自定义view的方法.今天,我参考了一些资料,再结合自已的一些理解, ...

  7. android自定义View之(四)------一键清除动画

    1.前言: 自己也是参考别人的一些自定义view例子,学习了一些基本的自定义view的方法.今天,我参考了一些资料,再结合自已的一些理解,做了一个一键清除的动画.当年,我实现这个是用了几张图片,采用F ...

  8. bat计算机清理原理,科技教程:电脑如何一键清除垃圾bat

    如今越来越多的小伙伴对于电脑如何一键清除垃圾bat这方面的问题开始感兴趣,看似平静的每一天,在每个人身上都在发生着各种各样的故事,因为大家现在都是想要了解到此类的信息,那么既然现在大家都想要知道电脑如 ...

  9. android清除缓存 代码,Android应用开发之Android应用清除缓存一般清理目录和代码的教程...

    本文将带你了解Android应用开发Android应用清除缓存一般清理目录和代码的教程,希望本文对大家学Android有所帮助. 一个应用安装完成,会有缓存,缓存一般分为内部存储的和外置的,内存中路径 ...

最新文章

  1. 【Kafka】Kafka-数据倾斜问题-参考资料-解决方案
  2. win7删除控制面板中的JAVA”
  3. 大数据视觉智能实践及医学影像智能诊断探索(讲座精华笔记)
  4. PHP zendframework phpunit 深入
  5. S3C2440中断解析和基于WINCE操作系统的中断分析(整理于网络,用于按键中断使用)
  6. java 自动启动监听_Spring Boot 启动事件和监听器,太强大了!
  7. 外网访问FTP服务,解决只能以POST模式访问Filezilla的问题
  8. MediaPlayer控件的初探
  9. 关于SSMS显示select出来的数据行的疑问
  10. ARM指令集之跳转指令
  11. ns3学习之旅 ---NS3 开篇简介
  12. 图片上打印汉字(C++、OPENCV+字库)
  13. “被授权”泛滥 个人信息保护怎么管?
  14. 雷石服务器可以接入电视信号吗,雷石机顶盒使用方法
  15. 音乐指纹识别(一):音乐波形
  16. 裸机服务器装系统步骤,组装裸机如何装系统?
  17. 【收藏】通信知识分类整理
  18. 5分钟使用Echarts轻松实现地图下钻
  19. 人生有如负重致远,不可急躁
  20. C语言:选列主元约当消元法求线性方程组唯一解

热门文章

  1. 计算机网络系列--运输层
  2. 删掉svn文件的批处理文件
  3. docker部署2套jumpserver并且mysql互为主从
  4. Time Management 时间管理
  5. 深入理解Linux多线程
  6. 程序员-开发工作流程英文术语
  7. springboot教学系统毕业设计-附源码191733
  8. Ajax面试题 | 前端
  9. 用python写一个16进制转换文本字符串
  10. 小学计算机第二课堂内容,小学科学第二课堂活动记录