浅谈:Android应用清理内存

最近这段时间一直在研究作手机应用开发的时候赶上android内存清理的问题,看不少的资料,也尝试了不少方法,不过都没有用,后来不断的摸索终于整出来,如下特地总结了一下内存清理的方法,能够将那些无用的进程给shut down掉,上代码~android

 

1  protected void onClearMemory(Context context) {api

2    ActivityManager activityManger = (ActivityManager) context缓存

3            .getSystemService(Context.ACTIVITY_SERVICE);工具

4    List<ActivityManager.RunningAppProcessInfo> list = activityManger测试

5            .getRunningAppProcesses();ui

6    if (list != null)this

7        for (int i = 0; i < list.size(); i++) {spa

8            ActivityManager.RunningAppProcessInfo apinfo = list.get(i)rest

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-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />

 

另外推荐一款小编常常用的APP在线测试工具:www.ineice.com

相关文章
相关标签/搜索