首页 > 代码库 > Android 手机卫士12--进程管理

Android 手机卫士12--进程管理

技术分享

1.本进程不能被选中,所以先将checkbox隐藏掉--手机卫士 不能自杀

if(getItem(position).packageName.equals(getPackageName())){
	holder.cb_box.setVisibility(View.GONE);
}else{
	holder.cb_box.setVisibility(View.VISIBLE);
}

 

2.清理选中进程

private void clearAll() {
	//1,获取选中进程
	//2,创建一个记录需要杀死的进程的集合
	List<ProcessInfo> killProcessList = new ArrayList<ProcessInfo>();
	for(ProcessInfo processInfo:mCustomerList){
		if(processInfo.getPackageName().equals(getPackageName())){
			continue;
		}
		if(processInfo.isCheck){
			//不能在集合循环过程中去移除集合中的对象
//				mCustomerList.remove(processInfo);
			//3,记录需要杀死的用户进程
			killProcessList.add(processInfo);
		}
	}
	
	for(ProcessInfo processInfo:mSystemList){
		if(processInfo.isCheck){
			//4,记录需要杀死的系统进程
			killProcessList.add(processInfo);
		}
	}
	//5,循环遍历killProcessList,然后去移除mCustomerList和mSystemList中的对象
	long totalReleaseSpace = 0;
	for (ProcessInfo processInfo : killProcessList) {
		//6,判断当前进程在那个集合中,从所在集合中移除
		if(mCustomerList.contains(processInfo)){
			mCustomerList.remove(processInfo);
		}
		
		if(mSystemList.contains(processInfo)){
			mSystemList.remove(processInfo);
		}
		//7,杀死记录在killProcessList中的进程
		ProcessInfoProvider.killProcess(this,processInfo);
		
		//记录释放空间的总大小
		totalReleaseSpace += processInfo.memSize;
	}
	//8,在集合改变后,需要通知数据适配器刷新
	if(mAdapter!=null){
		mAdapter.notifyDataSetChanged();
	}
	//9,进程总数的更新
	mProcessCount -= killProcessList.size();
	//10,更新可用剩余空间(释放空间+原有剩余空间 == 当前剩余空间)
	mAvailSpace += totalReleaseSpace;
	//11,根据进程总数和剩余空间大小
	tv_process_count.setText("进程总数:"+mProcessCount);
	tv_memory_info.setText("剩余/总共"+Formatter.formatFileSize(this, mAvailSpace)+"/"+mStrTotalSpace);
	//12,通过吐司告知用户,释放了多少空间,杀死了几个进程,
	String totalRelease = Formatter.formatFileSize(this, totalReleaseSpace);
//		ToastUtil.show(getApplicationContext(), "杀死了"+killProcessList.size()+"个进程,释放了"+totalRelease+"空间");
	
//		jni  java--c   c---java
	//占位符指定数据%d代表整数占位符,%s代表字符串占位符
	ToastUtil.show(getApplicationContext(), 
			String.format("杀死了%d进程,释放了%s空间", killProcessList.size(),totalRelease));
}

 

3.ProcessInfoProvider.java

