这两天在搞个内存清理小插件,网上很少这方面资料,之前找过清理缓存的例子测试,结果不成功。后来自己思考该怎么清理内存,于是成功搞出来了。
这两个方法是网上拷别人的,分别用来得到可用内存和内存总数,这样我们就可用得到了已用内存数。
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权限的用户来说的)
分享到:
相关推荐
Android webview 内存泄露的解决方法 最近在activity嵌套webview显示大量图文发现APP内存一直在涨,没法释放内存,查了很多资料,大概是webview的一个BUG,引用了activity导致内存泄漏,所以就尝试传递...
清理释放Android 安卓手机内存空间方法教程
Android应用源码之强行结束APP进程的方法
Android2.2 结束进程forceStopPackage()
主要介绍了Android Native 内存泄漏系统化解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Android处理内存泄漏的代码例子。用于演示避免内存泄漏的几种方法,包括:关闭游标、重用适配、回收图像、注销监听、释放引用。
本文实例讲述了Android结束进程的方法。分享给大家供大家参考,具体如下: 最近在做一个类似与任务管理器的东西,里面有个功能,可以通过这个管理器结束掉其他的进程。 在Android平台下,结束进程的方法还是比较多的...
Android中获取系统内存信息以及进程信息-----ActivityManager的使用(一)
【Android 逆向】修改运行中的 Android 进程的内存数据 ( Android 系统中调试器进程内存流程 | 编译内存调试动态库以及调试程序 ) https://hanshuliang.blog.csdn.net/article/details/121063591 博客资源
深度释放内存,挺有效的,自己试了下挺好的,希望其他人也能分享到
安卓Android源码——强行结束APP进程的方法.zip
>现修复android5.0以上不能查看进程的问题,暂时不能支持7.0的查看进程的功能,欢迎各位提出相应的意见或建议,如不能配置好环境,请下载安装包MemoryCleaner >由于对第一版的安卓手机内存用到的技术以及UI不满意,...
Android不同于Linux,有一套自己独特的进程管理模块,这个模块有更强的可定制性,可根据“oom_adj”值的范围来决定进程管理策略,比如可以设定“当内存小于X时,结束“oom_adj”大于Y的进程”。 这给了进程管理脚本...
Handler对象中使用匿名内部类或非静态内部类正确地释放消息避免内存泄漏或增加Native内存,在Android中,Handler对象通常会被用来在主线程(UI线程)中处理消息,以更新UI界面。当我们在Handler对象中使用匿名内部类...
超强内存释放,这个内存释放最高的时候居然可以释放出131兆!
android 强行结束APP进程的方法.zip
本例子是一个安卓内存管理的小例子,可以获取系统的内存信息、可以获取所有进程的软件名称、可以根据包名判断程序是否是系统程序、可以获取程序的版本号、可以获取程序的签名需要的朋友可以看一下。源码有注释,编码...
一个android小工程,里面有我自己写的一个工具类,可以轻松避免加载图片列表内存溢出,分享给需要的朋友,工程使用android 1.6SDK完成
Android进程 Android内存策略 Android虚拟机Dalvik Android与linux相比 进程间通讯
Android内存泄漏简介 不少人认为java程序,因为有垃圾回收机制,应该没有内存泄漏 1.引用没有释放造成的内存泄漏 2.资源对象没有关闭造成的内存泄漏 3.一些不良代码造成的内存压力 4.JNI代码的内存泄漏