Android之——杀死用户选中的进程优化

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47281055

在上一篇博文《Android之——杀死用户选中的进程(释放进程占用的空间)》一文中,向大家介绍了如何杀死用户选中的进程,但是,遗留了一个问题,那就是杀死进程后,ListVIew列表没有立即刷新,这篇文章我们就来解决这个问题,优化一下ListView的显示,提升用户体验。我们这篇博文同样是基于上一篇博文来进行优化的,请大家先阅读上一篇博文《Android之——杀死用户选中的进程(释放进程占用的空间)

一、原理

这里,我们主要优化的是TaskManagerActivity类中自定义的适配器类,在这个自定义适配器类中,我们增加了一个属性字段List<TaskInfo> infos,这个集合代表的是当前要显示到ListView中的数据集合,同时为这个集合设置一个set方法,当其他地方对数据集合进行了更改的时候,比如,添加或者移出了集合中的数据,只要调用自定义适配器的set方法即可将更新后的list集合传递到自定义适配器类中,同时,调用ListView的notifyDataSetChanged()方法即可刷新ListView页面。

二、实现

1、更新自定义适配器TaskManagerAdapter

在这个自定义适配器类中,我们增加了一个属性字段List<TaskInfo> infos,这个集合代表的是当前要显示到ListView中的数据集合,同时为这个集合设置一个set方法,当其他地方对数据集合进行了更改的时候,比如,添加或者移出了集合中的数据,只要调用自定义适配器的set方法即可将更新后的list集合传递到这个自定义适配器类中。

具体实现代码如下:

/**
	 * 自定义适配器
	 * @author liuyazhuang
	 *
	 */
	private class TaskManagerAdapter extends BaseAdapter{
		private LayoutInflater mInflater;
		private List<TaskInfo> infos;

		public void setInfos(List<TaskInfo> infos) {
			this.infos = infos;
		}

		public TaskManagerAdapter(){
			mInflater = getLayoutInflater();
		}
		@Override
		public int getCount() {
			return infos.size();
		}

		@Override
		public Object getItem(int position) {
			return infos.get(position);
		}

		@Override
		public long getItemId(int position) {
			return position;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			View view = null;
			ViewHolder holder = null;
			if(convertView != null){
				view = convertView;
				holder = (ViewHolder) view.getTag();
			}else{
				view = mInflater.inflate(R.layout.task_manager_item, null);
				holder = new ViewHolder();
				holder.iv_task_manager_icon = (ImageView) view.findViewById(R.id.iv_task_manager_icon);
				holder.iv_task_manager_name = (TextView) view.findViewById(R.id.tv_task_manager_name);
				holder.iv_task_manager_memory = (TextView) view.findViewById(R.id.tv_task_manager_memory);
				//获取到UI上的CheckBox控件
				holder.cb_task_manager_selected = (CheckBox) view.findViewById(R.id.cb_task_manager_selected);
				view.setTag(holder);
			}
			TaskInfo taskInfo = infos.get(position);
			holder.iv_task_manager_icon.setImageDrawable(taskInfo.getTask_icon());
			holder.iv_task_manager_memory.setText("占用的内存:"+TextFormat.formatByte(taskInfo.getTask_memory()*1024));
			holder.iv_task_manager_name.setText(taskInfo.getTask_name());

			String packageName = taskInfo.getPackageName();
			//应用程序是当前运行的程序
			if(packageName.equals(getPackageName())){
				holder.cb_task_manager_selected.setVisibility(View.GONE);
			}else{
				holder.cb_task_manager_selected.setVisibility(View.VISIBLE);
			}
			//获取条目的选中状态
			boolean isChecked = taskInfo.isChecked();
			if(isChecked){
				holder.cb_task_manager_selected.setChecked(true);
			}else{
				holder.cb_task_manager_selected.setChecked(false);
			}
			return view;
		}
	}

2、更新Handler

这里由于我们更新了自定义适配器类,其中显示的数据设置方式发生了变化,所以,我们也要更新一下默认进程列表的显示方式,我们在Handler实例化自定义适配器类TaskManagerAdapter后,需要手动将进程列表集合set到这个类中的list属性字段中,然后调用ListView的notifyDataSetChanged()方法刷新列表显示。

具体代码如下:

private Handler mHandler = new Handler(){
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case SUCCESS_GETTASKINFO:
				long total = TaskUtils.getAvailMem(TaskManagerActivity.this);
				for(TaskInfo info : taskInfos){
					total += info.getTask_memory() * 1024;
				}
				//可用内存
				String availMemStr = TextFormat.formatByte(TaskUtils.getAvailMem(TaskManagerActivity.this));
				//总内存
				String totalMemStr = TextFormat.formatByte(total);
				tv_task_manager_task_memory.setText("可用/总内存:"+availMemStr+"/"+totalMemStr);

				mAdapter = new TaskManagerAdapter();
				mAdapter.setInfos(taskInfos);
				rl_loading.setVisibility(View.GONE);
				lv_taskmanage.setAdapter(mAdapter);
				break;

			default:
				break;
			}
		};
	};

3、更新“一键清理”的点击事件

在这个方法中,我们新创建了一个list集合,用来存放没有被杀死的进程,处理完后,将这个没有被杀死的进程集合set给自定义适配器类TaskManagerAdapter的list集合,然后调用ListView的notifyDataSetChanged()方法刷新列表显示。

注意:遍历集合的时候,是不能对集合进行增、删、改操作的。

具体代码如下:

