版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、第 7 天衛(wèi)士第 7 章 進程管理模塊27.1模塊概述27.1.1 功能介紹2進程管理之獲取內(nèi)存和進程數(shù)..5界面 UI3進程信息的實體類4工具類之獲取系統(tǒng)信息5工具類之獲取進程信息8主邏輯代碼107.3進程管理之進程展示..47.3.5界面 UI12進程管理之 ListView 的 Item 布局13進程管理之 ListView 的數(shù)據(jù)適配器15進程管理之 ListView 的條目點擊事件17進程管理界面 ListView 優(yōu)化197.4進程24進程管理之..4全選與反
2、選界面 UI24全選與反選之按鈕狀態(tài)25進程管理之進程28頭標題中進程數(shù)的更新307.5進程管理之抽屜界面33界面 UI33抽屜動畫36進程管理之抽屜界面功能實現(xiàn)3.37.6.4顯示系統(tǒng)進程選項的狀態(tài)更新39顯示系統(tǒng)進程選項的功能實現(xiàn)40選項的狀態(tài)更新41選項的功能實現(xiàn)42鎖屏自動鎖屏自動7.7 本章小結(jié)441第 7 章 進程管理模塊了解進程管理模塊功能掌握如何獲取中的進程掌握如何結(jié)束正在運行的進程大家都知道,大部分 Android用的時間越長就會變得越慢甚至卡頓,哪怕是 2G 的運行內(nèi)存,用的時間長了也會變得奇慢無比。通常情況下,造成這種情況的原因有兩種,一
3、種是緩存過多,一種是開啟的進程過多。在第 6 章中已經(jīng)針對緩存進行了講解,本章將針對進程管理進行詳細講解,以解決運行速度過慢問題。7.1模塊概述7.1.1功能介紹進程管理模塊主要用于查看當前開啟多少進程服務,其中包含用戶進程個數(shù)和系統(tǒng)進程個數(shù),可以選擇某個進程,也可以選擇所有進程,同時還可以設(shè)置是否顯示系統(tǒng)進程以及鎖屏時是否進程,該模塊界面效果如圖 7-1 所示。圖 7-1進程管理界面27.2進程管理之獲取內(nèi)存和進程數(shù)7.2.1界面 UI進程管理模塊界面 TaskManagerActivity,可以看出它的界面跟管理的界面有很多相似之處,如下圖 7-2 中的兩張圖所示,進程管理界面只是比方的兩
4、個按鈕和一個抽屜功能。管理界面多了上方右上角一個進程的按鈕,加上下這里,首先實現(xiàn)上方獲取進程和內(nèi)存信息的功能,將管理的界面布局的代碼直接拿過來。圖 7-2進程管理界面和管理界面之間的比較圖 7-2 進程管理界面上方用于顯示進程數(shù)和內(nèi)存的布局代碼如文件【7-1】所示?!疚募?7-1】 activity_prosmanager.xml3 工具類之獲取系統(tǒng)信息在主界面邏輯代碼中,使用了 TaskUtils 工具類,該類主要用于獲取系統(tǒng)信息,它有 5 個方法,分別是獲取總內(nèi)存大小、獲取可用的內(nèi)存信息、正在運行的進程數(shù)量、總的進程數(shù)和低版本下的總內(nèi)存大小,具體代碼如【文件 7-3】所示?!?/p>
5、文件 7-3】 TaskUtils.java51. public class TaskUtils 2./* 獲取正在運行的進程的個數(shù)* param context5.*/public sic getRunningProsCount(Context context) / 獲取到進程管理器ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);/ 獲取所有正在運行的進程集合List appProses = am.getRunningAppProses();/ 正在運行的進程的
6、個數(shù)return appProses.size();14.15./*16.* 獲取總共有多少個進程17.*/public sicgetRunningTotalCount(Context context) / 獲取總共有多少個進程PackageManagackageManager = context.getPackageManager();List installedPackages = packageManager14./*15.* 占用內(nèi)存大小16.*/17.public long memSize;18./* 判斷是否是用戶進程* true 表示用戶進程* false 表示系統(tǒng)進程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./* 獲取到剩余內(nèi)存* param context766.* return67.*/public sic long getAvailMem(Context context) ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);MemoryInfo outInfo = new MemoryInfo();/ 獲取到內(nèi)存的基本信息am.get
11、MemoryInfo(outInfo);/ 獲取到可用內(nèi)存(剩余內(nèi)存)return outInfo.availMem;76.77./* 獲取到總共有多少內(nèi)存* 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.* 獲取到低版本總共有多少內(nèi)存99.*/private sic long getLowTotalMem() /總共的內(nèi)存/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 行代碼用于獲取進程管理器,然后得到所有正在運行的進程數(shù),一個包管理器PackageManager,通過包管理器獲取正在運行的程序。第 1014 行代碼用于獲取包管理器 PackageManager,通過包管理器獲取上所有的安裝包。第 15 行代碼創(chuàng)建了一個 List進程集合,用于進程對象。第 1646 行代碼用于循環(huán)遍歷所有正在運行的進程,并獲取程序包名、占用內(nèi)存大小、程序圖標、程序名稱,最后將進程信息封裝到 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;/ 獲取到進程內(nèi)存的基本信息MemoryInfo memoryInfo = am.getProsMemoryInf prosInf
19、o.);/ Dirty 弄臟 表示占用了多少內(nèi)存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主邏輯代碼上面已經(jīng)將對應的工具類定義好, 下面開始獲取中的進程數(shù)和內(nèi)存信息, 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);/ 進程數(shù)pdv_task_c
23、ount = (ProgressDesView) findViewById(R.id.pdv_task_count);/ 運行內(nèi)存pdv_ram = (ProgressDesView) findViewById(R.id.pdv_ram);/ 初始化進程個數(shù)initTaskCount();/ 初始化內(nèi)存initMem();23.24./初始化數(shù)據(jù),獲取到所有的進程詳細信息,用于在主界面中進行展示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(進程個數(shù)- + taskInfos.size();break;43.44.;45.;46./*47
25、.* 初始化內(nèi)存48.*/private void initMem() / 獲取到剩余內(nèi)存long availMem = TaskUtils.getAvailMem(this);/ 獲取總共的內(nèi)存long totalMem = TaskUtils.getTotalMem(this);/ 使用的內(nèi)存long userMem = totalMem - availMem;pdv_ram.setTitle(內(nèi)存);/ 設(shè)置占用的內(nèi)存pdv_ram.setTvLeft(占用內(nèi)存 + Formatter.formatFileSize(this, userMem);/ 設(shè)置可用內(nèi)存pdv_ram.setTv
26、Right(可用內(nèi)存 + Formatter.formatFileSize(this, availMem);/ 設(shè)置進度條pdv_ram.setProgress() (userMem * 100f / totalMem);63.64./*65.* 初始化進程個數(shù)66.*/private void initTaskCount() / 獲取正在運行的進程個數(shù)runningProsCount = TaskUtils.getRunningProsCount(this);/ 總共的進程個數(shù)runningTotalCount = TaskUtils.getRunningTotalCount(this);/
27、 設(shè)置標題pdv_task_count.setTitle(進程:);/ 設(shè)置進程個數(shù)pdv_task_count.setTvLeft(正在運行 + runningProsCount + 個);/ 設(shè)置總共有多少個進程pdv_task_count.setTvRight(總共進程 + runningTotalCount + 個);/ 設(shè)置進度上面的代碼書寫好之后,運行程序,效果圖如圖 7-4 所示。圖 7-4頭標題中內(nèi)存和進程信息7.3進程管理之進程展示7.3.1界面 UI前面已經(jīng)將中所有正在運行的進程信息已經(jīng)獲取到了,下面開始在進程管理界面進行展示,與管理界面類似,也需要使用 ListView
28、進行數(shù)據(jù)展示。首先,修改進程管理界面之前的布局文件,代碼修改為如下所示。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 用于展示程序占用內(nèi)存大小,CheckBox 控件用于選中當前程序。并且 CheckBox 控件還使用了背景選擇器,具體如【文件 7-7】所示?!疚募?7-7】 res/drawable/green_checkbox_selector.xml7.3.3進程管理之 ListView 的數(shù)據(jù)適配器當數(shù)據(jù)獲取完之后,需要將當前的數(shù)據(jù)在當前的進程管理界面進行展示,需要寫出 ListView 的數(shù)據(jù)適配器,具體的代碼如下所示。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=占用內(nèi)存大小and
31、roid:textSize=16sp /運行程序,效果圖如圖 7-6 所示。圖 7-6進程管理界面在圖 7-6 的進程界面中,點擊當前 ListView 的條目時發(fā)現(xiàn)右邊的 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);/ 占用內(nèi)存大小TextView tv_task_mem_size = (TextView) view.findViewById(R.id.tv_task_mem_size);/ 勾選狀態(tài)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 的條目點擊事件當進程信息顯示出來后,在點擊當前條目時右邊按鈕會顯示被選中的狀態(tài),反之亦然。首先,要實現(xiàn)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;/ 如果當前對象已經(jīng)勾選。點擊之后。變成沒有勾選/ 如果沒有勾選。點擊之后變成已經(jīng)勾選if (taskInfo.checked) taskInfo.checked = false; else
37、1.此時,需要在 ListView 適配器的 getView( )方法中設(shè)置右邊 CheckBox 的選中狀態(tài),并在 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);/ 占用內(nèi)存大小TextView tv_task_mem_size = (TextV
39、iew) view.findViewById(R.id.tv_task_mem_size);/ 勾選狀態(tài)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);/ 設(shè)置 CheckBox 按鈕的選中狀態(tài)cb_se.setChecked(taskInfo.checked);return view;28.25.taskInfo.checked = true;26./ 刷新界面adater.notifyDataSetChanged();29.30.31.);32.圖 7-7ListView 條目點擊的按鈕狀態(tài)7.3.5進程管理界面 ListView 優(yōu)化與管理界面類似,需要將中用戶進程和系統(tǒng)進程分開進行顯示,這就需要在獲取手機中進程信息的時候就需要進行一些必要的標記操作,然后在界面初始化獲取所有進程信息時,根
41、據(jù)這個標記將用戶進程和系統(tǒng)進程分成兩個集合。首先,在工具類 TaskInfoParser.java 中需要對應用程序 TaskInfo 進行標記,判斷用戶程序還是系統(tǒng)程序,代碼如下所示。然后,在 TaskManagerActivity.java 的初始化數(shù)據(jù)時,區(qū)分開用戶程序和系統(tǒng)程序,并在適配器中進行不同的展示,這方面的實現(xiàn)類似于 管理界面中 ListView 的不同布局功能的實現(xiàn),增加了頭標題信息,用于標示當前的進程屬于用戶還是系統(tǒng)。此時初始化數(shù)據(jù)的代碼和適配器的代碼如下所示。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 接收初始化數(shù)據(jù)的信息,數(shù)據(jù)獲取完畢后就進行展示private Handler handler = ne
44、w Handler() public void handleMessage(android.os.Message msg) switch (msg.what) case 0:System.out.prln(進程個數(shù)- + 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 系統(tǒng)里面所有通過代碼去設(shè)置大小的地方全部都是像素textView.setPadding(5, 5, 5, 5);textView.setBackgroundColor(ColRAY);textView.setTextColor(Color.WHITE);if (ition = 0) textView.setText(用戶進程
48、( + userList.size() + ); else textView.setText(系統(tǒng)進程( + 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 行初始化數(shù)據(jù),使用工具類 TaskInfoParser 獲取到所有的進程信息,然后遍歷數(shù)據(jù)集合,根據(jù)封裝 TaskInfo 中的 isUserTask 屬性區(qū)分開用戶程序還是系統(tǒng)程序。第 1719 行獲取 Message 信息,向 Handle 發(fā)送消息。第 2535 行創(chuàng)建 Handle 對象,收到子線程發(fā)送的消息后進行數(shù)據(jù)展示。第 36119 行是進程管理界面的適配器 TaskManagerAdater 代碼,其中第 4355 行代碼用于根據(jù)不同的iti
50、on 返回不同的條目布局填充數(shù)據(jù)。第 6167 行代碼用于返回當前 ListView 中根據(jù) ition 定義的兩個不同條目布局類型。第 73119 行代碼是 getView( )方法,在該方法中根據(jù)不同的布局類型,在 ListView 中顯示不同的數(shù)據(jù)。第 120126 代碼定義了 ViewHolder,用于保存當前布局中 View 對象。數(shù)據(jù)適配器中的代碼修改好之后,運行程序,效果圖如圖 7-8 所示。22.findViewById(R.id.tv_task_name);/ 占用內(nèi)存大小holder.tv_task_mem_size = (TextView) convertView.fin
51、dViewById(R.id.tv_task_mem_size);/ 勾選狀態(tài)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進程的時候不可能將當前進程管理界面的優(yōu)化考慮到衛(wèi)士的進程掉。因此,就需要當前的手機衛(wèi)士進程的按鈕給隱藏掉,這個代碼需要在適配器的 getView 方法中進行設(shè)置。添加的代碼如下所示。修改代碼之后,運行程序,效果圖如圖 7-9 所示,當前進程的按鈕已被隱藏。圖 7-9隱藏當前衛(wèi)士進程的按鈕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前面已經(jīng)中的所有進程顯示出來,下面要開始進行進程的操作,這里需要在界面的下邊添加兩個按鈕,即全選和反選。首先,布局需要進行修改,需要注意的是,要在之前的幀布局中添加一個否則當前添加的按鈕顯示不了,將會被擠出去。對應的代碼如文件【】所示?!疚募?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全選與反選之按鈕狀態(tài)為了更好的觀察當前所有的進程是否被全選或者反選的效果圖,這里將之前用于隱藏當前進程的代碼注釋掉。首先,實現(xiàn)布局中全選按鈕的點擊事件,同時需要注意,避免將當前的需要進行判斷,具體的代碼如下所示。衛(wèi)士進程選中,251./* 全部選擇*
56、 param view4.*/android:layout_gravity=centerandroid:indeterminateDrawable=drawable/progress_mediumandroid:visibility=invisible /運行程序,效果圖如圖 7-10 所示。圖 7-10進程管理之全選按鈕的實現(xiàn)接著,實現(xiàn)反選按鈕的點擊事件,具體的代碼如下所示。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 進程管理之反選按鈕的實現(xiàn)衛(wèi)士進程不會被用戶點擊選中,僅僅隱藏按鈕是不可以的,這里需要在另外,為了讓當前的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;/ 讓用戶點擊當前衛(wèi)士的事件為無效if (taskInfo.apkPackageName.equals(getPackageName() return;11
59、./ 如果當前對象已經(jīng)勾選。點擊之后。變成沒有勾選/ 如果沒有勾選。點擊之后變成已經(jīng)勾選if (taskInfo.checked) taskInfo.checked = false; else taskInfo.checked = true;18./ 刷新界面adater.notifyDataSetChanged();21.22.23.);圖 7-12 進程管理之點擊當前進程后按鈕未選中效果7.4.3進程管理之進程(1)按鈕的界面 UI這里,在進程管理頭標題的右側(cè)定義進程的按鈕,當點擊該按鈕時將界面中被選中的進程。首先,需要修改進程管理界面布局文件中頭標題部分的代碼,具體如下所示。其中,cle
60、an_selected.xml 是進程按鈕的背景選擇器,具體的代碼如文件【7-13】所示?!疚募?7-10】res/drawable/clean_selected.xml28 7.運行程序,效果圖。圖 7-13進程管理之進程按鈕的點擊效果(2)按鈕的功能實現(xiàn)接下來,需要實現(xiàn)按鈕的點擊事件,添加的代碼如下所示。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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五版城市集體土地房屋買賣合同3篇
- 2025年度拆墻工程進度管理與費用結(jié)算合同4篇
- 二手房買賣合同格式(2024版)
- 二零二五版?zhèn)€人車輛租賃結(jié)算管理合同2篇
- 2024版施工圖設(shè)計服務外包協(xié)議文件版B版
- 2025年度鋁合金門窗安全性能檢測及安裝服務合同4篇
- 2025年度網(wǎng)絡游戲授權(quán)合作協(xié)議二零二五年度范本4篇
- 二零二五年教育設(shè)施建設(shè)項目承包商投資借款合同3篇
- 2025年度茶樓員工績效考核合同4篇
- 2025年度能源管理系統(tǒng)集成技術(shù)服務合同范本4篇
- 機電設(shè)備安裝施工及驗收規(guī)范
- 倉庫安全培訓考試題及答案
- 中國大百科全書(第二版全32冊)08
- 初中古詩文言文背誦內(nèi)容
- 天然氣分子篩脫水裝置吸附計算書
- 檔案管理項目 投標方案(技術(shù)方案)
- 蘇教版六年級上冊100道口算題(全冊完整版)
- 2024年大學試題(宗教學)-佛教文化筆試考試歷年典型考題及考點含含答案
- 計算機輔助設(shè)計智慧樹知到期末考試答案章節(jié)答案2024年青島城市學院
- 知識庫管理規(guī)范大全
- 電腦耗材實施方案、供貨方案、售后服務方案
評論
0/150
提交評論