黑馬教程挑戰(zhàn)年薪20w之a(chǎn)ndroid筆記day22手機(jī)安全衛(wèi)士_第1頁
黑馬教程挑戰(zhàn)年薪20w之a(chǎn)ndroid筆記day22手機(jī)安全衛(wèi)士_第2頁
黑馬教程挑戰(zhàn)年薪20w之a(chǎn)ndroid筆記day22手機(jī)安全衛(wèi)士_第3頁
黑馬教程挑戰(zhàn)年薪20w之a(chǎn)ndroid筆記day22手機(jī)安全衛(wèi)士_第4頁
黑馬教程挑戰(zhàn)年薪20w之a(chǎn)ndroid筆記day22手機(jī)安全衛(wèi)士_第5頁
已閱讀5頁,還剩39頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、第 7 天衛(wèi)士第 7 章 進(jìn)程管理模塊27.1模塊概述27.1.1 功能介紹2進(jìn)程管理之獲取內(nèi)存和進(jìn)程數(shù)..5界面 UI3進(jìn)程信息的實(shí)體類4工具類之獲取系統(tǒng)信息5工具類之獲取進(jìn)程信息8主邏輯代碼107.3進(jìn)程管理之進(jìn)程展示..47.3.5界面 UI12進(jìn)程管理之 ListView 的 Item 布局13進(jìn)程管理之 ListView 的數(shù)據(jù)適配器15進(jìn)程管理之 ListView 的條目點(diǎn)擊事件17進(jìn)程管理界面 ListView 優(yōu)化197.4進(jìn)程24進(jìn)程管理之..4全選與反

2、選界面 UI24全選與反選之按鈕狀態(tài)25進(jìn)程管理之進(jìn)程28頭標(biāo)題中進(jìn)程數(shù)的更新307.5進(jìn)程管理之抽屜界面33界面 UI33抽屜動(dòng)畫36進(jìn)程管理之抽屜界面功能實(shí)現(xiàn)3.37.6.4顯示系統(tǒng)進(jìn)程選項(xiàng)的狀態(tài)更新39顯示系統(tǒng)進(jìn)程選項(xiàng)的功能實(shí)現(xiàn)40選項(xiàng)的狀態(tài)更新41選項(xiàng)的功能實(shí)現(xiàn)42鎖屏自動(dòng)鎖屏自動(dòng)7.7 本章小結(jié)441第 7 章 進(jìn)程管理模塊了解進(jìn)程管理模塊功能掌握如何獲取中的進(jìn)程掌握如何結(jié)束正在運(yùn)行的進(jìn)程大家都知道,大部分 Android用的時(shí)間越長就會(huì)變得越慢甚至卡頓,哪怕是 2G 的運(yùn)行內(nèi)存,用的時(shí)間長了也會(huì)變得奇慢無比。通常情況下,造成這種情況的原因有兩種,一

3、種是緩存過多,一種是開啟的進(jìn)程過多。在第 6 章中已經(jīng)針對(duì)緩存進(jìn)行了講解,本章將針對(duì)進(jìn)程管理進(jìn)行詳細(xì)講解,以解決運(yùn)行速度過慢問題。7.1模塊概述7.1.1功能介紹進(jìn)程管理模塊主要用于查看當(dāng)前開啟多少進(jìn)程服務(wù),其中包含用戶進(jìn)程個(gè)數(shù)和系統(tǒng)進(jìn)程個(gè)數(shù),可以選擇某個(gè)進(jìn)程,也可以選擇所有進(jìn)程,同時(shí)還可以設(shè)置是否顯示系統(tǒng)進(jìn)程以及鎖屏?xí)r是否進(jìn)程,該模塊界面效果如圖 7-1 所示。圖 7-1進(jìn)程管理界面27.2進(jìn)程管理之獲取內(nèi)存和進(jìn)程數(shù)7.2.1界面 UI進(jìn)程管理模塊界面 TaskManagerActivity,可以看出它的界面跟管理的界面有很多相似之處,如下圖 7-2 中的兩張圖所示,進(jìn)程管理界面只是比方的兩

