您的位置:首页 > 移动开发 > Android开发

android清理内存

2015-08-08 10:40 573 查看
http://blog.csdn.net/lfdfhl/article/details/27673249?utm_source=tuicool

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如下:

[java] view
plaincopy





package come.on;

import java.util.List;

import java.io.FileReader;

import android.os.Process;

import java.io.IOException;

import java.io.BufferedReader;

import android.widget.EditText;

import android.content.Context;

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 activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

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) {

try {

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) {

e.printStackTrace();

}

}

//----------> 以上为杀掉进程的几种方式

//获取当前进程名

public static String getCurrentProcessName(Context context) {

int pid = android.os.Process.myPid();

ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);

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;

ActivityManager activityManager = (ActivityManager) (context.getSystemService(android.content.Context.ACTIVITY_SERVICE));

List<RunningTaskInfo> runningTaskInfos = activityManager.getRunningTasks(1);

if (runningTaskInfos != 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;

try {

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();

bufferedReader.close();

} catch (IOException e) {

}

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如下:

[java] view
plaincopy





package come.on;

import android.app.Service;

import android.content.Intent;

import android.os.IBinder;

public class ServiceSubclass extends Service {

@Override

public IBinder onBind(Intent intent) {

return null;

}

@Override

public void onCreate() {

super.onCreate();

System.out.println("---> Service的 onCreate()");

}

@Override

public void onStart(Intent intent, int startId) {

super.onStart(intent, startId);

System.out.println("---> Service的 onStart()");

}

}

main.xml如下:

[html] view
plaincopy





<?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_centerHorizontal="true"

android:layout_marginTop="100dip"

android:gravity="center"

android:textSize="20sp"

/>

<Button

android:id="@+id/button"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:text="清理内存"

android:layout_centerInParent="true"

android:textSize="20sp"

/>

</RelativeLayout>

AndroidManifest.xml如下:

[html] view
plaincopy





<?xml version="1.0" encoding="utf-8"?>

<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"/>

</intent-filter>

</service>

</application>

</manifest>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: