[安卓]手机管家(十六)进程管理

和软件管理有一些类似

布局,和APPmanage基本差不多,复制过来改一下即可

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
     <TextView 
        android:layout_width="fill_parent"
        android:layout_height="60dp"
        android:text="进程管理"
        android:background="#00FF00"
        android:gravity="center"
        android:textSize="25sp"/>
    
    <LinearLayout
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
      <TextView
          android:layout_width="0dp"
          android:layout_weight="1"
          android:layout_height="wrap_content"
          android:id="@+id/tv_processmanage_num"
          android:text="当前手机进程数 \n10个"
          android:gravity="center"
          android:paddingTop="5dp"
          android:paddingBottom="5dp">          
      </TextView>  
      <TextView
          android:layout_width="0dp"
          android:layout_weight="1"
          android:layout_height="wrap_content"
          android:id="@+id/tv_processmanage_ram"
          android:text="可用ram/总ram\n 502M/504M"
          android:gravity="center"
          android:paddingTop="5dp"
          android:paddingBottom="5dp">         
      </TextView>  
    </LinearLayout>
    
    <FrameLayout 
        android:layout_width="fill_parent"
        android:layout_height="wrap_content">
    <ListView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:id="@+id/lv_appmanage_appinfolist"/>
    <TextView
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:background="#798091"
        android:textColor="#FFFFFF"
        android:textSize="15sp"
        android:id="@+id/tv_appmanage_class"/>
    </FrameLayout>

</LinearLayout>


activity

<pre name="code" class="java">public class ProcessManagementActivity extends Activity {
	private TextView tv_processmanage_num;
	private TextView tv_processmanage_ram;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_processmanage);
		
		tv_processmanage_num = (TextView) findViewById(R.id.tv_processmanage_num);
		tv_processmanage_ram = (TextView) findViewById(R.id.tv_processmanage_ram);
	}

}

 

home的跳转

case 3 : 				
    				Intent intent3 = new Intent(HomeActivity.this, ProcessManagementActivity.class);
    				startActivity(intent3);   				
    				break;


manifest声明

 <activity android:name=".ProcessManagementActivity" ></activity>

utils下工具类走起 GetProcessInfoUtils

获取当前正在运行进程个数

public class GetProcessInfoUtils {
    //获取当前所有进程
	public static int getAllProcess(Context ctx){
		int count = -1;
		//获取count的个数
	    ActivityManager ams = (ActivityManager)ctx.getSystemService(ctx.ACTIVITY_SERVICE);
	    List<RunningAppProcessInfo> rap = ams.getRunningAppProcesses();
		count = rap.size();
	    return count;
	}	
}

回ProcessManagementActivity设置

tv_processmanage_num = (TextView) findViewById(R.id.tv_processmanage_num);
		tv_processmanage_ram = (TextView) findViewById(R.id.tv_processmanage_ram);
	    //获取一些进程数
		int count = GetProcessInfoUtils.getAllProcess(this);
		tv_processmanage_num.setText("当前手机的进程数为\n"+count);
	}

获取内存容量

工具

public static long getAvailRam(Context ctx){
		ActivityManager ams =  (ActivityManager) ctx.getSystemService(ctx.ACTIVITY_SERVICE);
		MemoryInfo outInfo = new MemoryInfo(); //空白的memoinfo 类
		ams.getMemoryInfo(outInfo );
		return  outInfo.availMem;//当前的可用ram  返回的是byte单位		
	}
	public static long getTotalRam(Context ctx){
		ActivityManager ams =  (ActivityManager) ctx.getSystemService(ctx.ACTIVITY_SERVICE);
		MemoryInfo outInfo = new MemoryInfo(); //空白的memoinfo 类
		ams.getMemoryInfo(outInfo );	 
		return  outInfo.totalMem;
	}

activity里获取并显示,注意字节转化下

availram = GetProcessInfoUtils.getAvailRam(this);
		totalram = GetProcessInfoUtils.getTotalRam(this);		
		tv_processmanage_ram.setText("可用ram/总ram\n"+formatSize(availram)+"/"+formatSize(totalram)+"MB");
	}
	private String formatSize(long size) {
		return Formatter.formatFileSize(this, size);
	}

这里有一些版本的问题,api要大于16才行

用别的方法去获取容量大小,系统有文件存了相关信息,可以去获取,按行存的,这里就需要能用按行读的,bufferreader

需要提取其中的数字

//不应该在内部声明,如果出了异常,内部声明有可能会出现随机值,类似于野指针
		long totalram  =-1;
		File file = new File("/proc/meminfo");
		try {
			  BufferedReader br = new BufferedReader(new FileReader(file));
			  String firstline= br.readLine();	
			  //把字符拿出来
			  char[] ch = firstline.toCharArray();
			  StringBuffer sb = new StringBuffer();
			  //只要其中的数字,加到一个string中
			  for (char c : ch) {				  
				  if (c>='0'&&c<='9') {
					sb.append(c);
				  }			
			  }	
			  //由于是kb,保险起见,存为long,防止溢出
			  totalram =  Long.parseLong(sb.toString());				
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		    return  totalram;		
	}