技术分享
  1 package com.itheima.mobilesafe74.engine;
  2 
  3 import java.io.BufferedReader;
  4 import java.io.FileNotFoundException;
  5 import java.io.FileReader;
  6 import java.io.IOException;
  7 import java.util.ArrayList;
  8 import java.util.List;
  9 
 10 import com.itheima.mobilesafe74.R;
 11 import com.itheima.mobilesafe74.db.domain.ProcessInfo;
 12 
 13 import android.app.ActivityManager;
 14 import android.app.ActivityManager.MemoryInfo;
 15 import android.app.ActivityManager.RunningAppProcessInfo;
 16 import android.content.Context;
 17 import android.content.pm.ApplicationInfo;
 18 import android.content.pm.PackageManager;
 19 import android.content.pm.PackageManager.NameNotFoundException;
 20 
 21 public class ProcessInfoProvider {
 22     //获取进程总数的方法
 23     public static int getProcessCount(Context ctx){
 24         //1,获取activityManager
 25         ActivityManager am = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
 26         //2,获取正在运行进程的集合
 27         List<RunningAppProcessInfo> runningAppProcesses = am.getRunningAppProcesses();
 28         //3,返回集合的总数
 29         return runningAppProcesses.size();
 30     }
 31     
 32     
 33     /**
 34      * @param ctx    
 35      * @return 返回可用的内存数    bytes
 36      */
 37     public static long getAvailSpace(Context ctx){
 38         //1,获取activityManager
 39         ActivityManager am = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
 40         //2,构建存储可用内存的对象
 41         MemoryInfo memoryInfo = new MemoryInfo();
 42         //3,给memoryInfo对象赋(可用内存)值
 43         am.getMemoryInfo(memoryInfo);
 44         //4,获取memoryInfo中相应可用内存大小
 45         return memoryInfo.availMem;
 46     }   
 47     
 48     
 49     /**
 50      * @param ctx    
 51      * @return 返回总的内存数    单位为bytes 返回0说明异常
 52      */
 53     public static long getTotalSpace(Context ctx){
 54         /*//1,获取activityManager
 55         ActivityManager am = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
 56         //2,构建存储可用内存的对象
 57         MemoryInfo memoryInfo = new MemoryInfo();
 58         //3,给memoryInfo对象赋(可用内存)值
 59         am.getMemoryInfo(memoryInfo);
 60         //4,获取memoryInfo中相应可用内存大小
 61         return memoryInfo.totalMem;*/
 62         
 63         //内存大小写入文件中,读取proc/meminfo文件,读取第一行,获取数字字符,转换成bytes返回
 64         FileReader fileReader  = null;
 65         BufferedReader bufferedReader = null;
 66         try {
 67             fileReader= new FileReader("proc/meminfo");
 68             bufferedReader = new BufferedReader(fileReader);
 69             String lineOne = bufferedReader.readLine();
 70             //将字符串转换成字符的数组
 71             char[] charArray = lineOne.toCharArray();
 72             //循环遍历每一个字符,如果此字符的ASCII码在0到9的区域内,说明此字符有效
 73             StringBuffer stringBuffer = new StringBuffer();
 74             for (char c : charArray) {
 75                 if(c>=‘0‘ && c<=‘9‘){
 76                     stringBuffer.append(c);
 77                 }
 78             }
 79             return Long.parseLong(stringBuffer.toString())*1024;
 80         } catch (Exception e) {
 81             e.printStackTrace();
 82         }finally{
 83             try {
 84                 if(fileReader!=null && bufferedReader!=null){
 85                     fileReader.close();
 86                     bufferedReader.close();
 87                 }
 88             } catch (IOException e) {
 89                 e.printStackTrace();
 90             }
 91         }
 92         return 0;
 93     }  
 94     
 95     /**
 96      * @param ctx    上下文环境
 97      * @return        当前手机正在运行的进程的相关信息
 98      */
 99     public static List<ProcessInfo> getProcessInfo(Context ctx){
100         //获取进程相关信息
101         List<ProcessInfo> processInfoList = new ArrayList<ProcessInfo>();
102         //1,activityManager管理者对象和PackageManager管理者对象
103         ActivityManager am = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
104         PackageManager pm = ctx.getPackageManager();
105         //2,获取正在运行的进程的集合
106         List<RunningAppProcessInfo> runningAppProcesses = am.getRunningAppProcesses();
107     
108         //3,循环遍历上诉集合,获取进程相关信息(名称,包名,图标,使用内存大小,是否为系统进程(状态机))
109         for (RunningAppProcessInfo info : runningAppProcesses) {
110             ProcessInfo processInfo = new ProcessInfo();
111             //4,获取进程的名称 == 应用的包名
112             processInfo.packageName = info.processName;
113             //5,获取进程占用的内存大小(传递一个进程对应的pid数组)
114             android.os.Debug.MemoryInfo[] processMemoryInfo = am.getProcessMemoryInfo(new int[]{info.pid});
115             //6,返回数组中索引位置为0的对象,为当前进程的内存信息的对象
116             android.os.Debug.MemoryInfo memoryInfo = processMemoryInfo[0];
117             //7,获取已使用的大小
118             processInfo.memSize = memoryInfo.getTotalPrivateDirty()*1024;
119             
120             try {
121                 ApplicationInfo applicationInfo = pm.getApplicationInfo(processInfo.packageName, 0);
122                 //8,获取应用的名称
123                 processInfo.name = applicationInfo.loadLabel(pm).toString();
124                 //9,获取应用的图标
125                 processInfo.icon = applicationInfo.loadIcon(pm);
126                 //10,判断是否为系统进程
127                 if((applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == ApplicationInfo.FLAG_SYSTEM){
128                     processInfo.isSystem = true;
129                 }else{
130                     processInfo.isSystem = false;
131                 }
132             } catch (NameNotFoundException e) {
133                 //需要处理
134                 processInfo.name = info.processName;
135                 processInfo.icon = ctx.getResources().getDrawable(R.drawable.ic_launcher);
136                 processInfo.isSystem = true;
137                 e.printStackTrace();
138             }
139             processInfoList.add(processInfo);
140         }
141         return processInfoList;
142     }
143 
144 
145     /**
146      * 杀进程方法
147      * @param ctx    上下文环境
148      * @param processInfo    杀死进程所在的javabean的对象
149      */
150     public static void killProcess(Context ctx,ProcessInfo processInfo) {
151         //1,获取activityManager
152         ActivityManager am = (ActivityManager) ctx.getSystemService(Context.ACTIVITY_SERVICE);
153         //2,杀死指定包名进程(权限)
154         am.killBackgroundProcesses(processInfo.packageName);
155     }
156 }
ProcessInfoProvider

 

Android 手机卫士12--进程管理