安卓开发

当前位置:首页 >> 开发资料 已经有 2 人觉得本文很赞,如果本文对您有帮助,请支持我们,我们会做的更好

    Android开发清理内存实例代码

    • 来源:ByBe
    • 作者:管理员
    • 时间:2016-01-09
    • 点击:6102
    • 收藏本文

    关键字:内存,Android内存,Android内存清理

          我们用Android手机的时候经常遇到的一些问题是,应用所占内存太大,像以前我使用的360手机杀毒、QQ和微信刚出来的时候,内存占用都很小,后来360手机不断更新,不断的变大,占用内存也是不断的变大,搞的手机经常卡死,无奈之下将360卸载不再使用,仅保留微信和QQ,作为Android手机开应用开发者,我们必须要了解内存相关知识,关于手机上内存的清理,我们务必要有一套方法让我们的应用尽量最小的占用用户手机内存,以提高用户体验。


          以下特意总结了一下内存清理的方法,可以将那些无用的进程给shut down掉,我们总结了清理内存的方法,下来直接看代码实例:


    protected void onClearMemory(Context context) {
        ActivityManager activityManger = (ActivityManager) context
                .getSystemService(Context.ACTIVITY_SERVICE);
        List<ActivityManager.RunningAppProcessInfo> list = activityManger
                .getRunningAppProcesses();
        if (list != null)
            for (int i = 0; i < list.size(); i++) {
                ActivityManager.RunningAppProcessInfo apinfo = list.get(i);
                String[] pkgList = apinfo.pkgList;
                if (apinfo.importance >= ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                    for (int j = 0; j < pkgList.length; j++) {
                        if (pkgList[j].equals(context.getPackageName())) {
                            continue;
                        }
                        if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.FROYO) {
                            activityManger.restartPackage(pkgList[j]);
                        } else {
                            activityManger.killBackgroundProcesses(pkgList[j]);
                        }
                    }
                }
            }
        new AlertDialog.Builder(SettingActivity.this)
        .setTitle("请注意")
        .setMessage("内存清理完毕")
        .setPositiveButton("确定", null)
        .show();
    }


        根据上面的实例,我们来分析一下:

            getRunningAppProcesses():这个主要是得到那些正在运行的进程;

            RunningAppProcessInfo:这个主要是得到正在进行的进程信息;

            Importance:在android中分为几个级别

    1、前台进程(IMPORTANCE_FOREGROUND)  

        这个主要是指用户完成当前工作需要的进程。怎么判断呢?判断条件如下(满足其一即可):

            A-进程中的某个Activity正在与用户进行交互(Activity的onResume()方法被调用)
            B-绑定到与当前用户正在交互的activity的Service所在的进程
            C-进程中的某个Service正运行在前台,即这个service的startForeground()方法被调用
            D-进程中的某个Service正在执行生命周期回调方法,比如:onCreate(),onStart(),或者onDeatroy()
            E-进程中的BroadcastReceiver正在执行onReceive()方法。

        一般来说,在某特定时刻,前台进程也仅会有为数不多的几个。这些前台进程的重要性相当的高,当系统内存低到很低,以致不能继续运行这些所有的进程的话,系统将会杀死这些进程。这种情况下,一般是指系统已经到了一个极限边缘了,所以为了让UI继续有反应的话,系统不得不杀死一些前台进程;

    2、可视进程(IMPORTANCE_VISIBLE) 

        可视进程是指没有前台运行的组件,但仍然会对用户在屏幕看到的内容造成影响的进程。满足下面条件的进程都可以算作可视进程:

            A-进程运行的Activity不在前台,但仍然是可见的(调用了onPause()方法)。这种情况可能是这样的,正在前台运行的Activity启动了一个对话框,这个对话框悬浮在这个activity之上,但仍有部分可见。
            B-进程中的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" />










    本文为Android开发学习网原创/整理,未经允许不得转载,如需转载请联系:androidStudynet@126.com



    读后点评 感谢支持 我的建议
公告信息
    本站安卓版APP正式上线,欢迎下载
本站提供的android教程仅用于android培训,对任何法律问题及风险不承担任何责任 本站部分内容来自网络,如有侵权,请联系本站 站点地图
广告/友情链接请联系:QQ:416225054 Email:androidstudynet@126.com 安卓版:下载 QQ群:480637276