这时候再activity里不能用format了,因为他传的是byte

tv_processmanage_ram.setText("可用ram/总ram\n"+formatSize(availram)+"/"+totalram/1024+"MB");

OK

在工具类里获得应用列表,需要一个bean

public class ProcessInfo {
	private String name ;
	private Drawable icon ;
	private boolean is_user;
	private long memory_usage;
	private String packagename ;
	
	private boolean ischecked;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Drawable getIcon() {
		return icon;
	}
	public void setIcon(Drawable icon) {
		this.icon = icon;
	}
	public boolean isIs_user() {
		return is_user;
	}
	public void setIs_user(boolean is_user) {
		this.is_user = is_user;
	}
	public long getMemory_usage() {
		return memory_usage;
	}
	public void setMemory_usage(long memory_usage) {
		this.memory_usage = memory_usage;
	}
	public String getPackagename() {
		return packagename;
	}
	public void setPackagename(String packagename) {
		this.packagename = packagename;
	}
	@Override
	public String toString() {
		return "ProcessInfo [name=" + name + ", icon=" + icon + ", is_user="
				+ is_user + ", memory_usage=" + memory_usage + ", packagename="
				+ packagename + "]";
	}
	public ProcessInfo(String name, Drawable icon, boolean is_user,
			long memory_usage, String packagename) {
		super();
		this.name = name;
		this.icon = icon;
		this.is_user = is_user;
		this.memory_usage = memory_usage;
		this.packagename = packagename;
		this.ischecked =false;
	}
	public boolean isIschecked() {
		return ischecked;
	}
	public void setIschecked(boolean ischecked) {
		this.ischecked = ischecked;
	}
}

