mainactivity如下:
package come.on;
import android.app.activity;
import android.content.context;
import android.content.intent;
import android.os.bundle;
import android.view.view;
import android.view.view.onclicklistener;
import android.widget.button;
import android.widget.edittext;
/**
* demo描述:
* 内存清理及内存工具类
* 具体代码参见工具类memoryutils
*
*/
public class mainactivity extends activity {
private button mbutton;
private context mcontext;
private edittext medittext;
@override
public void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
setcontentview(r.layout.main);
init();
}
private void init(){
mcontext=this;
intent intent=new intent("come.on.service");
//该service无用,可去掉
startservice(intent);
medittext=(edittext) findviewbyid(r.id.edittext);
mbutton=(button) findviewbyid(r.id.button);
mbutton.setonclicklistener(new onclicklistener() {
@override
public void onclick(view v) {
memoryutils.cleanmemory(mcontext,medittext);
}
});
}
memoryutils如下:
import java.util.list;
import java.io.filereader;
import android.os.process;
import java.io.ioexception;
import java.io.bufferedreader;
import java.io.inputstreamreader;
import android.app.activitymanager;
import android.content.componentname;
import android.app.activitymanager.memoryinfo;
import android.app.activitymanager.runningtaskinfo;
import android.app.activitymanager.runningappprocessinfo;
* 文档描述:
* 内存工具类
* 包括内容:
* 1 内存清理即杀掉进程的几种方式
* 2 获取内存总大小及其可用大小
* 3 判断栈顶activity名及其所属进程名
* 注意权限:
* <uses-permission android:name="android.permission.get_tasks"/>
* <uses-permission android:name="android.permission.kill_background_processes" />
* 文档日期:
* 2014年5月30日10:01:55
*
public class memoryutils {
//----------> 以下为杀掉进程的几种方式
public static void cleanmemory(context context,edittext edittext) {
long beforecleanmemory=getavailmemory(context);
system.out.println("---> 清理前可用内存大小:"+beforecleanmemory+"m");
activitymanager activitymanager = (activitymanager) context.getsystemservice(context.activity_service);
runningappprocessinfo runningappprocessinfo = null;
list<runningappprocessinfo> runningappprocessinfolist = activitymanager.getrunningappprocesses();
for (int i = 0; i < runningappprocessinfolist.size(); ++i) {
runningappprocessinfo = runningappprocessinfolist.get(i);
string processname = runningappprocessinfo.processname;
//调用杀掉进程的方法
system.out.println("---> 开始清理:"+processname);
killprocessbyrestartpackage(context, processname);
}
long aftercleanmemory=getavailmemory(context);
system.out.println("---> 清理后可用内存大小:"+aftercleanmemory+"m");
system.out.println("---> 节约内存大小:"+(aftercleanmemory-beforecleanmemory)+"m");
edittext.settext("共清理:"+(aftercleanmemory-beforecleanmemory)+"m");
//利用activitymanager.restartpackage()方法杀死进程
//该方法实际调用了activitymanager.killbackgroundprocesses()方法
public static void killprocessbyrestartpackage(context context,string packagename) {
activitymanager.restartpackage(packagename);
system.gc();
//利用process.killprocess(pid)杀死进程
//注意事项:
//1 该方式可自杀,即杀掉本进程
//2 该方式可杀掉其他普通应用进程
//3 该方式不可杀掉系统级应用即system/app应用
public static void killprocessbykillprocess(int pid){
process.killprocess(pid);
//利用adb shell命令杀死进程
public static void killprocessbyadbshell(int pid) {
string cmd = "adb shell kill -9 " + pid;
system.out.println("-------> cmd=" + cmd);
try {
java.lang.process process = runtime.getruntime().exec(cmd);
inputstreamreader inputstreamreader = new inputstreamreader(process.getinputstream());
bufferedreader bufferedreader = new bufferedreader(inputstreamreader);
string line = null;
while ((line = bufferedreader.readline()) != null) {
system.out.println("----> exec shell:" + line);
bufferedreader.close();
} catch (ioexception e) {
e.printstacktrace();
//利用su进程的命令方式杀死进程
//1 得到su进程(super进程)
// runtime.getruntime().exec("su");
//2 利用su进程执行命令
// process.getoutputstream().write(cmd.getbytes());
public static void killprocessbysu(int pid) {
java.lang.process process = runtime.getruntime().exec("su");
string cmd = "kill -9 " + pid;
system.out.println("-------> cmd = " + cmd);
process.getoutputstream().write(cmd.getbytes());
if ((process.waitfor() != 0)) {
system.out.println("-------> su.waitfor()!= 0");
} else {
system.out.println("-------> su.waitfor()==0 ");
} catch (exception e) {
//----------> 以上为杀掉进程的几种方式
//获取当前进程名
public static string getcurrentprocessname(context context) {
int pid = android.os.process.mypid();
for (runningappprocessinfo runningappprocessinfo : activitymanager.getrunningappprocesses()) {
if (runningappprocessinfo.pid == pid) {
string processname=runningappprocessinfo.processname;
return processname;
return null;
//获取栈顶activity名称
public static string gettopactivityname(context context) {
string topactivityname = null;
activitymanager activitymanager = (activitymanager) (context.getsystemservice(android.content.context.activity_service));
list<runningtaskinfo> runningtaskinfos = activitymanager.getrunningtasks(1);
if (runningtaskinfos != null) {
componentname f = runningtaskinfos.get(0).topactivity;
string topactivityclassname = f.getclassname();
string temp[] = topactivityclassname.split("\\.");
topactivityname = temp[temp.length - 1];
return topactivityname;
//获取栈顶activity所属进程的名称
public static string gettopactivityprocessname(context context) {
string processname = null;
componentname componentname = runningtaskinfos.get(0).topactivity;
string topactivityclassname = componentname.getclassname();
int index = topactivityclassname.lastindexof(".");
processname = topactivityclassname.substring(0, index);
return processname;
//获取内存总大小
public static long gettotalmemory() {
// 系统的内存信息文件
string filepath = "/proc/meminfo";
string linestring;
string[] stringarray;
long totalmemory = 0;
filereader filereader = new filereader(filepath);
bufferedreader bufferedreader = new bufferedreader(filereader,1024 * 8);
// 读取meminfo第一行,获取系统总内存大小
linestring = bufferedreader.readline();
// 按照空格拆分
stringarray = linestring.split("\\s+");
// 获得系统总内存,单位kb
totalmemory = integer.valueof(stringarray[1]).intvalue();
return totalmemory / 1024;
//获取可用内存大小
public static long getavailmemory(context context) {
activitymanager activitymanager=(activitymanager)context.getsystemservice(context.activity_service);
memoryinfo memoryinfo = new memoryinfo();
activitymanager.getmemoryinfo(memoryinfo);
return memoryinfo.availmem / (1024 * 1024);
servicesubclass如下:
import android.app.service;
import android.os.ibinder;
public class servicesubclass extends service {
public ibinder onbind(intent intent) {
public void oncreate() {
super.oncreate();
system.out.println("---> service的 oncreate()");
public void onstart(intent intent, int startid) {
super.onstart(intent, startid);
system.out.println("---> service的 onstart()");
main.xml如下:
<?xml version="1.0" encoding="utf-8"?>
<relativelayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
>
<textview
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="测试内存清理"
android:layout_centerhorizontal="true"
android:layout_margintop="25dip"
android:textsize="20sp"
/>
<edittext
android:id="@+id/edittext"
android:layout_width="160dip"
android:layout_height="50dip"
android:layout_margintop="100dip"
android:gravity="center"
/>
<button
android:id="@+id/button"
android:text="清理内存"
android:layout_centerinparent="true"
android:textsize="20sp"
</relativelayout>
androidmanifest.xml如下:
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="come.on"
android:versioncode="1"
android:versionname="1.0" >
<uses-sdk android:minsdkversion="10" />
<uses-permission android:name="android.permission.receive_boot_completed" />
<uses-permission android:name="android.permission.access_checkin_properties" />
<uses-permission android:name="android.permission.record_audio" />
<uses-permission android:name="android.permission.internet" />
<uses-permission android:name="android.permission.access_network_state" />
<uses-permission android:name="android.permission.access_wifi_state" />
<uses-permission android:name="android.permission.change_network_state" />
<uses-permission android:name="android.permission.read_phone_state" />
<uses-permission android:name="android.permission.write_external_storage" />
<uses-permission android:name="android.permission.kill_background_processes" />
<uses-permission android:name="android.permission.get_tasks"/>
<application
android:icon="@drawable/a"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name=".mainactivity" >
<intent-filter >
<action android:name="android.intent.action.main" />
<category android:name="android.intent.category.launcher" />
</intent-filter>
</activity>
<service android:name=".servicesubclass">
<intent-filter>
<action android:name="come.on.service"/>
</service>
</application>
</manifest>