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>