###1.设备进程信息获取
获取设备运行进程

ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> runningAppProcessInfos = am.getRunningAppProcesses();

获取设备RAM

MemoryInfo outInfo = new ActivityManager.MemoryInfo();
am.getMemoryInfo(outInfo);
outInfo.availMem;//设备可用RAM
outInfo.totalMem;//设备总RAM

###2.获取进程占用RAM
ActivityManager am = (ActivityManager) context
.getSystemService(Context.ACTIVITY_SERVICE);
MemoryInfo[] processMemoryInfo = am.getProcessMemoryInfo(new int[]{info.pid});
long memSize = processMemoryInfo[0].getTotalPrivateDirty()*1024;

###3.ListView中Item中有CheckBox、Button等的焦点处理
ListView的item布局中有CheckBox、Button等会获取焦点的控件会抢走焦点,造成ListView的item点击事件相应不了

解决方法:控件设置

android:clickable="false"
android:focusable="false"

或者

android:focusable="false"
//descendant 后裔; 后代; (由过去类似物发展来的) 派生物; 弟子;
android:descendantFocusability="blocksDescendants"

###10.ListView中getItemAtPosition()的使用
ListView的getItemAtPosition()方法的返回值即为adapter中getItem()方法返回的对象

###4.清理进程
1.添加权限
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
2.具体实现
ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
am.killBackgroundProcesses(String pkgName);

 package com.hb.mobilesafe.activities;

 import java.util.ArrayList;
