版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第 7 天卫士第 7 章 进程管理模块27.1模块概述27.1.1 功能介绍2进程管理之获取内存和进程数..5界面 UI3进程信息的实体类4工具类之获取系统信息5工具类之获取进程信息8主逻辑代码107.3进程管理之进程展示..47.3.5界面 UI12进程管理之 ListView 的 Item 布局13进程管理之 ListView 的数据适配器15进程管理之 ListView 的条目点击事件17进程管理界面 ListView 优化197.4进程24进程管理之..4全选与反
2、选界面 UI24全选与反选之按钮状态25进程管理之进程28头标题中进程数的更新307.5进程管理之抽屉界面33界面 UI33抽屉动画36进程管理之抽屉界面功能实现3.37.6.4显示系统进程选项的状态更新39显示系统进程选项的功能实现40选项的状态更新41选项的功能实现42锁屏自动锁屏自动7.7 本章小结441第 7 章 进程管理模块了解进程管理模块功能掌握如何获取中的进程掌握如何结束正在运行的进程大家都知道,大部分 Android用的时间越长就会变得越慢甚至卡顿,哪怕是 2G 的运行内存,用的时间长了也会变得奇慢无比。通常情况下,造成这种情况的原因有两种,一
3、种是缓存过多,一种是开启的进程过多。在第 6 章中已经针对缓存进行了讲解,本章将针对进程管理进行详细讲解,以解决运行速度过慢问题。7.1模块概述7.1.1功能介绍进程管理模块主要用于查看当前开启多少进程服务,其中包含用户进程个数和系统进程个数,可以选择某个进程,也可以选择所有进程,同时还可以设置是否显示系统进程以及锁屏时是否进程,该模块界面效果如图 7-1 所示。图 7-1进程管理界面27.2进程管理之获取内存和进程数7.2.1界面 UI进程管理模块界面 TaskManagerActivity,可以看出它的界面跟管理的界面有很多相似之处,如下图 7-2 中的两张图所示,进程管理界面只是比方的两
4、个按钮和一个抽屉功能。管理界面多了上方右上角一个进程的按钮,加上下这里,首先实现上方获取进程和内存信息的功能,将管理的界面布局的代码直接拿过来。图 7-2进程管理界面和管理界面之间的比较图 7-2 进程管理界面上方用于显示进程数和内存的布局代码如文件【7-1】所示。【文件 7-1】 activity_prosmanager.xml3 工具类之获取系统信息在主界面逻辑代码中,使用了 TaskUtils 工具类,该类主要用于获取系统信息,它有 5 个方法,分别是获取总内存大小、获取可用的内存信息、正在运行的进程数量、总的进程数和低版本下的总内存大小,具体代码如【文件 7-3】所示。【
5、文件 7-3】 TaskUtils.java51. public class TaskUtils 2./* 获取正在运行的进程的个数* param context5.*/public sic getRunningProsCount(Context context) / 获取到进程管理器ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);/ 获取所有正在运行的进程集合List appProses = am.getRunningAppProses();/ 正在运行的进程的
6、个数return appProses.size();14.15./*16.* 获取总共有多少个进程17.*/public sicgetRunningTotalCount(Context context) / 获取总共有多少个进程PackageManagackageManager = context.getPackageManager();List installedPackages = packageManager14./*15.* 占用内存大小16.*/17.public long memSize;18./* 判断是否是用户进程* true 表示用户进程* false 表示系统进程22.*/
7、23.publicisUserTask;24./*25.* 用于显示 CheckBox 是否被选中26.*/27.publicchecked;28. 6.getInstalledPackages(0);/ 初始化 hashset/一共有多少个进程count = 0;for (PackageInfo packageInfo : installedPackages) HashSet set = new HashSet();/ 获取到进程的名字String prosName = packageInfo.applicationIsName;set.add(prosName);ActivityInfo
8、activities = packageInfo.activities;if (null != activities) for (ActivityInfo activityInfo : activities) prosName = activityIsName;set.add(prosName);36.37.ServiceInfo servi= packageInfo.servi;if (null != servi) for (ServiceInfo serviceInfo : servi) prosName = serviceIsName;set.add(prosName);43.44.Ac
9、tivityInfo receivers = packageInfo.receivers;if (null != receivers) for (ActivityInfo activityInfo : receivers) prosName = activityIsName;set.add(prosName);50.51.ProviderInfo providers = packageIviders;if (null != providers) for (ProviderInfo providerInfo : providers) prosName = providerIsName;set.a
10、dd(prosName);57.58.59.count += set.size();60.61.return count;62.63./* 获取到剩余内存* param context766.* return67.*/public sic long getAvailMem(Context context) ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);MemoryInfo outInfo = new MemoryInfo();/ 获取到内存的基本信息am.get
11、MemoryInfo(outInfo);/ 获取到可用内存(剩余内存)return outInfo.availMem;76.77./* 获取到总共有多少内存* param context* return81.*/SuppressL(NewApi)public sic long getTotalMem(Context context) ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);MemoryInfo outInfo = new MemoryInfo();am.g
12、etMemoryInfo(outInfo);/ 判断当前用户的版本号/ 这个方法在 API16 里面才有/ 适配低版本机if (Build.VER.SDK_= Build.VER_CODES.JELLY_BEAN) return outInfo.totalMem; else return getLowTotalMem();95.96.97./*98.* 获取到低版本总共有多少内存99.*/private sic long getLowTotalMem() /总共的内存/MemTotal:513492 kBFile file = new File(/proc/meminfo);try Buffe
13、redReader reader = new BufferedReader(new InputStreamReader(newFileInputStream(file);/一行String readLine = reader.readLine();7.2.4工具类之获取进程信息在进程管理界面中,需要获取正在运行的进程,该功能代码相对比较独立,因此将其抽取出来作为一个单独的工具类供其使用,具体代码如【文件 7-11】所示。【文件 7-4】 TaskInfoParser.java8public class TaskInfoParser private sic String prosName;pri
14、vate sikInfo taskInfo;public sic List getTaskInfos(Context context) / 获取到进程管理者ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);/ 获取到所有正在运行的进程List proses = am.getRunningAppProses();PackageManagackageManager = context.getPackageManager();/ 获取到上面所有的包/ 获取到所有的 apk
15、List installedPackages = packageManager.getInstalledPackages(0);List lists = new ArrayList();for (i = 0; i proses.size(); i+) try taskInfo = new TaskInfo();/ 获取到正在运行当前进程的对象RunningAppProsInfo prosInfo = proses.get(i);prosName = proses.get(i).prosName;taskInfo.apkPackageName = prosName;/ 不使用 PackageIn
16、fo packageInfo = installedPackages.get(i)的原因是/中所有程序并非全部都在运行,应使用下面这种方式/替换readLine = readLine.replace(MemTotal:, );readLine = readLine.replace(kB, );readLine = readLine.trim();/方便格式化return Long.parseLong(readLine) * 1024; catch (Exception e) / TODO Auto-generated catch blocke.prStackTrace();118.119.re
17、turn 0;120.121.第 59 行代码用于获取进程管理器,然后得到所有正在运行的进程数,一个包管理器PackageManager,通过包管理器获取正在运行的程序。第 1014 行代码用于获取包管理器 PackageManager,通过包管理器获取上所有的安装包。第 15 行代码创建了一个 List进程集合,用于进程对象。第 1646 行代码用于循环遍历所有正在运行的进程,并获取程序包名、占用内存大小、程序图标、程序名称,最后将进程信息封装到 TaskInfo 对象中。9PackageInfo packageInfo = packageManager.getPackageInfo(pro
18、sName, 0);/ 获取到当前应用程序的图标Drawable icon = packageInfo.applicationInfo.loadIcon(packageManager);taskInfo.icon = icon;/ 获取到应用程序的名字String appName = packageInfo.applicationInfo.loadLabel(packageManager).toString();taskInfo.appName = appName;/ 获取到进程内存的基本信息MemoryInfo memoryInfo = am.getProsMemoryInf prosInf
19、o.);/ Dirty 弄脏 表示占用了多少内存38./ * 1024 方便格式化long totalPrivateDirty = memoryInfo0.getTotalPrivateDirty() * 1024;taskInfo.memSize = totalPrivateDirty;flags = packageInfo.applicationInfo.flags;if (flags & ApplicationInfo.FLAG_SYSTEM) != 0) taskInfo.isUserTask = false; else taskInfo.isUserTask = true;46. c
20、atch (Exception e) / TODO Auto-generated catch blocke.prStackTrace();/ taskInfo = new TaskInfo();/ 考虑到有些应用程序时没有应用图标/ 如果当前应用程序报错了。那么给一个默认的taskInfo.icon = context.getResour().getDrawable(R.drawable.ic_launcher);taskInfo.appName = prosName;56.57.lists.add(taskInfo);58.59.return lists;60.61. 第 4855 行代码当
21、应用程序获取应用图标失败后,第 57 行代码将当前获取的进程信息放到集合中,自己给一个默认的7.2.5主逻辑代码上面已经将对应的工具类定义好, 下面开始获取中的进程数和内存信息, TaskManagerActivity.java 中对应的逻辑代码如文件所示。【文件】.itheima mobilesafe_sh2.act/TaskManagerActivity.java10public class TaskManagerActivity extendivity private ProgressDesView pdv_task_count;private ProgressDesView pdv_r
22、am;privaist taskInfos;Overrideprotected void onCreate(Bundle savedInstane) / TODO Auto-generated method stubsuper.onCreate(savedInstane);initView();initData();11.private void initView() setContentView(R.layout.activity_task_manager);mListView = (ListView) findViewById(R.id.list_view);/ 进程数pdv_task_c
23、ount = (ProgressDesView) findViewById(R.id.pdv_task_count);/ 运行内存pdv_ram = (ProgressDesView) findViewById(R.id.pdv_ram);/ 初始化进程个数initTaskCount();/ 初始化内存initMem();23.24./初始化数据,获取到所有的进程详细信息,用于在主界面中进行展示private void initData() new Thread() public void run() / 获取到所有的进程taskInfos = TaskInfoParser.getTaskIn
24、fos(TaskManagerActivity.this);Message msg = Message.obtain();msg.what = 0;handler.sendMessage(msg); 34.;35.start();1136.private Handler handler = new Handler() public void handleMessage(android.os.Message msg) switch (msg.what) case 0:System.out.prln(进程个数- + taskInfos.size();break;43.44.;45.;46./*47
25、.* 初始化内存48.*/private void initMem() / 获取到剩余内存long availMem = TaskUtils.getAvailMem(this);/ 获取总共的内存long totalMem = TaskUtils.getTotalMem(this);/ 使用的内存long userMem = totalMem - availMem;pdv_ram.setTitle(内存);/ 设置占用的内存pdv_ram.setTvLeft(占用内存 + Formatter.formatFileSize(this, userMem);/ 设置可用内存pdv_ram.setTv
26、Right(可用内存 + Formatter.formatFileSize(this, availMem);/ 设置进度条pdv_ram.setProgress() (userMem * 100f / totalMem);63.64./*65.* 初始化进程个数66.*/private void initTaskCount() / 获取正在运行的进程个数runningProsCount = TaskUtils.getRunningProsCount(this);/ 总共的进程个数runningTotalCount = TaskUtils.getRunningTotalCount(this);/
27、 设置标题pdv_task_count.setTitle(进程:);/ 设置进程个数pdv_task_count.setTvLeft(正在运行 + runningProsCount + 个);/ 设置总共有多少个进程pdv_task_count.setTvRight(总共进程 + runningTotalCount + 个);/ 设置进度上面的代码书写好之后,运行程序,效果图如图 7-4 所示。图 7-4头标题中内存和进程信息7.3进程管理之进程展示7.3.1界面 UI前面已经将中所有正在运行的进程信息已经获取到了,下面开始在进程管理界面进行展示,与管理界面类似,也需要使用 ListView
28、进行数据展示。首先,修改进程管理界面之前的布局文件,代码修改为如下所示。12 9.!- -!图 7-5smanager_list.xml进程管理界面 Item 布局【文件 7-6】 item_pro14 7. 13.22.TextViewandroid:id=+id/tv_task_mem_sizeandroid:layout_width=match_parentandroid:layout_height=wrap_contentandroid:layout_below=id/tv_task_nameandroid:layout_marginLeft=5dp上述布局文件中,ImageView
29、控件用于展示程序图标,第一个 TextView 控件用于展示程序名称,第二个 TextView 用于展示程序占用内存大小,CheckBox 控件用于选中当前程序。并且 CheckBox 控件还使用了背景选择器,具体如【文件 7-7】所示。【文件 7-7】 res/drawable/green_checkbox_selector.xml7.3.3进程管理之 ListView 的数据适配器当数据获取完之后,需要将当前的数据在当前的进程管理界面进行展示,需要写出 ListView 的数据适配器,具体的代码如下所示。15private class TaskManagerAdater extends B
30、aseAdapter OverridepublicgetCount() / TODO Auto-generated method stubreturn taskInfos.size(); 6.Overridepublic Object getItem(ition) return null;10.Overridepublic long getItemId(ition) / TODO Auto-generated method stubandroid:layout_margop=3dpandroid:layout_toRightOf=id/iv_iconandroid:text=占用内存大小and
31、roid:textSize=16sp /运行程序,效果图如图 7-6 所示。图 7-6进程管理界面在图 7-6 的进程界面中,点击当前 ListView 的条目时发现右边的 CheckBox 没有被选中,只有鼠标放在 CheckBox 上点击时按钮才会被选中,这是因为类似 Button 或者 CheckBox 的按钮会抢夺当前所在条目的焦点。因此,需要在 CheckBox 上增加两条属性,让当前的 CheckBox 获取不到焦点,处理触摸的事件焦点交给 ListView 的条目,对应修改的代码如下所示。1614.returnition;15.Overridepublic View getVie
32、w(ition, View convertView, ViewGroup parent) / TODO Auto-generated method stubView view = View.inflate(TaskManagerActivity.this,R.layout.item_task_manager, null);/ 图标ImageView iv_icon = (ImageView) view.findViewById(R.id.iv_icon);/ app 名字TextView tv_task_name = (TextView) view.findViewById(R.id.tv_t
33、ask_name);/ 占用内存大小TextView tv_task_mem_size = (TextView) view.findViewById(R.id.tv_task_mem_size);/ 勾选状态CheckBox cb_se = (CheckBox) view.findViewById(R.id.cb_se);TaskInfo taskInfo = taskInfos.get(ition);iv_icon.setImageDrawable(taskInfo.icon);tv_task_name.setText(taskInfo.appName);tv_task_mem_size.s
34、etText(Formatter.formatFileSize(TaskManagerActivity.this, taskInfo.memSize);return view;.4进程管理之 ListView 的条目点击事件当进程信息显示出来后,在点击当前条目时右边按钮会显示被选中的状态,反之亦然。首先,要实现ListView 的条目点击事件,在点击事件中进行处理。需定义一个初始化的方法 initListener( ),在该方法中定义 ListView 的点击事件,代码如下所示。17Overrideprotected void onCreate(Bundle savedIns
35、tane) / TODO Auto-generated method stubsuper.onCreate(savedInstane);initView();initData();/ListView 的条目点击事件initListener(); 9.private void initListener() mListView.setOnItemClickListener(new OnItemClickListener() Overridepublic void onItemClick(AdapterView parent, View view,ition, long id) / 实际上此处返回的
36、 itemAtition 就是 ListView 适配器中 getItem()的返回值,/ 因此,需要在 ListView 中将当前点击集合中ition 的元素返回。Object itemAtition = mListView.getItemAtition(ition);if (itemAtition != null) TaskInfo taskInfo = (TaskInfo) itemAtition;/ 如果当前对象已经勾选。点击之后。变成没有勾选/ 如果没有勾选。点击之后变成已经勾选if (taskInfo.checked) taskInfo.checked = false; else
37、1.此时,需要在 ListView 适配器的 getView( )方法中设置右边 CheckBox 的选中状态,并在 getItem( )方法中返回当前被点击的 TaskInfo对象,修改后的代码如下所示。运行程序,效果图如图 7-7 所示,按钮能够正常响应点击事件。18OverridepublikInfo getItem(ition) TaskInfo info = taskInfos.get(ition);return info; 5.Overridepublic View getView(ition, View convertView, ViewGroup parent) / TODO
38、Auto-generated method stubView view = View.inflate(TaskManagerActivity.this,R.layout.item_task_manager, null);/ 图标ImageView iv_icon = (ImageView) view.findViewById(R.id.iv_icon);/ app 名字TextView tv_task_name = (TextView) view.findViewById(R.id.tv_task_name);/ 占用内存大小TextView tv_task_mem_size = (TextV
39、iew) view.findViewById(R.id.tv_task_mem_size);/ 勾选状态CheckBox cb_se = (CheckBox) view.findViewById(R.id.cb_se);TaskInfo taskInfo = taskInfos.get(ition);iv_icon.setImageDrawable(taskInfo.icon);tv_task_name.setText(taskInfo.appName);tv_task_mem_size.setText(Formatter.formatFileSize(TaskManagerActivity.
40、this, taskInfo.memSize);/ 设置 CheckBox 按钮的选中状态cb_se.setChecked(taskInfo.checked);return view;28.25.taskInfo.checked = true;26./ 刷新界面adater.notifyDataSetChanged();29.30.31.);32.图 7-7ListView 条目点击的按钮状态7.3.5进程管理界面 ListView 优化与管理界面类似,需要将中用户进程和系统进程分开进行显示,这就需要在获取手机中进程信息的时候就需要进行一些必要的标记操作,然后在界面初始化获取所有进程信息时,根
41、据这个标记将用户进程和系统进程分成两个集合。首先,在工具类 TaskInfoParser.java 中需要对应用程序 TaskInfo 进行标记,判断用户程序还是系统程序,代码如下所示。然后,在 TaskManagerActivity.java 的初始化数据时,区分开用户程序和系统程序,并在适配器中进行不同的展示,这方面的实现类似于 管理界面中 ListView 的不同布局功能的实现,增加了头标题信息,用于标示当前的进程属于用户还是系统。此时初始化数据的代码和适配器的代码如下所示。19privaist taskInfos;private void initData() new Thread()
42、 public void run() / 获取到所有的进程taskInfos = TaskInfoParser.getTaskInfos(TaskManagerActivity.this);userList = new ArrayList();systemList = new ArrayList();/ 一份为二for (TaskInfo info : taskInfos) flags = packageInfo.applicationInfo.flags;if (flags & ApplicationInfo.FLAG_SYSTEM) != 0) taskInfo.isUserTask =
43、false; else taskInfo.isUserTask = true; 6.20if (info.isUserTask) userList.add(info); else systemList.add(info);15.16.Message msg = Message.obtain();msg.what = 0;handler.sendMessage(msg); 20.;21.start();22.private TaskManagerAdater adater;/定义 Handle 接收初始化数据的信息,数据获取完毕后就进行展示private Handler handler = ne
44、w Handler() public void handleMessage(android.os.Message msg) switch (msg.what) case 0:System.out.prln(进程个数- + taskInfos.size();adater = new TaskManagerAdater();mListView.setAdapter(adater);break;33.34.;35.;private class TaskManagerAdater extends BaseAdapter private ViewHolder holder;Overridepublicg
45、etCount() return userList.size() + 1 + systemList.size() + 1;41.OverridepublikInfo getItem(ition) if (ition = 0 |ition = userList.size() + 1) return null;46.TaskInfo info;if (ition userList.size() + 1) info = userList.get(ition - 1); else location =ition - 1 - userList.size() - 1;info = systemList.g
46、et(location);53.54.return info;2155.Overridepublic long getItemId(ition) returnition;59.OverridepublicgetItemViewType(ition) if (ition = 0 |ition = userList.size() + 1) return 0; else return 1;66.67.OverridepublicgetViewTypeCount() return 2;71.Overridepublic View getView(ition, View convertView, Vie
47、wGroup parent) type = getItemViewType(ition);switch (type) case 0:TextView textView = new TextView(TaskManagerActivity.this);/ 在 android 系统里面所有通过代码去设置大小的地方全部都是像素textView.setPadding(5, 5, 5, 5);textView.setBackgroundColor(ColRAY);textView.setTextColor(Color.WHITE);if (ition = 0) textView.setText(用户进程
48、( + userList.size() + ); else textView.setText(系统进程( + systemList.size() + );86.return textView;case 1:if (convertView = null) convertView = View.inflate(TaskManagerActivity.this,R.layout.item_task_manager, null);holder = new ViewHolder();/ 图标holder.iv_icon = (ImageView) convertView.findViewById(R.i
49、d.iv_icon);/ app 名字holder.tv_task_name = (TextView) convertView第 216 行初始化数据,使用工具类 TaskInfoParser 获取到所有的进程信息,然后遍历数据集合,根据封装 TaskInfo 中的 isUserTask 属性区分开用户程序还是系统程序。第 1719 行获取 Message 信息,向 Handle 发送消息。第 2535 行创建 Handle 对象,收到子线程发送的消息后进行数据展示。第 36119 行是进程管理界面的适配器 TaskManagerAdater 代码,其中第 4355 行代码用于根据不同的iti
50、on 返回不同的条目布局填充数据。第 6167 行代码用于返回当前 ListView 中根据 ition 定义的两个不同条目布局类型。第 73119 行代码是 getView( )方法,在该方法中根据不同的布局类型,在 ListView 中显示不同的数据。第 120126 代码定义了 ViewHolder,用于保存当前布局中 View 对象。数据适配器中的代码修改好之后,运行程序,效果图如图 7-8 所示。22.findViewById(R.id.tv_task_name);/ 占用内存大小holder.tv_task_mem_size = (TextView) convertView.fin
51、dViewById(R.id.tv_task_mem_size);/ 勾选状态holder.cb_se = (CheckBox) convertView.findViewById(R.id.cb_se);convertView.setTag(holder); else holder = (ViewHolder) convertView.getTag();108.TaskInfo taskInfo = getItem(ition);holder.iv_icon.setImageDrawable(taskInfo.icon);holder.tv_task_name.setText(taskInfo
52、.appName);holder.tv_task_mem_size.setText(Formatter.formatFileSize(TaskManagerActivity.this, taskInfo.memSize);holder.cb_se.setChecked(taskInfo.checked);break;116.117.return convertView;118.119./定义 ViewHoldersic class ViewHolder ImageView iv_icon;TextView tv_task_name;TextView tv_task_mem_size;Check
53、Box cb_se;126.图 7-8进程的时候不可能将当前进程管理界面的优化考虑到卫士的进程掉。因此,就需要当前的手机卫士进程的按钮给隐藏掉,这个代码需要在适配器的 getView 方法中进行设置。添加的代码如下所示。修改代码之后,运行程序,效果图如图 7-9 所示,当前进程的按钮已被隐藏。图 7-9隐藏当前卫士进程的按钮23/ 通过包名进行判断。如果是自己的 app。那么把当前的选择框隐藏if (taskInfo.apkPackageName.equals(getPackageName() holder.cb_se.setVisibility(View.INVISIBLE); else h
54、older.cb_se.setVisibility(View.VISIBLE); 6.7.4进程管理之进程7.4.1全选与反选界面 UI前面已经中的所有进程显示出来,下面要开始进行进程的操作,这里需要在界面的下边添加两个按钮,即全选和反选。首先,布局需要进行修改,需要注意的是,要在之前的帧布局中添加一个否则当前添加的按钮显示不了,将会被挤出去。对应的代码如文件【】所示。【文件 7-8】 res/layout/activity_task_manager.xmlandroid:layout_weight=1,24 9.ProgressBarandroid:id=+id/pbandroid:layo
55、ut_width=wrap_contentandroid:layout_height=wrap_content其中,dg_button_cancel_selected.xml 是全选和反选按钮的背景选择器,对应的代码如文件【7-9】所示。【文件 7-9】 Res/drawable/dg_button_cancel_selected.xml7.4.2全选与反选之按钮状态为了更好的观察当前所有的进程是否被全选或者反选的效果图,这里将之前用于隐藏当前进程的代码注释掉。首先,实现布局中全选按钮的点击事件,同时需要注意,避免将当前的需要进行判断,具体的代码如下所示。卫士进程选中,251./* 全部选择*
56、 param view4.*/android:layout_gravity=centerandroid:indeterminateDrawable=drawable/progress_mediumandroid:visibility=invisible /运行程序,效果图如图 7-10 所示。图 7-10进程管理之全选按钮的实现接着,实现反选按钮的点击事件,具体的代码如下所示。26public void allSelect(View view) / 迭代用户集合for (TaskInfo info : userList) / 判断当前用户集合的表名是否等于自己的包名if (info.apkPa
57、ckageName.equals(getPackageName() continue;11.12.info.checked = true;13.for (TaskInfo info : systemList) info.checked = true;16./用于适配器的刷新adater.notifyDataSetChanged();19.图 7-11 进程管理之反选按钮的实现卫士进程不会被用户点击选中,仅仅隐藏按钮是不可以的,这里需要在另外,为了让当前的ListView 的点击事件中进行相应的处理,修改的代码如下所示。27mListView.setOnItemClickListener(new
58、 OnItemClickListener() Overridepublic void onItemClick(AdapterView parent, View view,ition, long id) Object itemAtition = mListView.getItemAtition(ition);if (itemAtition != null) TaskInfo taskInfo = (TaskInfo) itemAtition;/ 让用户点击当前卫士的事件为无效if (taskInfo.apkPackageName.equals(getPackageName() return;11
59、./ 如果当前对象已经勾选。点击之后。变成没有勾选/ 如果没有勾选。点击之后变成已经勾选if (taskInfo.checked) taskInfo.checked = false; else taskInfo.checked = true;18./ 刷新界面adater.notifyDataSetChanged();21.22.23.);图 7-12 进程管理之点击当前进程后按钮未选中效果7.4.3进程管理之进程(1)按钮的界面 UI这里,在进程管理头标题的右侧定义进程的按钮,当点击该按钮时将界面中被选中的进程。首先,需要修改进程管理界面布局文件中头标题部分的代码,具体如下所示。其中,cle
60、an_selected.xml 是进程按钮的背景选择器,具体的代码如文件【7-13】所示。【文件 7-10】res/drawable/clean_selected.xml28 7.运行程序,效果图。图 7-13进程管理之进程按钮的点击效果(2)按钮的功能实现接下来,需要实现按钮的点击事件,添加的代码如下所示。291./*2.*进程3.*4.* param view5.*/public void killPros(View view) ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);/为了防止造成
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年四川省邛崃市高二历史上册期末考试真题附参考答案(突破训练)
- 湖北省武汉市水果湖高级中学高三数学第9单元同步练习题及答案
- 企业领导力与变革管理培训考核试卷及答案
- 2026年北京市交通安全教育测试卷及答案
- 2026秋小学人教版数学六年级上册《分数应用题》(单位的具体量 vs 不带单位的分率)易错题专项练习及答案
- 销售代表客户沟通技巧与成交策略工作手册(标准版)
- 物流配送人员培训教材
- 宜春市重点中学2026-2027学年八年级物理第一学期期末综合测试试题含解析
- 2026年河南省新乡市长垣县六年级数学第一学期期末统考试题含解析
- 河北省邯郸市武安市2026-2027学年八年级物理第一学期期末质量检测模拟试题含解析
- 2026年研学导师岗位培训考试试题(附答案)
- 26新五年级上册语文第一次月考检测卷1-2单元
- 第一单元《健康生活 单元小结》课件
- 细胞治疗产品审批监管趋势与市场准入报告
- 国聘招聘笔试测评题库
- 新生儿颅脑超声诊断专家共识(2026版)
- 劲性钢骨梁柱施工方案
- 2026全球及中国柠檬行业消费趋势与需求规模预测报告
- 《碳中和导论》课件-第四章 储能技术与绿色燃料
- 雨课堂学堂在线学堂云《人工智能时代的创新思维(北京理工)》单元测试考核答案
- 烈士纪念日缅怀先烈-不负英魂主题班会课件高中主题班会课件
评论
0/150
提交评论