4、個(gè)按鈕和一個(gè)抽屜功能。管理界面多了上方右上角一個(gè)進(jìn)程的按鈕,加上下這里,首先實(shí)現(xiàn)上方獲取進(jìn)程和內(nèi)存信息的功能,將管理的界面布局的代碼直接拿過來。圖 7-2進(jìn)程管理界面和管理界面之間的比較圖 7-2 進(jìn)程管理界面上方用于顯示進(jìn)程數(shù)和內(nèi)存的布局代碼如文件【7-1】所示。【文件 7-1】 activity_prosmanager.xml3 工具類之獲取系統(tǒng)信息在主界面邏輯代碼中,使用了 TaskUtils 工具類,該類主要用于獲取系統(tǒng)信息,它有 5 個(gè)方法,分別是獲取總內(nèi)存大小、獲取可用的內(nèi)存信息、正在運(yùn)行的進(jìn)程數(shù)量、總的進(jìn)程數(shù)和低版本下的總內(nèi)存大小,具體代碼如【文件 7-3】所示。【

5、文件 7-3】 TaskUtils.java51. public class TaskUtils 2./* 獲取正在運(yùn)行的進(jìn)程的個(gè)數(shù)* param context5.*/public sic getRunningProsCount(Context context) / 獲取到進(jìn)程管理器ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);/ 獲取所有正在運(yùn)行的進(jìn)程集合List appProses = am.getRunningAppProses();/ 正在運(yùn)行的進(jìn)程的

6、個(gè)數(shù)return appProses.size();14.15./*16.* 獲取總共有多少個(gè)進(jìn)程17.*/public sicgetRunningTotalCount(Context context) / 獲取總共有多少個(gè)進(jìn)程PackageManagackageManager = context.getPackageManager();List installedPackages = packageManager14./*15.* 占用內(nèi)存大小16.*/17.public long memSize;18./* 判斷是否是用戶進(jìn)程* true 表示用戶進(jìn)程* false 表示系統(tǒng)進(jìn)程22.*/

7、23.publicisUserTask;24./*25.* 用于顯示 CheckBox 是否被選中26.*/27.publicchecked;28. 6.getInstalledPackages(0);/ 初始化 hashset/一共有多少個(gè)進(jìn)程count = 0;for (PackageInfo packageInfo : installedPackages) HashSet set = new HashSet();/ 獲取到進(jìn)程的名字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);/ 判斷當(dāng)前用戶的版本號(hào)/ 這個(gè)方法在 API16 里面才有/ 適配低版本機(jī)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工具類之獲取進(jìn)程信息在進(jìn)程管理界面中,需要獲取正在運(yùn)行的進(jìn)程,該功能代碼相對(duì)比較獨(dú)立,因此將其抽取出來作為一個(gè)單獨(dú)的工具類供其使用,具體代碼如【文件 7-11】所示?!疚募?7-4】 TaskInfoParser.java8public class TaskInfoParser private sic String prosName;pri

14、vate sikInfo taskInfo;public sic List getTaskInfos(Context context) / 獲取到進(jìn)程管理者ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);/ 獲取到所有正在運(yùn)行的進(jìn)程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();/ 獲取到正在運(yùn)行當(dāng)前進(jìn)程的對(duì)象RunningAppProsInfo prosInfo = proses.get(i);prosName = proses.get(i).prosName;taskInfo.apkPackageName = prosName;/ 不使用 PackageIn

