MainActivity如下:
MemoryUtils如下:
ServiceSubclass如下:
main.xml如下:
AndroidManifest.xml如下:
- 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如下:
- 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如下:
- 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如下:
- <?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如下:
- <?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>