public  static List<ProcessInfo> getAllProcessInfos(Context ctx){
		boolean is_user =false;
	    String appname ="";
	    Drawable icon  = null;
	    long memory_usage=0;
		List<ProcessInfo> processinfos = new ArrayList<ProcessInfo>();
		
		ActivityManager ams =  (ActivityManager) ctx.getSystemService(ctx.ACTIVITY_SERVICE);
	    List<RunningAppProcessInfo> rap = ams.getRunningAppProcesses();
		//拿到包管理器
	    PackageManager pm = ctx.getPackageManager();
	    //遍历以获取各个字段,动态的,运行起来的程序
	    for (RunningAppProcessInfo runningAppProcessInfo : rap) {
			String packagename =runningAppProcessInfo.processName;
			
			//最后单独获取pid对应的ram
			int[] pids = new int[]{ runningAppProcessInfo.pid};	
			android.os.Debug.MemoryInfo[] processMemoryInfo = ams.getProcessMemoryInfo(pids);
			memory_usage =  processMemoryInfo[0].getTotalPss(); //返回值单位是Kb
			
			try {
				ApplicationInfo applicationInfo = pm.getApplicationInfo(packagename,0);
				appname = applicationInfo.loadLabel(pm).toString();
			    icon = applicationInfo.loadIcon(pm);
			    if ((applicationInfo.flags&ApplicationInfo.FLAG_SYSTEM)!=0) {
					  is_user =false;
				}else {
					  is_user =true;
				}
			    //信息添加进去
                ProcessInfo pinfo = new ProcessInfo(appname, icon, is_user, memory_usage, packagename);				
			    processinfos.add(pinfo);
			} catch (NameNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	    }
		return processinfos;
		
	}

测试类

public class ProcessinfoListTest extends AndroidTestCase{
   public void testProcessinfoList(){
	   List<ProcessInfo> list = GetProcessInfoUtils.getAllProcessInfos(getContext());
	   for(ProcessInfo processInfo : list){
		   System.out.println("test"+processInfo);
	   }
   }
}


没问题,显示list


异步线程,他还需要一个adapter,直接复制app管理里的,稍微改一下

private void refreshData() {
		new MyAsyncTask() {
			@Override
			public void pretast() {
				// TODO Auto-generated method stub
				
			}
			@Override
			public void posttast() {
				if (adapter==null) {
					adapter = new MyAdapter();	
					lv_procmanage_procinfolist.setAdapter(adapter);
				}
				else {
					adapter.notifyDataSetChanged();
				}			
			}
			@Override
			public void intask() {
				// TODO Auto-generated method stub
				//耗时操作,放在子线程			
				//appinfolist = Getp.getAppInfos(AppManagementActivity.this);
				processinfolist = GetProcessInfoUtils.getAllProcessInfos(ProcessManagementActivity.this);
				for (ProcessInfo procInfo : processinfolist) {
					if (procInfo.isIs_user()) {
						user_proinfolist.add(procInfo);						
					}
					else {
						sys_proinfolist.add(procInfo);
					}
				}
			}
		}.execute();;
	}


需要一个新的layout   item_procmanager_procinfo

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
    android:layout_width="60dp"
    android:layout_height="60dp"
    android:id="@+id/iv_procmanage_icon"
    android:src="@drawable/app"/>
    <TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/iv_procmanage_icon"
        android:id="@+id/tv_procmanage_appname"
        android:textSize="20sp"
        android:layout_marginTop="5dp"
        android:text="我的app"
        android:textColor="#000000"/>
    <TextView 
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/iv_procmanage_icon"
        android:layout_below="@id/tv_procmanage_appname"
        android:id="@+id/tv_procmanage_memory"
        android:textSize="16sp"
        android:text="sd卡"
        android:textColor="#0000FF"/>  
     <CheckBox
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:id="@+id/cb_procmanage_check"
         android:layout_alignParentRight="true"
         android:focusable="false"
         android:clickable="false"
         android:layout_marginTop="18dp"
         android:layout_marginRight="10dp">        
     </CheckBox>
</RelativeLayout>

一些列的声明

private MyAdapter adapter;
	private ListView lv_procmanage_procinfolist;
	private List<ProcessInfo> processinfolist;
	private List<ProcessInfo> user_proinfolist;
	private List<ProcessInfo> sys_proinfolist;
	private boolean show_sysproc;
	private int listcount =0;
	private  int deletecount =0;

<pre name="code" class="java">lv_procmanage_procinfolist = (ListView) findViewById(R.id.lv_procmanage_appinfolist);
		
		user_proinfolist = new ArrayList<ProcessInfo>();
		sys_proinfolist= new ArrayList<ProcessInfo>();
		
		//获取一些进程数
		int count = GetProcessInfoUtils.getAllProcess(this);

 

class MyAdapter extends BaseAdapter{
		private Holder holder;
		@Override
		public int getCount() {
			// TODO Auto-generated method stub
			if (show_sysproc) {
				listcount = processinfolist.size()+2;				 
			}else {
				listcount= user_proinfolist.size()+1;
			}			
			return listcount-deletecount;			
		}
		@Override
		public Object getItem(int position) {
			// TODO Auto-generated method stub
			return null;
		}
		@Override
		public long getItemId(int position) {
			// TODO Auto-generated method stub
			return 0;
		}
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			// TODO Auto-generated method stub
			//AppInfo appInfo = appinfolist.get(position);		 		   			
			if (position ==0) {
				TextView tv = new TextView(ProcessManagementActivity.this);
				tv.setText("用户进程("+user_proinfolist.size()+")个");
				tv.setBackgroundColor(Color.GRAY);
				tv.setTextColor(Color.WHITE);
				tv.setTextSize(15);
				return tv ;
			}else if (position==user_proinfolist.size()+1) {
				TextView tv = new TextView(ProcessManagementActivity.this);
				tv.setText("系统进程("+sys_proinfolist.size()+")个");
				tv.setBackgroundColor(Color.GRAY);
				tv.setTextColor(Color.WHITE);
				tv.setTextSize(15);
				return tv ;
			} 
			
			ProcessInfo procInfo;
			if (position< user_proinfolist.size()+1) {
				procInfo = user_proinfolist.get(position-1);
			}else {
				/*if (sys_proinfolist.size()==0) {
					return null;
				}*/
				procInfo = sys_proinfolist.get(position-user_proinfolist.size()-2);
			}
			 
			View item_layout =null;
			if (convertView!=null && convertView instanceof RelativeLayout  ) {			
				 item_layout =convertView;
				 holder = (Holder) item_layout.getTag();				 
			}else {
				 item_layout = View.inflate(getApplicationContext(), R.layout.item_procmanager_procinfo, null);		
				  holder = new Holder();
				
				  holder.iv_procmanage_icon = (ImageView) item_layout.findViewById(R.id.iv_procmanage_icon);
				  holder.tv_procmanage_appname = (TextView) item_layout.findViewById(R.id.tv_procmanage_appname);
				  holder.tv_procmanage_memory = (TextView) item_layout.findViewById(R.id.tv_procmanage_memory);
			      holder.cb_procmanage_check =   (CheckBox) item_layout.findViewById(R.id.cb_procmanage_check);
			      item_layout.setTag(holder);		 
			}
			
		
			if (procInfo.getIcon()!=null) {
				holder.iv_procmanage_icon.setImageDrawable(procInfo.getIcon());
			}
			else
			{
				holder.iv_procmanage_icon.setImageResource(R.drawable.processicon);			
			}
			holder.tv_procmanage_appname.setText(procInfo.getName());
			holder.tv_procmanage_memory.setText(procInfo.getMemory_usage()/1024+"MB");			
			holder.cb_procmanage_check.setChecked(procInfo.isIschecked());
			return item_layout;
		}		
		class Holder {			
			ImageView iv_procmanage_icon ;
			TextView tv_procmanage_appname;
			TextView tv_procmanage_memory ;
			CheckBox cb_procmanage_check;
		}		
	}

oncreate里需要调用一次refresh

tv_processmanage_ram.setText("可用ram/总ram\n"+formatSize(availram)+"/"+totalram/1024+"MB");
		
		refreshData();
	}
	private String formatSize(long size) {





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值