16、fo packageInfo = installedPackages.get(i)的原因是/中所有程序并非全部都在運(yùn)行,應(yīng)使用下面這種方式/替換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 行代碼用于獲取進(jìn)程管理器,然后得到所有正在運(yùn)行的進(jìn)程數(shù),一個(gè)包管理器PackageManager,通過包管理器獲取正在運(yùn)行的程序。第 1014 行代碼用于獲取包管理器 PackageManager,通過包管理器獲取上所有的安裝包。第 15 行代碼創(chuàng)建了一個(gè) List進(jìn)程集合,用于進(jìn)程對(duì)象。第 1646 行代碼用于循環(huán)遍歷所有正在運(yùn)行的進(jìn)程,并獲取程序包名、占用內(nèi)存大小、程序圖標(biāo)、程序名稱,最后將進(jìn)程信息封裝到 TaskInfo 對(duì)象中。9PackageInfo packageInfo = packageManager.getPackageInfo(pro

18、sName, 0);/ 獲取到當(dāng)前應(yīng)用程序的圖標(biāo)Drawable icon = packageInfo.applicationInfo.loadIcon(packageManager);taskInfo.icon = icon;/ 獲取到應(yīng)用程序的名字String appName = packageInfo.applicationInfo.loadLabel(packageManager).toString();taskInfo.appName = appName;/ 獲取到進(jìn)程內(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();/ 考慮到有些應(yīng)用程序時(shí)沒有應(yīng)用圖標(biāo)/ 如果當(dāng)前應(yīng)用程序報(bào)錯(cuò)了。那么給一個(gè)默認(rèn)的taskInfo.icon = context.getResour().getDrawable(R.drawable.ic_launcher);taskInfo.appName = prosName;56.57.lists.add(taskInfo);58.59.return lists;60.61. 第 4855 行代碼當(dāng)

21、應(yīng)用程序獲取應(yīng)用圖標(biāo)失敗后,第 57 行代碼將當(dāng)前獲取的進(jìn)程信息放到集合中,自己給一個(gè)默認(rèn)的7.2.5主邏輯代碼上面已經(jīng)將對(duì)應(yīng)的工具類定義好, 下面開始獲取中的進(jìn)程數(shù)和內(nèi)存信息, TaskManagerActivity.java 中對(duì)應(yīng)的邏輯代碼如文件所示。【文件】.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);/ 進(jìn)程數(shù)pdv_task_c