/**
	 * 杀死进程
	 * @param v
	 */
	public void kill_process(View v){
		//存放没有被杀死的进程
		List<TaskInfo> newTaskInfos = new ArrayList<TaskInfo>();
		for(TaskInfo taskInfo : taskInfos){
			if(taskInfo.isChecked()){
				//杀死选中的进程
				am.killBackgroundProcesses(taskInfo.getPackageName());
			}else{
				newTaskInfos.add(taskInfo);
			}
		}
		mAdapter.setInfos(newTaskInfos);
		mAdapter.notifyDataSetChanged();
	}

三、运行效果

四、温馨提示

本实例中,为了方面,我把一些文字直接写在了布局文件中和相关的类中,大家在真实的项目中要把这些文字写在string.xml文件中,在外部引用这些资源,切记,这是作为一个Android程序员最基本的开发常识和规范,我在这里只是为了方便直接写在了类和布局文件中。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 08-02

Android之——杀死用户选中的进程优化的相关文章

Android之——杀死选中的进程(释放进程占用的空间)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47277691 这篇文章是基于上一篇文章<Android之--获取进程.内存.任务列表>完善的,大家可以先阅读一下上一篇博文<Android之--获取进程.内存.任务列表>,做到心中有数.这篇文章中我主要向大家介绍,如何杀死我们在列表中选中的进程,释放进程所占用的空间.好了,不废话了,咱们直接进入主题吧. 一.原理 老规矩,还是先唠叨一下这个原理级别的东东吧. 基于上

android中杀死进程的方法

第一种方法:这个方法只能自杀,不能杀死其他进程~ /**************************************************** *            杀死进程的第一种方法                   * *                                                   * ****************************************************/ int myPid = android

Android ListView使用BaseAdapter与ListView的优化 (转至 http://www.open-open.com/lib/view/open1339485728006.html)

在ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的操作.也就是说,这个ListView不再只是展示数据,也不仅仅是这一行要来处理用户的操作,而是里面的控件要获得用户的焦点.读者可以试试用SimpleAdapter添加一个按钮到ListView的条目中,会发现可以添加,但是却无法获得焦点,点击操作被ListView的Item所覆盖.这时候最方便的方法就是使用灵活的适配器BaseAdapter了. ▲图4-35 BaseAdapter中的方法 使用BaseAdapter必须写一

Android ListView使用BaseAdapter与ListView的优化

在ListView的使用中,有时候还需要在里面加入按钮等控件,实现单独的操作.也就是说,这个ListView不再只是展示数据,也不仅仅是这一行要来处理用户的操作,而是里面的控件要获得用户的焦点.读者可以试试用SimpleAdapter添加一个按钮到ListView的条目中,会发现可以添加,但是却无法获得焦点,点击操作被ListView的Item所覆盖.这时候最方便的方法就是使用灵活的适配器BaseAdapter了. ▲图4-35 BaseAdapter中的方法 使用BaseAdapter必须写一

Android后台杀死系列之一:FragmentActivity及PhoneWindow后台杀死处理机制

App在后台久置后,再次从桌面或最近的任务列表唤醒时经常会发生崩溃,这往往是App在后台被系统杀死,再次恢复的时候遇到了问题,而在使用FragmentActivity+Fragment的时候会更加频繁.比如,如果Fragment没有提供默认构造方法,就会在重建的时候因为反射创建Fragment失败而崩溃,再比如,在onCreate里面new 一个FragmentDialog,并且show,被后台杀死后,再次唤醒的时候,就会show两个对话框,这是为什么?其实这就涉及了后台杀死及恢复的机制,其中涉

Android Framework学习(一)之init进程解析

init进程是Android系统中用户空间的第一个进程,它被赋予了很多极其重要的工作职责,init进程相关源码位于system/core/init,本篇博客我们就一起来学习init进程(基于Android 7.0). init入口函数分析 init的入口函数为main,位于system/core/init/init.cpp int main(int argc, char** argv) { if (!strcmp(basename(argv[0]), "ueventd")) { ret

Android Studio如何选择查看指定进程的log?

今天说一个简单的东东,关于Android Studio在logcat中如何查看指定进程的log. 关于过滤你自己所开发的应用的log,在这篇文章中:Android Studio如何给log添加过滤项(Filters)?有提及.当 然很多时候可能我们会有这样的场景,我们想看某一个进程的log,比如我想看酷狗的log,但是如果process那栏的进 程很多,这个时候logo也会非常多,这种情况下,你很难分辨出哪个logo是属于酷狗的. 其实,Android Studio还是有和Eclipse一样的选

干掉某个用户的所有进程 ---slay和kill

要杀掉指定进程,你可以: 1.sudo slay <name> 知道进程名字即可 2.kill[参数][进程号]  知道进程ID即可 用‘slay’干掉某个用户的所有进程 slay 是Chris Ausbrooks写的一款用于杀掉指定用户所有运行进程的命令行工具.slay对系统管理员而言在找出那些不应该运行进程的用户是很有用的. slay在大多数发行版中都有官方仓库. 安装 Ubuntu 和它的衍生版 sudo apt-get install slay Arch Linux 和它的衍生版 su

Android Gradle插件用户指南(译)

Android Gradle插件用户指南(译) 原文Gradle Plugin User Guide - Android Tools Project Site samples see bottom of New Build System 参考Gradle For Android Training Course 1 简介 这篇文档是基于0.9版本的Gradle插件,1.0以前的版本由于不兼容,可能会有所不同 1.1 新的构建系统的目标 新构建系统的目标是: 使得代码和资源的重用更加简单 使得创建同