`
libo19881179
  • 浏览: 269902 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android释放内存(结束进程)

阅读更多

  这两天在搞个内存清理小插件,网上很少这方面资料,之前找过清理缓存的例子测试,结果不成功。后来自己思考该怎么清理内存,于是成功搞出来了。

这两个方法是网上拷别人的,分别用来得到可用内存和内存总数,这样我们就可用得到了已用内存数。

View Code
    private long getAvailMemory(Context context) 
    {
        // 获取android当前可用内存大小 
        ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
        MemoryInfo mi = new MemoryInfo();
        am.getMemoryInfo(mi);
        //mi.availMem; 当前系统的可用内存 

        //return Formatter.formatFileSize(context, mi.availMem);// 将获取的内存大小规格化 
        return mi.availMem/(1024*1024);
    }

    private long getTotalMemory(Context context) 
    {
        String str1 = "/proc/meminfo";// 系统内存信息文件 
        String str2;
        String[] arrayOfString;
        long initial_memory = 0;

        try 
        {
            FileReader localFileReader = new FileReader(str1);
            BufferedReader localBufferedReader = new BufferedReader(
            localFileReader, 8192);
            str2 = localBufferedReader.readLine();// 读取meminfo第一行,系统总内存大小 

            arrayOfString = str2.split("\\s+");
            for (String num : arrayOfString) {
                Log.i(str2, num + "\t");
            }

            initial_memory = Integer.valueOf(arrayOfString[1]).intValue() * 1024;// 获得系统总内存,单位是KB,乘以1024转换为Byte 
            localBufferedReader.close();

        } catch (IOException e) {
        }
        //return Formatter.formatFileSize(context, initial_memory);// Byte转换为KB或者MB,内存大小规格化 
        return initial_memory/(1024*1024);
    }

 

在Service里面清理内存

自己写的小方法,通过判断进程信息来判断哪些进程是无用的可用杀掉

View Code
ActivityManager activityManger=(ActivityManager) this.getSystemService(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);
               
               System.out.println("pid            "+apinfo.pid);
               System.out.println("processName              "+apinfo.processName);
               System.out.println("importance            "+apinfo.importance);
               String[] pkgList=apinfo.pkgList;
               
               if(apinfo.importance>ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE)
               {
                  // Process.killProcess(apinfo.pid);
                   for(int j=0;j<pkgList.length;j++)
                   {
                       //2.2以上是过时的,请用killBackgroundProcesses代替
                       activityManger.restartPackage(pkgList[j]);
                   } 
               }

解析如下:

RunningAppProcessInfo 得到正在运行的进程信息

pkgList:得到该进程下运行的包名

importance:该进程的重要程度

importance分为几个级别,数值越低就越重要。数值对应的重要性请看api,我判断是大于ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE的都杀掉,一般数值大于ActivityManager.RunningAppProcessInfo.IMPORTANCE_SERVICE的进程都长时间没用或者空进程了。

最后通过for循环把包名对应进程杀掉:

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.os.Process.killProcess(pid);来杀掉其他进程,后来发觉不行

网上找到的解析是

对于这个方法,需要详细解释一下。在SDK的文档中,解释如下:

Kill the process with the given PID. Note that, though this API allows us to request to kill any process based on its PID, the kernel will still impose standard restrictions on which PIDs you are actually able to kill. Typically this means only the process running the caller's packages/application and any additional processes created by that app; packages sharing a common UID will also be able to kill each other's processes.

英语不好,不能准确翻译,所以希望大家自己理解,免得对大家造成误解。我个人对这句话的解释就是,这个方法使用是有条件的:

a、将被杀掉的进程 和 当前进程 处于同一个包或者应用程序中;

b、将被杀掉的进程 是由当前应用程序所创建的附加进程;

c、将被杀掉的进程 和 当前进程 共享了普通用户的UID。(这里的普通用户,是相对于Root权限的用户来说的)

分享到:
评论
3 楼 hnu_hgc 2015-03-28  
求代码,3243544018@qq.com
2 楼 hnu_hgc 2015-03-28  
求代码工程
1 楼 happyboy858 2012-01-18  
楼主, 真心求源码 QQ:441667111@qq.com thanks.

相关推荐

    android应用内存监控工具

    - 进程管理:查看和结束其他应用进程,以释放内存。 - 教程和指南:提供内存管理知识和最佳实践。 五、内存优化策略 1. 使用轻量级数据结构:如使用ArrayList代替LinkedList,减少内存开销。 2. 及时释放资源:如...

    android可用内存的阀值教程,让你更了解android的内存管理参照.pdf

    - 早期,人们普遍认为Android根据LRU列表(Last Recently Used)顺序结束进程,但事实上,Android的决策更依赖于"oom_adj"值。 - 系统可以根据内存的可用量和"oom_adj"值来决定何时以及结束哪些进程,这种定制化...

    Android2.2 结束进程

    ### Android2.2 结束进程:forceStopPackage() 在Android开发过程中,对于应用程序的管理和控制是非常重要的一个环节。本文将详细介绍在Android2.2版本中如何使用`forceStopPackage()`方法来结束进程,并探讨该方法...

    Android 内存溢出问题

    由于堆内存由垃圾回收机制管理,因此开发者不需要手动释放内存。然而,这也意味着堆内存的分配和释放相对较慢。在Android中,堆内存的大小是可变的,随着对象的创建和垃圾回收而调整。Android设备的默认最大堆内存...

    基于android的强行结束APP进程的方法

    尽管强制结束APP进程可以解决某些特定问题,如释放内存,但需要注意的是,这并不总是最佳实践。频繁地强制结束应用可能导致用户体验下降,因为每次打开应用时都需要重新加载,消耗更多系统资源。此外,某些应用在...

    android上的进程管理软件

    在Android操作系统中,进程管理是系统资源调度的关键部分,它涉及到应用程序的运行、内存的分配以及用户界面的响应性。本项目"android上的进程管理软件"提供了一个初级开发者研究和理解Android进程管理机制的实例。...

    android安卓app如何彻底结束进程. 光调用finish()是结束不了程序的,程序中的线程依旧在后台运行.zip

    在Android系统中,当用户点击应用的返回按钮或者调用`finish()`方法时,当前活动(Activity)会被销毁,但这并不意味着整个应用程序进程被完全结束。实际上,Android系统为了优化性能,可能会保持应用的部分或全部...

    android低内存管理策略

    LOWMEMORYKILLER是Android系统中负责内存管理的重要组件,它的主要任务是在系统检测到内存紧张时,根据预定义的策略,有序地终止那些非关键进程,从而释放内存空间,保证前台应用和服务的正常运行。这一机制的核心...

    Android系统内存管理研究及优化_杜吉志1

    后台进程可能会被系统根据内存需求主动结束,以释放资源。空进程是为了提高程序启动速度而保留的,它们通常是最后被终止的。Android系统通过一个名为"oom_adj"的数值评估进程优先级,值越大,进程被终止的可能性越高...

    Android内存管理机制研究_宋平波1

    Android操作系统不会立刻结束进程,而是将进程保留在内存中,当用户尝试再次激活此进程时,可以直接复用内存中的数据从而提升进程的启动速度。 Android进程回收(LMK)是Android操作系统中的一种重要机制,负责回收...

    Android项目实战--手机卫士29--杀死后台进程

    在决定结束进程时,通常不建议终止前台或重要服务,以免影响用户体验。开发者需要根据`RunningAppProcessInfo`的`importance`字段来判断。 5. **结束进程**: 使用`ActivityManager`的`killBackgroundProcesses()`...

    Android内核驱动——内存管理

    当系统内存资源紧张时,内核会采取一系列措施来释放内存,例如,回收未使用的slab对象,清除Page Cache,甚至杀掉后台进程。低内存killer是这个过程的一部分,它根据进程的优先级和内存占用情况选择性地结束进程,以...

    android 一键加速 内存

    在Android操作系统中,"一键加速"通常指的是通过优化和清理后台运行的应用程序,释放设备的内存(RAM),从而提升手机的运行速度和响应性能。在Android Studio(简称AS)环境中,开发者可以创建这样的功能,让非技术...

    Android_内存泄漏研究及调试.doc )

    为了保证应用的安全和性能,Android系统对不同类型的应用进程设置了不同的内存使用上限。例如,对于前台应用(`FOREGROUND_APP`),内存使用上限为1536页(约6MB);对于可见应用(`VISIBLE_APP`),上限为2048页...

    Android代码-MemoryClean安卓内存清理

    MemoryClean是一款针对Android平台设计的内存清理工具,它的主要目标是帮助用户优化设备性能,释放内存(RAM),提高手机或平板电脑的运行速度。本文将深入探讨MemoryClean的工作原理、实现方式以及相关的Android...

    android 退出程序解决内存释放的问题

    在Android开发中,确保应用程序在退出时正确地释放内存是非常重要的。这不仅有助于优化应用程序性能,还能避免系统资源的浪费,提升用户体验。标题和描述中提到的问题是:即使应用程序已经退出,系统仍然显示可以...

    Android学习资料之内存优化.zip

    - 静态变量:静态变量的生命周期与应用程序进程相同,如果持有Activity或其他容易引起内存泄露的对象,会导致内存泄露。 - 非静态内部类:非静态内部类会隐式持有对外部类的引用,如果外部类是Activity,可能导致...

    process _android_

    本文将深入探讨“process _android_”这一主题,主要关注Android系统如何管理内存以及如何结束进程,同时讲解如何获取系统内存信息和识别程序是否为系统程序。 一、Android进程与内存管理 1. 进程生命周期:...

    Android内存优化——常见内存泄露及优化方案.pdf

    关于静态变量导致内存泄露,静态变量的生命周期是从类加载时开始,直到应用程序进程结束。如果静态变量持有了活动或服务的引用,那么即使该活动或服务已经不再需要,但由于静态变量持有引用,它们也无法被系统回收。...

    动态显示内存使用

    Android系统使用Dalvik或ART运行时环境来管理应用程序的内存,它们会自动进行垃圾回收(GC),释放不再使用的对象所占用的内存。然而,过度的内存消耗可能导致应用运行缓慢,甚至被系统强制关闭。因此,开发者需要...

Global site tag (gtag.js) - Google Analytics