23、ount = (ProgressDesView) findViewById(R.id.pdv_task_count);/ 運(yùn)行內(nèi)存pdv_ram = (ProgressDesView) findViewById(R.id.pdv_ram);/ 初始化進(jìn)程個(gè)數(shù)initTaskCount();/ 初始化內(nèi)存initMem();23.24./初始化數(shù)據(jù),獲取到所有的進(jìn)程詳細(xì)信息,用于在主界面中進(jìn)行展示private void initData() new Thread() public void run() / 獲取到所有的進(jìn)程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(進(jìn)程個(gè)數(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è)置進(jìn)度條pdv_ram.setProgress() (userMem * 100f / totalMem);63.64./*65.* 初始化進(jìn)程個(gè)數(shù)66.*/private void initTaskCount() / 獲取正在運(yùn)行的進(jìn)程個(gè)數(shù)runningProsCount = TaskUtils.getRunningProsCount(this);/ 總共的進(jìn)程個(gè)數(shù)runningTotalCount = TaskUtils.getRunningTotalCount(this);/

27、 設(shè)置標(biāo)題pdv_task_count.setTitle(進(jìn)程:);/ 設(shè)置進(jìn)程個(gè)數(shù)pdv_task_count.setTvLeft(正在運(yùn)行 + runningProsCount + 個(gè));/ 設(shè)置總共有多少個(gè)進(jìn)程pdv_task_count.setTvRight(總共進(jìn)程 + runningTotalCount + 個(gè));/ 設(shè)置進(jìn)度上面的代碼書寫好之后,運(yùn)行程序,效果圖如圖 7-4 所示。圖 7-4頭標(biāo)題中內(nèi)存和進(jìn)程信息7.3進(jìn)程管理之進(jìn)程展示7.3.1界面 UI前面已經(jīng)將中所有正在運(yùn)行的進(jìn)程信息已經(jīng)獲取到了,下面開始在進(jìn)程管理界面進(jìn)行展示,與管理界面類似,也需要使用 ListView

28、進(jìn)行數(shù)據(jù)展示。首先,修改進(jìn)程管理界面之前的布局文件,代碼修改為如下所示。12 9.!- -!圖 7-5smanager_list.xml進(jìn)程管理界面 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、控件用于展示程序圖標(biāo),第一個(gè) TextView 控件用于展示程序名稱,第二個(gè) TextView 用于展示程序占用內(nèi)存大小,CheckBox 控件用于選中當(dāng)前程序。并且 CheckBox 控件還使用了背景選擇器,具體如【文件 7-7】所示?!疚募?7-7】 res/drawable/green_checkbox_selector.xml7.3.3進(jìn)程管理之 ListView 的數(shù)據(jù)適配器當(dāng)數(shù)據(jù)獲取完之后,需要將當(dāng)前的數(shù)據(jù)在當(dāng)前的進(jìn)程管理界面進(jìn)行展示,需要寫出 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 /運(yùn)行程序,效果圖如圖 7-6 所示。圖 7-6進(jìn)程管理界面在圖 7-6 的進(jìn)程界面中,點(diǎn)擊當(dāng)前 ListView 的條目時(shí)發(fā)現(xiàn)右邊的 CheckBox 沒有被選中,只有鼠標(biāo)放在 CheckBox 上點(diǎn)擊時(shí)按鈕才會(huì)被選中,這是因?yàn)轭愃?Button 或者 CheckBox 的按鈕會(huì)搶奪當(dāng)前所在條目的焦點(diǎn)。因此,需要在 CheckBox 上增加兩條屬性,讓當(dāng)前的 CheckBox 獲取不到焦點(diǎn),處理觸摸的事件焦點(diǎn)交給 ListView 的條目,對(duì)應(yīng)修改的代碼如下所示。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);/ 圖標(biāo)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進(jìn)程管理之 ListView 的條目點(diǎn)擊事件當(dāng)進(jìn)程信息顯示出來后,在點(diǎn)擊當(dāng)前條目時(shí)右邊按鈕會(huì)顯示被選中的狀態(tài),反之亦然。首先,要實(shí)現(xiàn)ListView 的條目點(diǎn)擊事件,在點(diǎn)擊事件中進(jìn)行處理。需定義一個(gè)初始化的方法 initListener( ),在該方法中定義 ListView 的點(diǎn)擊事件,代碼如下所示。17Overrideprotected void onCreate(Bundle savedIns

35、tane) / TODO Auto-generated method stubsuper.onCreate(savedInstane);initView();initData();/ListView 的條目點(diǎn)擊事件initListener(); 9.private void initListener() mListView.setOnItemClickListener(new OnItemClickListener() Overridepublic void onItemClick(AdapterView parent, View view,ition, long id) / 實(shí)際上此處返回的

36、 itemAtition 就是 ListView 適配器中 getItem()的返回值,/ 因此,需要在 ListView 中將當(dāng)前點(diǎn)擊集合中ition 的元素返回。Object itemAtition = mListView.getItemAtition(ition);if (itemAtition != null) TaskInfo taskInfo = (TaskInfo) itemAtition;/ 如果當(dāng)前對(duì)象已經(jīng)勾選。點(diǎn)擊之后。變成沒有勾選/ 如果沒有勾選。點(diǎn)擊之后變成已經(jīng)勾選if (taskInfo.checked) taskInfo.checked = false; else

37、1.此時(shí),需要在 ListView 適配器的 getView( )方法中設(shè)置右邊 CheckBox 的選中狀態(tài),并在 getItem( )方法中返回當(dāng)前被點(diǎn)擊的 TaskInfo對(duì)象,修改后的代碼如下所示。運(yùn)行程序,效果圖如圖 7-7 所示,按鈕能夠正常響應(yīng)點(diǎn)擊事件。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);/ 圖標(biāo)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 條目點(diǎn)擊的按鈕狀態(tài)7.3.5進(jìn)程管理界面 ListView 優(yōu)化與管理界面類似,需要將中用戶進(jìn)程和系統(tǒng)進(jìn)程分開進(jìn)行顯示,這就需要在獲取手機(jī)中進(jìn)程信息的時(shí)候就需要進(jìn)行一些必要的標(biāo)記操作,然后在界面初始化獲取所有進(jìn)程信息時(shí),根

