51Testing软件测试论坛

 找回密码
 (注-册)加入51Testing

QQ登录

只需一步,快速开始

微信登录,快人一步

手机号码,快捷登录

查看: 1387|回复: 0
打印 上一主题 下一主题

浅谈:Android应用清理内存

[复制链接]
  • TA的每日心情

    2015-9-6 09:43
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]测试小兵

    跳转到指定楼层
    1#
    发表于 2015-9-23 09:27:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    最近这段时间一直在研究做手机应用开发的时候遇上android内存清理的问题,看很多的资料,也尝试了很多方法,不过都没有用,后来不断的摸索终于整出来,以下特意总结了一下内存清理的方法,可以将那些无用的进程给shut down掉,上代码~
    1  protected voidonClearMemory(Context context) {
    2    ActivityManageractivityManger = (ActivityManager) context
    3            .getSystemService(Context.ACTIVITY_SERVICE);
    4   List<ActivityManager.RunningAppProcessInfo> list = activityManger
    5           .getRunningAppProcesses();
    6    if (list != null)
    7        for (int i = 0;i < list.size(); i++) {
    8            ActivityManager.RunningAppProcessInfoapinfo = list.get(i)
    9
    10            String[]pkgList = apinfo.pkgList;
    11
    12            if(apinfo.importance >=
    13 ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
    14
    15                for(int j = 0; j < pkgList.length; j++) {
    16
    17                    if(pkgList[j].equals(context.getPackageName())) {
    18                      continue;
    19                    }
    20
    21                    if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO) {
    22                        activityManger.restartPackage(pkgList[j]);
    23                    }else {
    24                       activityManger.killBackgroundProcesses(pkgList[j]);
    25                    }
    26                }
    27            }
    28        }
    29
    30    new AlertDialog.Builder(SettingActivity.this)
    31    .setTitle("请注意")
    32    .setMessage("内存清理完毕")
    33   .setPositiveButton("确定", null)
    34    .show();
    35
    36  }
    getRunningAppProcesses():得到那些正在运行的进程;
    RunningAppProcessInfo:得到正在进行的进程信息;
    Importance:在android中分为几个级别
    1、IMPORTANCE_FOREGROUND前台进程
    所谓前台进程就是指用户完成当前工作而需要的进程。判断条件如下(满足其一即可):
    -进程中的某个Activity正在与用户进行交互(Activity的onResume()方法被调用)
    -绑定到与当前用户正在交互的activity的Service所在的进程
    -进程中的某个Service正运行在前台,即这个service的startForeground()方法被调用
    -进程中的某个Service正在执行生命周期回调方法(比如,onCreate(),onStart(),或者onDeatroy())
    -进程中的BroadcastReceiver正在执行onReceive()方法。
    一般来说的话,在某特定时刻,也仅会有为数不多的几个前台进程。这些前台进程的重要性最高,当系统内存低到很低,以致不能继续运行这些所有的进程的话,系统将会杀死这些进程。这种情况下,一般是指系统已经到了一个极限边缘了,所以为了让UI继续有反应的话,系统不得不杀死一些前台进程;
    2、IMPORTANCE_VISIBLE 可视进程
    可视进程是指没有前台运行的组件,但仍然会对用户在屏幕看到的内容造成影响的进程。满足下面条件的进程都可以算作可视进程:
    -进程运行的Activity不在前台,但仍然是可见的(调用了onPause()方法)。这种情况可能是这样的,正在前台运行的Activity启动了一个对话框,这个对话框悬浮在这个activity之上,但仍有部分可见。
    -进程中的Service绑定到了一个可视(或前台)的activity(该activity已调用了onPause()方法)。
    可视进程也是有着极高重要性的进程,只有在系统为了保持前台进程运行而不得不杀死可视进程的时候,才会杀死可视进程;
    3、IMPORTANCE_SERVICE 服务进程
    所谓的服务进程,就是指除了上面两种进程外,如果一个进程已经通过startService()方法启动了一个service的进程。虽然这种service进程跟用户的看到的内容不相关,但它们所做的工作也是用户关心的(比如在后台播放音乐或者正在下载互联网上的资源),系统会一直保持服务进程,除非系统为了前台进程和可视进程的运行,而不得不杀死服务进程;
    4、IMPORTANCE_BACKGROUND 后台进程
    后台进程是指进程中的activity当前对用户来说不可见(这个activity调用了onStop()方法)。后台进程不会对用户的体验造成任何影响,并且系统可以在前台进程、可视进程、服务继承需要内存资源的时候会杀死后台进程。通常会有很多后台进程运行,并且这些后台进程保存在一个最近使用列表中,这样做的好处就是保证用户最近看到的进程最后被杀死。如果一个activity已经正确的实现了生命周期方法,并且保存了当前的状态,那么系统杀死这些后台进程对用户的可视效果来说的话,没有任何影响,因为当用户返回回来的时候,这个activity已经保存了所有的可视状态;
    5、IMPORTANCE_EMPTY空进程
    一个空进程没有任何运行的程序组件。系统保持空进程存在的唯一原因就是为了缓存方面的考虑,这样做主要是为了提高组件的启动时间。系统经常会杀死这些空进程来保持整个系统资源和内核缓存之间的平衡。
    由此可见,importance数值越低级别越重要,因此我们可以根据自己的需要来判断不同的级别。
    2.2版本以下的用activityManger.restartPackage(pkgList[j]); 对应权限<uses-permission android:name="android.permission.RESTART_PACKAGES"/>
    2.2以上的用killBackgroundProcesses(包名); 对应权限<uses-permissionandroid:name="android.permission.KILL_BACKGROUND_PROCESSES" />


    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
    收藏收藏
    回复

    使用道具 举报

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    小黑屋|手机版|Archiver|51Testing软件测试网 ( 沪ICP备05003035号 关于我们

    GMT+8, 2024-11-15 12:03 , Processed in 0.067889 second(s), 23 queries .

    Powered by Discuz! X3.2

    © 2001-2024 Comsenz Inc.

    快速回复 返回顶部 返回列表