38、进程管理器--代码实现
2014-01-26 11:01
288 查看
首先需要一个结构保存进程信息:
然后一个获取进程列表的类,用于获取当前正在运行的进程列表:
首先为用户进程和系统进程对应的ListView设置适配数据:
全选按钮的处理事件:
一键清理按钮的处理事件:
完整代码:
权限添加:
package com.example.mobilesafe.engine; import android.graphics.drawable.Drawable; /** * Created by sing on 14-1-26. * desc: */ public class ProcessInfo { private static final String TAG = "ProcessInfo"; //应用程序包名 private String packname; //应用程序图标 private Drawable icon; //应用程序所占用的内存空间,单位是byte private long memsize; //是否属于用户进程 private boolean userprocess; //进程的pid(进程的标记) private int pid; //应哟个程序名称 private String appname; //应用程序在Item中是否处于被选中状态(默认下没有被选中) private boolean checked; public boolean isChecked() { return checked; } public void setChecked(boolean checked) { this.checked = checked; } public String getAppname() { return appname; } public void setAppname(String appname) { this.appname = appname; } public int getPid() { return pid; } public void setPid(int pid) { this.pid = pid; } public String getPackname() { return packname; } public void setPackname(String packname) { this.packname = packname; } public Drawable getIcon() { return icon; } public void setIcon(Drawable icon) { this.icon = icon; } public long getMemsize() { return memsize; } public void setMemsize(long memsize) { this.memsize = memsize; } public boolean isUserprocess() { return userprocess; } public void setUserprocess(boolean userprocess) { this.userprocess = userprocess; } }
然后一个获取进程列表的类,用于获取当前正在运行的进程列表:
package com.example.mobilesafe.engine; import android.app.ActivityManager; import android.content.Context; import android.content.pm.ApplicationInfo; import android.content.pm.PackageManager; import com.example.mobilesafe.R; import java.util.ArrayList; import java.util.List; /** * Created by sing on 14-1-26. * desc: */ public class ProcessInfoProvider { private static final String TAG = "ProcessInfoProvider"; private Context context; public ProcessInfoProvider(Context context) { this.context = context; } /** * 返回所有的正在运行的程序信息 * @return */ public List<ProcessInfo> getProcessInfos() { //am可以动态的获取应用的进程信息,相当于PC机上的进程管理器 ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); //pm可以静态的获取到手机中的所有应用程序信息,相当于PC机上的程序管理器 PackageManager pm = context.getPackageManager(); //返回所有正在运行的进程 List<ActivityManager.RunningAppProcessInfo> runingappsInfos = am.getRunningAppProcesses(); //用于存放进程信息 List<ProcessInfo> processInfos = new ArrayList<ProcessInfo>(); //遍历出每个进程,并将每个进程的信息封装在ProcessInfo对象中,最后将所有的进程存放在List<ProcessInfo>中返回 for (ActivityManager.RunningAppProcessInfo info : runingappsInfos) { //用于封装进程信息 ProcessInfo processInfo = new ProcessInfo(); //获取进程的pid(进程的标记) int pid = info.pid; //将进程的pid、processName、memsize封装到ProcessInfo对象中 processInfo.setPid(pid); String packname = info.processName; processInfo.setPackname(packname); //获取到该进程对应的应用程序所占用的内存空间 long memsize = am.getProcessMemoryInfo(new int[] { pid })[0].getTotalPrivateDirty() * 1024; processInfo.setMemsize(memsize); try { //通过进程的packname来获取到该进程对应的应用程序对象(获取到应用程序的对象后,就可以通过该对象获取应用程序信息) ApplicationInfo applicationInfo = pm.getApplicationInfo(packname, 0); //判断该应用程序是否是第三方应用程序,便于以后分类 if(filterApp(applicationInfo)){ processInfo.setUserprocess(true); }else{ processInfo.setUserprocess(false); } //分别获取到应用程序的图标和名称,并将其封装到ProcessInfo对象中 processInfo.setIcon(applicationInfo.loadIcon(pm)); processInfo.setAppname(applicationInfo.loadLabel(pm).toString()); } catch (Exception e) { //这里会抛出一个包名未找到异常,我们将其设置为系统进程,应用图标为默认的系统图标 e.printStackTrace(); processInfo.setUserprocess(false); processInfo.setIcon(context.getResources().getDrawable(R.drawable.ic_launcher)); processInfo.setAppname(packname); } processInfos.add(processInfo); processInfo = null; } return processInfos; } /** * 三方应用的过滤器 ,如 * * @param info * @return true 三方应用 false 系统应用 */ public boolean filterApp(ApplicationInfo info) { if ((info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) { return true; } else if ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) { return true; } return false; } }
首先为用户进程和系统进程对应的ListView设置适配数据:
// 为用户进程对应的ListView适配数据 private class UserAdapter extends BaseAdapter { public int getCount() { return userProcessInfos.size(); } public Object getItem(int position) { return userProcessInfos.get(position); } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { View view; // 使用堆内存中的唯一的一份字节码(ListView的优化) ViewHolder holder = new ViewHolder(); // 复用缓存(ListView的优化) if (convertView == null) { view = View.inflate(getApplicationContext(),R.layout.task_manager_item, null); holder = new ViewHolder(); holder.iv_icon = (ImageView) view.findViewById(R.id.iv_taskmanager_icon); holder.tv_name = (TextView) view.findViewById(R.id.tv_taskmanager_name); holder.tv_mem = (TextView) view.findViewById(R.id.tv_taskmanager_mem); holder.cb = (CheckBox) view.findViewById(R.id.cb_taskmanager); view.setTag(holder); } else { // 使用缓存的view view = convertView; // 获取到缓存的view的标记 holder = (ViewHolder) view.getTag(); } // 从用户进程对应的集合中取出对应的元素做数据的适配 ProcessInfo info = userProcessInfos.get(position); // 如果应用程序是我们自己的手机卫士,隐藏掉Checkbox(避免杀死自己) if (info.getPackname().equals(getPackageName())) { holder.cb.setVisibility(View.INVISIBLE); } else { holder.cb.setVisibility(View.VISIBLE); } // 为Item适配数据:应用图标、名称、占用内存大小、是否处于选中状态(默认情况下都是未选中状态) holder.iv_icon.setImageDrawable(info.getIcon()); holder.tv_name.setText(info.getAppname()); holder.tv_mem.setText(Formatter.formatFileSize(getApplicationContext(), info.getMemsize())); holder.cb.setChecked(info.isChecked()); // 返回Item对应的view return view; } } // 使用static修饰,可以保证该对象在堆内存中只存在一份字节码文件(所有的Item共用该字节码文件) static class ViewHolder { ImageView iv_icon; TextView tv_name; TextView tv_mem; CheckBox cb; } // 为系统进程对应的ListView适配数据 private class SystemAdapter extends BaseAdapter { public int getCount() { return systemProcessInfos.size(); } public Object getItem(int position) { return systemProcessInfos.get(position); } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { View view; ViewHolder holder = new ViewHolder(); if (convertView == null) { view = View.inflate(getApplicationContext(),R.layout.task_manager_item, null); holder = new ViewHolder(); holder.iv_icon = (ImageView) view.findViewById(R.id.iv_taskmanager_icon); holder.tv_name = (TextView) view.findViewById(R.id.tv_taskmanager_name); holder.tv_mem = (TextView) view.findViewById(R.id.tv_taskmanager_mem); holder.cb = (CheckBox) view.findViewById(R.id.cb_taskmanager); view.setTag(holder); } else { view = convertView; holder = (ViewHolder) view.getTag(); } ProcessInfo info = systemProcessInfos.get(position); holder.iv_icon.setImageDrawable(info.getIcon()); holder.tv_name.setText(info.getAppname()); holder.tv_mem.setText(Formatter.formatFileSize(getApplicationContext(), info.getMemsize())); holder.cb.setChecked(info.isChecked()); return view; } }在onCreate里初始化控件并获取进程列表,分别设置给两个listview:
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.taskmanager_layout); // 默认情况下,显示的是用户进程列表 showUserApp = true; provider = new ProcessInfoProvider(this); userProcessInfos = new ArrayList<ProcessInfo>(); systemProcessInfos = new ArrayList<ProcessInfo>(); // 通过provider来获取手机中的所有进程 List<ProcessInfo> mRunningProcessInfos = provider.getProcessInfos(); // 将获取到的所有进程进行分类存储(用户进程和系统进程) for (ProcessInfo info : mRunningProcessInfos) { if (info.isUserprocess()) { userProcessInfos.add(info); } else { systemProcessInfos.add(info); } } // 用户进程对应的ListView及设置ListView的点击事件 lv1 = (ListView) findViewById(R.id.lv_usertask); lv1.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view,int position, long id) { CheckBox cb = (CheckBox) view.findViewById(R.id.cb_taskmanager); // 获取到被点击的Item对象 ProcessInfo info = (ProcessInfo) lv1.getItemAtPosition(position); // 判断被点击的Item是否是我们自己的手机安全卫士条目(我们不允许杀死自己的应用程序) if (info.getPackname().equals(getPackageName())) { return; } // 手动的设置Checkbox的状态 if (info.isChecked()) { info.setChecked(false); cb.setChecked(false); } else { info.setChecked(true); cb.setChecked(true); } } }); // 系统进程对应的ListView及设置ListView的点击事件 lv2 = (ListView) findViewById(R.id.lv_systemtask); lv2.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 禁止 响应系统进程中的第一个Item的点击事件 if (view instanceof TextView) { return; } CheckBox cb = (CheckBox) view.findViewById(R.id.cb_taskmanager); // 获取到被点击的Item对象 ProcessInfo info = (ProcessInfo) lv2 .getItemAtPosition(position); // 手动的设置Checkbox的状态 if (info.isChecked()) { info.setChecked(false); cb.setChecked(false); } else { info.setChecked(true); cb.setChecked(true); } } }); // 为“用户进程”按钮注册一个监听器 bt_user = (Button) findViewById(R.id.bt_task_user); bt_user.setOnClickListener(this); bt_user.setTextColor(Color.WHITE); bt_user.setBackgroundDrawable(getResources().getDrawable(R.drawable.bt_pressed)); // 为“系统进程”按钮注册一个监听器 bt_system = (Button) findViewById(R.id.bt_task_system); bt_system.setOnClickListener(this); bt_system.setTextColor(Color.WHITE); bt_system.setBackgroundDrawable(getResources().getDrawable(R.drawable.bg_normal)); // 默认情况下显示的是用户进程列表,所以我们应当将系统进程列表设置为不可见。View.GONE:View无效,且不占用空间 lv2.setVisibility(View.GONE); // 为用户进程列表设置数据适配器 useradapter = new UserAdapter(); lv1.setAdapter(useradapter); // 将该TextView做为系统进程对应的ListView的第一个Item tvheader = new TextView(getApplicationContext()); tvheader.setText("杀死系统进程会导致系统不稳定"); tvheader.setBackgroundColor(Color.YELLOW); // 将tvheader添加到系统进程对应的ListView中,此时,tvheader属于该ListView的一员(第一个Item即是)。必须在适配数据前添加 lv2.addHeaderView(tvheader); // 为系统进程列表设置数据适配器 systemadapter = new SystemAdapter(); lv2.setAdapter(systemadapter); }
全选按钮的处理事件:
/** * 全选按钮的点击事件 */ public void selectAll(View view) { //判断是用户进程全选,还是系统进程全选 if (showUserApp) { //迭代进程集合,将每个info中的Checkbox都设置为true(选中),然后通知适配器刷新数据 for (ProcessInfo info : userProcessInfos) { info.setChecked(true); useradapter.notifyDataSetChanged(); } } else { //迭代进程集合,将每个info中的Checkbox都设置为true(选中),然后通知适配器刷新数据 for (ProcessInfo info : systemProcessInfos) { info.setChecked(true); systemadapter.notifyDataSetChanged(); } } }
一键清理按钮的处理事件:
/** * 一键清理的点击事件 */ public void oneKeyClear(View v) { //获取到ActivityManager对象,该对象中有杀死进程的操作 ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE); //计数要被杀死多少个进程 int count = 0; //计数要被杀死的所有进程所占用的内存大小 long memsize = 0; //存放已被被杀死的进程 List<ProcessInfo> killedProcessInfo = new ArrayList<ProcessInfo>(); //判断是清理用户进程还是清理系统进程 if (showUserApp) {//用户进程 for (ProcessInfo info : userProcessInfos) { //根据Checkbox的勾选状态来确定哪些进程需要被清理 if (info.isChecked()) { //执行累加操作 count++; memsize += info.getMemsize(); //执行kill操作 am.killBackgroundProcesses(info.getPackname()); //将杀死后的进程存入集合中 killedProcessInfo.add(info); } } } else {//系统进程 for (ProcessInfo info : systemProcessInfos) { if (info.isChecked()) { count++; memsize += info.getMemsize(); am.killBackgroundProcesses(info.getPackname()); killedProcessInfo.add(info); } } } //迭代出被杀死的进程,判断哪个集合中包含该进程,如果包含,则移除掉(用于更新列表显示) for (ProcessInfo info : killedProcessInfo) { if (info.isUserprocess()) { if (userProcessInfos.contains(info)) { userProcessInfos.remove(info); } } else { if (systemProcessInfos.contains(info)) { systemProcessInfos.remove(info); } } } //更新数据显示 if (showUserApp) { useradapter.notifyDataSetChanged(); } else { systemadapter.notifyDataSetChanged(); } /* Toast.makeText( this, "杀死了" + count + "个进程,释放了" + Formatter.formatFileSize(this, memsize) + "内存", 1) .show();*/ //使用自定义的Toast来显示杀死的进程数,以及释放的内存空间。 MyToast.showToast(this, "杀死了" + count + "个进程,释放了" + Formatter.formatFileSize(this, memsize) + "内存"); }
完整代码:
package com.example;
import android.app.Activity;
import android.app.ActivityManager;
import android.content.DialogInterface;
import android.graphics.Color;
import android.os.Bundle;
import android.text.format.Formatter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;
import com.example.mobilesafe.R;
import com.example.mobilesafe.engine.MyToast;
import com.example.mobilesafe.engine.ProcessInfo;
import com.example.mobilesafe.engine.ProcessInfoProvider;
import java.util.ArrayList;
import java.util.List;
/**
* Created by sing on 14-1-24.
* desc:
*/
public class TaskManagerActivity extends Activity implements View.OnClickListener {
// 显示用户进程
private ListView lv1;
// 显示系统进程
private ListView lv2;
// 判断当前显示的列表是用户进程还是系统进程
private boolean showUserApp;
// 切换用户进程和系统进程的按钮(用于响应“全选”与“一键清理”按钮时:判断是用户进程,还是系统进程)
private Button bt_user, bt_system;
// 用户进程所在列表的适配器
private UserAdapter useradapter;
// 系统进程所在列表的适配器
private SystemAdapter systemadapter;
// 用于获取手机中的进程
private ProcessInfoProvider provider;
// 为系统进程添加的一个Item,该Item上显示“杀死系统进程会导致系统不稳定”文字。
private TextView tvheader;
// 存放用户进程的集合
private List<ProcessInfo> userProcessInfos;
// 存放系统进程的集合
private List<ProcessInfo> systemProcessInfos;
public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.taskmanager_layout); // 默认情况下,显示的是用户进程列表 showUserApp = true; provider = new ProcessInfoProvider(this); userProcessInfos = new ArrayList<ProcessInfo>(); systemProcessInfos = new ArrayList<ProcessInfo>(); // 通过provider来获取手机中的所有进程 List<ProcessInfo> mRunningProcessInfos = provider.getProcessInfos(); // 将获取到的所有进程进行分类存储(用户进程和系统进程) for (ProcessInfo info : mRunningProcessInfos) { if (info.isUserprocess()) { userProcessInfos.add(info); } else { systemProcessInfos.add(info); } } // 用户进程对应的ListView及设置ListView的点击事件 lv1 = (ListView) findViewById(R.id.lv_usertask); lv1.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view,int position, long id) { CheckBox cb = (CheckBox) view.findViewById(R.id.cb_taskmanager); // 获取到被点击的Item对象 ProcessInfo info = (ProcessInfo) lv1.getItemAtPosition(position); // 判断被点击的Item是否是我们自己的手机安全卫士条目(我们不允许杀死自己的应用程序) if (info.getPackname().equals(getPackageName())) { return; } // 手动的设置Checkbox的状态 if (info.isChecked()) { info.setChecked(false); cb.setChecked(false); } else { info.setChecked(true); cb.setChecked(true); } } }); // 系统进程对应的ListView及设置ListView的点击事件 lv2 = (ListView) findViewById(R.id.lv_systemtask); lv2.setOnItemClickListener(new AdapterView.OnItemClickListener() { public void onItemClick(AdapterView<?> parent, View view, int position, long id) { // 禁止 响应系统进程中的第一个Item的点击事件 if (view instanceof TextView) { return; } CheckBox cb = (CheckBox) view.findViewById(R.id.cb_taskmanager); // 获取到被点击的Item对象 ProcessInfo info = (ProcessInfo) lv2 .getItemAtPosition(position); // 手动的设置Checkbox的状态 if (info.isChecked()) { info.setChecked(false); cb.setChecked(false); } else { info.setChecked(true); cb.setChecked(true); } } }); // 为“用户进程”按钮注册一个监听器 bt_user = (Button) findViewById(R.id.bt_task_user); bt_user.setOnClickListener(this); bt_user.setTextColor(Color.WHITE); bt_user.setBackgroundDrawable(getResources().getDrawable(R.drawable.bt_pressed)); // 为“系统进程”按钮注册一个监听器 bt_system = (Button) findViewById(R.id.bt_task_system); bt_system.setOnClickListener(this); bt_system.setTextColor(Color.WHITE); bt_system.setBackgroundDrawable(getResources().getDrawable(R.drawable.bg_normal)); // 默认情况下显示的是用户进程列表,所以我们应当将系统进程列表设置为不可见。View.GONE:View无效,且不占用空间 lv2.setVisibility(View.GONE); // 为用户进程列表设置数据适配器 useradapter = new UserAdapter(); lv1.setAdapter(useradapter); // 将该TextView做为系统进程对应的ListView的第一个Item tvheader = new TextView(getApplicationContext()); tvheader.setText("杀死系统进程会导致系统不稳定"); tvheader.setBackgroundColor(Color.YELLOW); // 将tvheader添加到系统进程对应的ListView中,此时,tvheader属于该ListView的一员(第一个Item即是)。必须在适配数据前添加 lv2.addHeaderView(tvheader); // 为系统进程列表设置数据适配器 systemadapter = new SystemAdapter(); lv2.setAdapter(systemadapter); }
// 响应用户进程、系统进程的按钮的点击事件(完成用户进程列表和系统进程列表的切换)
public void onClick(View v) {
switch (v.getId()) {
// 由系统进程列表切换到用户进程列表(或者当前列表切换到当前列表)
case R.id.bt_task_user:
// 移除系统进程列表中的第一个用于提示的Item
if (tvheader != null) {
lv2.removeHeaderView(v);
tvheader = null;
}
// 当前显示的是用户进程
showUserApp = true;
// 设置两个按钮的背景色,以示区分
bt_user.setBackgroundDrawable(getResources().getDrawable(R.drawable.bt_pressed));
bt_system.setBackgroundDrawable(getResources().getDrawable(R.drawable.bg_normal));
// 将lv1设置为可见,lv2设置为不可见
lv1.setVisibility(View.VISIBLE);
lv2.setVisibility(View.INVISIBLE);
break;
// 由系用户程列表切换到系统进程列表(或者当前列表切换到当前列表)
case R.id.bt_task_system:
showUserApp = false;
bt_system.setBackgroundDrawable(getResources().getDrawable(R.drawable.bt_pressed));
bt_user.setBackgroundDrawable(getResources().getDrawable(R.drawable.bg_normal));
lv2.setVisibility(View.VISIBLE);
lv1.setVisibility(View.INVISIBLE);
break;
}
}
/** * 全选按钮的点击事件 */ public void selectAll(View view) { //判断是用户进程全选,还是系统进程全选 if (showUserApp) { //迭代进程集合,将每个info中的Checkbox都设置为true(选中),然后通知适配器刷新数据 for (ProcessInfo info : userProcessInfos) { info.setChecked(true); useradapter.notifyDataSetChanged(); } } else { //迭代进程集合,将每个info中的Checkbox都设置为true(选中),然后通知适配器刷新数据 for (ProcessInfo info : systemProcessInfos) { info.setChecked(true); systemadapter.notifyDataSetChanged(); } } }
/** * 一键清理的点击事件 */ public void oneKeyClear(View v) { //获取到ActivityManager对象,该对象中有杀死进程的操作 ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE); //计数要被杀死多少个进程 int count = 0; //计数要被杀死的所有进程所占用的内存大小 long memsize = 0; //存放已被被杀死的进程 List<ProcessInfo> killedProcessInfo = new ArrayList<ProcessInfo>(); //判断是清理用户进程还是清理系统进程 if (showUserApp) {//用户进程 for (ProcessInfo info : userProcessInfos) { //根据Checkbox的勾选状态来确定哪些进程需要被清理 if (info.isChecked()) { //执行累加操作 count++; memsize += info.getMemsize(); //执行kill操作 am.killBackgroundProcesses(info.getPackname()); //将杀死后的进程存入集合中 killedProcessInfo.add(info); } } } else {//系统进程 for (ProcessInfo info : systemProcessInfos) { if (info.isChecked()) { count++; memsize += info.getMemsize(); am.killBackgroundProcesses(info.getPackname()); killedProcessInfo.add(info); } } } //迭代出被杀死的进程,判断哪个集合中包含该进程,如果包含,则移除掉(用于更新列表显示) for (ProcessInfo info : killedProcessInfo) { if (info.isUserprocess()) { if (userProcessInfos.contains(info)) { userProcessInfos.remove(info); } } else { if (systemProcessInfos.contains(info)) { systemProcessInfos.remove(info); } } } //更新数据显示 if (showUserApp) { useradapter.notifyDataSetChanged(); } else { systemadapter.notifyDataSetChanged(); } /* Toast.makeText( this, "杀死了" + count + "个进程,释放了" + Formatter.formatFileSize(this, memsize) + "内存", 1) .show();*/ //使用自定义的Toast来显示杀死的进程数,以及释放的内存空间。 MyToast.showToast(this, "杀死了" + count + "个进程,释放了" + Formatter.formatFileSize(this, memsize) + "内存"); }
// 为用户进程对应的ListView适配数据 private class UserAdapter extends BaseAdapter { public int getCount() { return userProcessInfos.size(); } public Object getItem(int position) { return userProcessInfos.get(position); } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { View view; // 使用堆内存中的唯一的一份字节码(ListView的优化) ViewHolder holder = new ViewHolder(); // 复用缓存(ListView的优化) if (convertView == null) { view = View.inflate(getApplicationContext(),R.layout.task_manager_item, null); holder = new ViewHolder(); holder.iv_icon = (ImageView) view.findViewById(R.id.iv_taskmanager_icon); holder.tv_name = (TextView) view.findViewById(R.id.tv_taskmanager_name); holder.tv_mem = (TextView) view.findViewById(R.id.tv_taskmanager_mem); holder.cb = (CheckBox) view.findViewById(R.id.cb_taskmanager); view.setTag(holder); } else { // 使用缓存的view view = convertView; // 获取到缓存的view的标记 holder = (ViewHolder) view.getTag(); } // 从用户进程对应的集合中取出对应的元素做数据的适配 ProcessInfo info = userProcessInfos.get(position); // 如果应用程序是我们自己的手机卫士,隐藏掉Checkbox(避免杀死自己) if (info.getPackname().equals(getPackageName())) { holder.cb.setVisibility(View.INVISIBLE); } else { holder.cb.setVisibility(View.VISIBLE); } // 为Item适配数据:应用图标、名称、占用内存大小、是否处于选中状态(默认情况下都是未选中状态) holder.iv_icon.setImageDrawable(info.getIcon()); holder.tv_name.setText(info.getAppname()); holder.tv_mem.setText(Formatter.formatFileSize(getApplicationContext(), info.getMemsize())); holder.cb.setChecked(info.isChecked()); // 返回Item对应的view return view; } } // 使用static修饰,可以保证该对象在堆内存中只存在一份字节码文件(所有的Item共用该字节码文件) static class ViewHolder { ImageView iv_icon; TextView tv_name; TextView tv_mem; CheckBox cb; } // 为系统进程对应的ListView适配数据 private class SystemAdapter extends BaseAdapter { public int getCount() { return systemProcessInfos.size(); } public Object getItem(int position) { return systemProcessInfos.get(position); } public long getItemId(int position) { return position; } public View getView(int position, View convertView, ViewGroup parent) { View view; ViewHolder holder = new ViewHolder(); if (convertView == null) { view = View.inflate(getApplicationContext(),R.layout.task_manager_item, null); holder = new ViewHolder(); holder.iv_icon = (ImageView) view.findViewById(R.id.iv_taskmanager_icon); holder.tv_name = (TextView) view.findViewById(R.id.tv_taskmanager_name); holder.tv_mem = (TextView) view.findViewById(R.id.tv_taskmanager_mem); holder.cb = (CheckBox) view.findViewById(R.id.cb_taskmanager); view.setTag(holder); } else { view = convertView; holder = (ViewHolder) view.getTag(); } ProcessInfo info = systemProcessInfos.get(position); holder.iv_icon.setImageDrawable(info.getIcon()); holder.tv_name.setText(info.getAppname()); holder.tv_mem.setText(Formatter.formatFileSize(getApplicationContext(), info.getMemsize())); holder.cb.setChecked(info.isChecked()); return view; } }
}
权限添加:
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES" />
相关文章推荐
- Spring无配置使用properties文件
- php和mysql关于时间的实用函数
- Qt之界面出现、消失动画效果
- Google Java编程风格指南
- matlab jpg2ppm
- 安装python BeautifulSoup插件
- Qt之界面实现技巧
- myeclipse的debug快捷键 (
- C# 属性和公有变量区别
- C语言字节对齐
- 关于django-avatar的一个小BUG
- python 列表综合的一个事例
- C#代码注释规范及文档生成
- c# 扑克牌程序(1) 一副扑克牌可以选择是否包含大小王
- 给Visual C++ 2008的Win32项目XP界面化
- Qt之开机自启动
- eclipse 中创建maven web项目
- Java调度框架Quartz 2.2.1
- 《UNIX环境高级编程》笔记--IO多路转换
- Qt之日志输出文件