41、據(jù)這個(gè)標(biāo)記將用戶進(jìn)程和系統(tǒng)進(jìn)程分成兩個(gè)集合。首先,在工具類 TaskInfoParser.java 中需要對(duì)應(yīng)用程序 TaskInfo 進(jìn)行標(biāo)記,判斷用戶程序還是系統(tǒng)程序,代碼如下所示。然后,在 TaskManagerActivity.java 的初始化數(shù)據(jù)時(shí),區(qū)分開用戶程序和系統(tǒng)程序,并在適配器中進(jìn)行不同的展示,這方面的實(shí)現(xiàn)類似于 管理界面中 ListView 的不同布局功能的實(shí)現(xiàn),增加了頭標(biāo)題信息,用于標(biāo)示當(dāng)前的進(jìn)程屬于用戶還是系統(tǒng)。此時(shí)初始化數(shù)據(jù)的代碼和適配器的代碼如下所示。19privaist taskInfos;private void initData() new Thread()

42、 public void run() / 獲取到所有的進(jìn)程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ù)獲取完畢后就進(jìn)行展示private Handler handler = ne

44、w Handler() public void handleMessage(android.os.Message msg) switch (msg.what) case 0:System.out.prln(進(jìn)程個(gè)數(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(用戶進(jìn)程

48、( + userList.size() + ); else textView.setText(系統(tǒng)進(jìn)程( + systemList.size() + );86.return textView;case 1:if (convertView = null) convertView = View.inflate(TaskManagerActivity.this,R.layout.item_task_manager, null);holder = new ViewHolder();/ 圖標(biāo)holder.iv_icon = (ImageView) convertView.findViewById(R.i

49、d.iv_icon);/ app 名字holder.tv_task_name = (TextView) convertView第 216 行初始化數(shù)據(jù),使用工具類 TaskInfoParser 獲取到所有的進(jìn)程信息,然后遍歷數(shù)據(jù)集合,根據(jù)封裝 TaskInfo 中的 isUserTask 屬性區(qū)分開用戶程序還是系統(tǒng)程序。第 1719 行獲取 Message 信息,向 Handle 發(fā)送消息。第 2535 行創(chuàng)建 Handle 對(duì)象,收到子線程發(fā)送的消息后進(jìn)行數(shù)據(jù)展示。第 36119 行是進(jìn)程管理界面的適配器 TaskManagerAdater 代碼,其中第 4355 行代碼用于根據(jù)不同的iti

50、on 返回不同的條目布局填充數(shù)據(jù)。第 6167 行代碼用于返回當(dāng)前 ListView 中根據(jù) ition 定義的兩個(gè)不同條目布局類型。第 73119 行代碼是 getView( )方法,在該方法中根據(jù)不同的布局類型,在 ListView 中顯示不同的數(shù)據(jù)。第 120126 代碼定義了 ViewHolder,用于保存當(dāng)前布局中 View 對(duì)象。數(shù)據(jù)適配器中的代碼修改好之后,運(yùn)行程序,效果圖如圖 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進(jìn)程的時(shí)候不可能將當(dāng)前進(jìn)程管理界面的優(yōu)化考慮到衛(wèi)士的進(jìn)程掉。因此,就需要當(dāng)前的手機(jī)衛(wèi)士進(jìn)程的按鈕給隱藏掉,這個(gè)代碼需要在適配器的 getView 方法中進(jìn)行設(shè)置。添加的代碼如下所示。修改代碼之后,運(yùn)行程序,效果圖如圖 7-9 所示,當(dāng)前進(jìn)程的按鈕已被隱藏。圖 7-9隱藏當(dāng)前衛(wèi)士進(jìn)程的按鈕23/ 通過包名進(jìn)行判斷。如果是自己的 app。那么把當(dāng)前的選擇框隱藏if (taskInfo.apkPackageName.equals(getPackageName() holder.cb_se.setVisibility(View.INVISIBLE); else h

54、older.cb_se.setVisibility(View.VISIBLE); 6.7.4進(jìn)程管理之進(jìn)程7.4.1全選與反選界面 UI前面已經(jīng)中的所有進(jìn)程顯示出來,下面要開始進(jìn)行進(jìn)程的操作,這里需要在界面的下邊添加兩個(gè)按鈕,即全選和反選。首先,布局需要進(jìn)行修改,需要注意的是,要在之前的幀布局中添加一個(gè)否則當(dāng)前添加的按鈕顯示不了,將會(huì)被擠出去。對(duì)應(yī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 是全選和反選按鈕的背景選擇器,對(duì)應(yīng)的代碼如文件【7-9】所示。【文件 7-9】 Res/drawable/dg_button_cancel_selected.xml7.4.2全選與反選之按鈕狀態(tài)為了更好的觀察當(dāng)前所有的進(jìn)程是否被全選或者反選的效果圖,這里將之前用于隱藏當(dāng)前進(jìn)程的代碼注釋掉。首先,實(shí)現(xiàn)布局中全選按鈕的點(diǎn)擊事件,同時(shí)需要注意,避免將當(dāng)前的需要進(jìn)行判斷,具體的代碼如下所示。衛(wèi)士進(jìn)程選中,251./* 全部選擇*

56、 param view4.*/android:layout_gravity=centerandroid:indeterminateDrawable=drawable/progress_mediumandroid:visibility=invisible /運(yùn)行程序,效果圖如圖 7-10 所示。圖 7-10進(jìn)程管理之全選按鈕的實(shí)現(xiàn)接著,實(shí)現(xiàn)反選按鈕的點(diǎn)擊事件,具體的代碼如下所示。26public void allSelect(View view) / 迭代用戶集合for (TaskInfo info : userList) / 判斷當(dāng)前用戶集合的表名是否等于自己的包名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 進(jìn)程管理之反選按鈕的實(shí)現(xiàn)衛(wèi)士進(jìn)程不會(huì)被用戶點(diǎn)擊選中,僅僅隱藏按鈕是不可以的,這里需要在另外,為了讓當(dāng)前的ListView 的點(diǎn)擊事件中進(jìn)行相應(yīng)的處理,修改的代碼如下所示。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;/ 讓用戶點(diǎn)擊當(dāng)前衛(wèi)士的事件為無效if (taskInfo.apkPackageName.equals(getPackageName() return;11

59、./ 如果當(dāng)前對(duì)象已經(jīng)勾選。點(diǎn)擊之后。變成沒有勾選/ 如果沒有勾選。點(diǎn)擊之后變成已經(jīng)勾選if (taskInfo.checked) taskInfo.checked = false; else taskInfo.checked = true;18./ 刷新界面adater.notifyDataSetChanged();21.22.23.);圖 7-12 進(jìn)程管理之點(diǎn)擊當(dāng)前進(jìn)程后按鈕未選中效果7.4.3進(jìn)程管理之進(jìn)程(1)按鈕的界面 UI這里,在進(jìn)程管理頭標(biāo)題的右側(cè)定義進(jìn)程的按鈕,當(dāng)點(diǎn)擊該按鈕時(shí)將界面中被選中的進(jìn)程。首先,需要修改進(jìn)程管理界面布局文件中頭標(biāo)題部分的代碼,具體如下所示。其中,cle

60、an_selected.xml 是進(jìn)程按鈕的背景選擇器,具體的代碼如文件【7-13】所示?!疚募?7-10】res/drawable/clean_selected.xml28 7.運(yùn)行程序,效果圖。圖 7-13進(jìn)程管理之進(jìn)程按鈕的點(diǎn)擊效果(2)按鈕的功能實(shí)現(xiàn)接下來,需要實(shí)現(xiàn)按鈕的點(diǎn)擊事件,添加的代碼如下所示。291./*2.*進(jìn)程3.*4.* param view5.*/public void killPros(View view) ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE);/為了防止造成

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論