import java.util.Iterator;
import java.util.List; import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.ActivityManager;
import android.app.ActivityManager.MemoryInfo;
import android.graphics.Color;
import android.os.Bundle;
import android.text.format.Formatter;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.Window;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView; import com.hb.demo_mobilesafe.R;
import com.hb.mobilesafe.bean.ProInfo;
import com.hb.mobilesafe.utils.ProgressInfoUtil; public class ProcessManagerActivity extends Activity implements OnClickListener {
private TextView tv_clean,tv_allselect,tv_inverse;
private ListView lv_progress_show;
private TextView tv_progres_ssoft,tv_storage;
private TextView tv_software_count;
private List<ProInfo> infosRun;
private List<ProInfo> userInfo;
private List<ProInfo> sysInfo;
private MyProAdapter adapter;
private ActivityManager am;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_processmanager);
initView();
initDate();
} private void initView() {
tv_clean=(TextView) findViewById(R.id.tv_clean);
tv_allselect=(TextView) findViewById(R.id.tv_allselect);
tv_inverse=(TextView) findViewById(R.id.tv_inverse); tv_progres_ssoft=(TextView) findViewById(R.id.tv_progres_ssoft);
tv_storage=(TextView) findViewById(R.id.tv_storage);
tv_software_count=(TextView) findViewById(R.id.tv_software_count); lv_progress_show=(ListView) findViewById(R.id.lv_progress_show); tv_clean.setOnClickListener(this);
tv_allselect.setOnClickListener(this);
tv_inverse.setOnClickListener(this);
}
private void initDate() { tv_progres_ssoft.setText("运行中的进程:"+getRunpro()+"个");
tv_storage.setText("可用内存/总内存:"+Formatter.formatFileSize(this, getAvimen())
+"/"+Formatter.formatFileSize(this, getTotalMen()));
adapter = new MyProAdapter();
sysInfo = new ArrayList<ProInfo>();
userInfo = new ArrayList<ProInfo>();
new Thread(){
public void run() {
infosRun = ProgressInfoUtil.getInfosRun(ProcessManagerActivity.this);
isSysUserApp();
runOnUiThread(new Runnable() {
public void run() {
lv_progress_show.setAdapter(adapter);
}
});
};
}.start();
lv_progress_show.setOnScrollListener(new OnScrollListener() { @Override
public void onScrollStateChanged(AbsListView view, int scrollState) { } @Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if(userInfo!=null && sysInfo !=null){ if(firstVisibleItem==0){
tv_software_count.setVisibility(View.GONE);
}else{ tv_software_count.setVisibility(View.VISIBLE);
}
if(firstVisibleItem <userInfo.size()){
tv_software_count.setText("用户进程:"+userInfo.size());
}else{
tv_software_count.setText("系统进程:"+sysInfo.size());
}
}
}
});
lv_progress_show.setOnItemClickListener(new OnItemClickListener() { @Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
if(position == 0 || position == userInfo.size()+1){
return;
}else if(position < userInfo.size()+1){ int newPosition=position -1;
boolean isCheck = userInfo.get(newPosition).isCheck();
if(isCheck){ userInfo.get(newPosition).setCheck(false);
}else{ userInfo.get(newPosition).setCheck(true);
}
}else{
int newPosition=position-userInfo.size()-2;
boolean isCheck = sysInfo.get(newPosition).isCheck();
if(isCheck){
sysInfo.get(newPosition).setCheck(false);
}else{ sysInfo.get(newPosition).setCheck(true);
}
}
adapter.notifyDataSetChanged();
}
});
} /**
* 一键清理,全选,反选
*/
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.tv_clean:
am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
Iterator<ProInfo> userIterator = userInfo.iterator();
Iterator<ProInfo> sysIterator = sysInfo.iterator();
while (userIterator.hasNext()) {
ProInfo next = userIterator.next();
if(next.isCheck()){
am.killBackgroundProcesses(next.getAppPackageName());
userIterator.remove();
}
}
while (sysIterator.hasNext()) {
ProInfo next = sysIterator.next();
if(next.isCheck()){
am.killBackgroundProcesses(next.getAppPackageName());
sysIterator.remove();
}
}
adapter.notifyDataSetChanged(); break; case R.id.tv_allselect:
for (ProInfo infos : infosRun) {
if(!"com.hb.demo_mobilesafe".equals(infos.getAppPackageName())){
infos.setCheck(true);
}
}
adapter.notifyDataSetChanged();
break; case R.id.tv_inverse: for (ProInfo infos : infosRun) {
if(infos.isCheck() && !("com.hb.demo_mobilesafe").equals(infos.getAppPackageName())){
infos.setCheck(false);
}else if(!infos.isCheck() && !("com.hb.demo_mobilesafe").equals(infos.getAppPackageName())){
infos.setCheck(true);
} }
adapter.notifyDataSetChanged();
break;
}
}
/**
* 运行中的进程
* @return
*/
private int getRunpro(){
ActivityManager am=(ActivityManager) getSystemService(ACTIVITY_SERVICE);
int size = am.getRunningAppProcesses().size();
return size; }
/**
* 可用内存
*/
private long getAvimen(){
ActivityManager am=(ActivityManager) getSystemService(ACTIVITY_SERVICE);
MemoryInfo outInfo = new MemoryInfo();
am.getMemoryInfo(outInfo);
return outInfo.availMem; }
/**
* 总内存
*/
private long getTotalMen(){
ActivityManager am=(ActivityManager) getSystemService(ACTIVITY_SERVICE);
MemoryInfo outInfo = new MemoryInfo();
am.getMemoryInfo(outInfo);
return outInfo.totalMem; }
/**
* 区分系统应用和用户应用
*/
public void isSysUserApp(){ for (ProInfo proInfo: infosRun) {
boolean sys = proInfo.isSys();
if(sys){
sysInfo.add(proInfo);
}else{
userInfo.add(proInfo); }
}
}
class MyProAdapter extends BaseAdapter{
@SuppressWarnings("null")
@SuppressLint("ViewHolder") @Override
public View getView(int position, View view, ViewGroup parent) {
ViewHolder holder = null;
if(view != null && view instanceof RelativeLayout){
holder=(ViewHolder) view.getTag();
}else{
holder=new ViewHolder();
view = View.inflate(ProcessManagerActivity.this, R.layout.proinfo_item, null);
holder.iv_appIcon=(ImageView) view.findViewById(R.id.iv_pro_icon);
holder.tv_appName=(TextView) view.findViewById(R.id.tv_pro_name);
holder.tv_proSize=(TextView) view.findViewById(R.id.tv_pro_size);
holder.cb_isCheck=(CheckBox) view.findViewById(R.id.cb_ischeak);
view.setTag(holder);
}
if(position == 0){
TextView tv0= new TextView(ProcessManagerActivity.this);
if(userInfo.size()==0){
tv0.setHeight(0);
return tv0;
}
tv0.setClickable(false);
tv0.setTextColor(Color.WHITE);
tv0.setBackgroundColor(Color.GRAY);
tv0.setText("用户进程:"+userInfo.size());
return tv0;
}else if(position ==userInfo.size()+1){
TextView tv1= new TextView(ProcessManagerActivity.this);
tv1.setClickable(false);
tv1.setTextColor(Color.WHITE);
tv1.setBackgroundColor(Color.GRAY);
tv1.setText("系统进程:"+sysInfo.size());
return tv1;
}else if(position <userInfo.size()+1){
int newPosition = position-1;
ProInfo proInfo = userInfo.get(newPosition);
holder.iv_appIcon.setImageDrawable(proInfo.getAppIcon());
holder.tv_appName.setText(proInfo.getAppName());
holder.tv_proSize.setText("进程大小:"+Formatter.formatFileSize(ProcessManagerActivity.this, proInfo.getProSize()));
holder.cb_isCheck.setChecked(proInfo.isCheck());
String appPackageName = proInfo.getAppPackageName();
if(appPackageName.equals(getPackageName())){
holder.cb_isCheck.setVisibility(View.GONE);
}else {
holder.cb_isCheck.setVisibility(View.VISIBLE);
} }else{
int newPosition = position-userInfo.size()-2;
ProInfo proInfo = sysInfo.get(newPosition);
holder.iv_appIcon.setImageDrawable(proInfo.getAppIcon());
holder.tv_appName.setText(proInfo.getAppName());
holder.tv_proSize.setText("进程大小:"+Formatter.formatFileSize(ProcessManagerActivity.this, proInfo.getProSize()));
holder.cb_isCheck.setChecked(proInfo.isCheck());
}
return view;
}
@Override
public int getCount() {
return userInfo.size()+1+sysInfo.size()+1;
} @Override
public Object getItem(int position) {
return null;
} @Override
public long getItemId(int position) {
return 0;
}
}
class ViewHolder{
ImageView iv_appIcon;
CheckBox cb_isCheck;
TextView tv_appName;
TextView tv_proSize;
}
}

xml:

 <?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"
android:gravity="center_horizontal" > <TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="46dp"
android:background="#A1FF80"
android:gravity="center_vertical"
android:text="进程管理"
android:textSize="20sp" /> <RelativeLayout
android:id="@+id/rl_size"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/tv_title" > <TextView
android:id="@+id/tv_progres_ssoft"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="运行中的进程:19个"
android:textSize="10sp" /> <TextView
android:id="@+id/tv_storage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:text="可用内存/总内存:20MB/60MB"
android:textSize="10sp" />
</RelativeLayout> <TextView
android:id="@+id/tv_software_count"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/rl_size"
android:background="#888888"
android:visibility="gone"
android:text="用户进程:5"
android:textColor="#ffffff"
/> <ListView
android:clickable="true"
android:id="@+id/lv_progress_show"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_above="@+id/ll"
android:layout_below="@id/tv_software_count" /> <LinearLayout
android:id="@+id/ll"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:orientation="horizontal"
android:padding="2dip" > <TextView
android:id="@+id/tv_clean"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:background="@drawable/clean_button_selector"
android:textSize="15sp" /> <TextView
android:id="@+id/tv_allselect"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/select_btn_selector"
android:textSize="15sp" /> <TextView
android:id="@+id/tv_inverse"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/inverse_btn_selector"
android:textSize="15sp" />
</LinearLayout> </RelativeLayout>

最新文章

  1. [游戏开发-学习笔记]菜鸟慢慢飞(九)- NGUI- UIPanel(官方说明翻译)
  2. NCPC 2013: Dance Reconstruction
  3. Visual Studio 2010 简体中文旗舰、专业版(MSDN原版下载)
  4. 无法将类型为“Excel.ApplicationClass”的 COM 对象强制转换为接口类 型“Excel._Application”。此操作失败的原因是对 IID 为“{000208D5 -0000-0000-C000-000000000046}”的接口的 COM 组件调用 QueryInterface 因以下错误而失败: 加载类型库/DLL 时出错。 (异常来 自 HRESULT:
  5. 转:python webdriver API 之下载文件
  6. 自定义View(2)canas绘制基本图形的示例
  7. Web Service学习之六:CXF解决无法处理的数据类型
  8. java.util 中的property
  9. python高级编程之我不测试
  10. MySql开启远程访问(Linux)
  11. 关于c# 基础运算符的应用
  12. Jenkins : 邮件通知
  13. Java进阶(三十一) Web服务调用
  14. cadence布线完成后的补充操作
  15. Java实现inputstream流的复制
  16. SQL Server 怎么在分页获取数据的同时获取到总记录数
  17. Java的首次学习和了解
  18. android:targetSdkVersion引起的问题
  19. let 与 const 的用法
  20. POJ1741 Tree(树分治——点分治)题解

热门文章

  1. CODEVS1022 覆盖 (二分图染色+匈牙利算法)
  2. ORACLE分区表删除分区数据
  3. PostGIS学习相关术语
  4. Linux服务管理(Ubuntu服务管理工具sysv-rc-conf)(转)
  5. Html5 history Api简介
  6. sqlalchemy foreign key查询和backref
  7. UML中类图的四种关系及其代码实现
  8. hdoj 4925 Apple tree 【最小割】
  9. 递归,迭代,堆栈三种方式实现单链表反转(C++)
  10. Java遍历一个文件夹下的全部文件