手机卫士09_应用程序四种查看_ListView小标题_进程管理
1.懸浮窗體的功能實(shí)現(xiàn):
1.1.應(yīng)用程序的卸載: 包安裝器 packageInstall,包卸載packageruninstall
intent.setData(Uri.pare(“package:”?+ 應(yīng)用程序包名))
卸載完之后記得更新list集合,更新適配器.
但是不確定用戶是否點(diǎn)了卸載,所以要通過(guò)廣播獲取消息.
并且需要通過(guò)代碼注冊(cè),因?yàn)檫@個(gè)廣播只在應(yīng)用管理生效.
要記得addDataSchme(“package”)
接收完廣播之后,更新了集合適配器,要記得關(guān)閉廣播
?
異常:ConcurrentModificationException,并發(fā)訪問(wèn)異常錯(cuò)誤
因?yàn)槭褂迷鰪?qiáng)for循環(huán)去刪除集合中的元素,所以會(huì)出并發(fā)修改異常.
額外:系統(tǒng)應(yīng)用是不允許卸載的,所以遍歷用戶應(yīng)用集合就可以了.
?
1.2.應(yīng)用程序的開啟:本質(zhì)是打開這個(gè)應(yīng)用的入口activity.
當(dāng)一個(gè)activity的清單文件中,意圖過(guò)濾器有
<action ?android:name=”android.intent.action.MAIN”/>
<action ?android:name=”android.intent.category.LANUCHER”/>
//找關(guān)系,得到特性.
packageManager pm中
Intent intent = pm.getLanuchIntentForPackage(包名)//如果對(duì)應(yīng)的應(yīng)用程序activity配置了上面的屬性,就返回這個(gè)前門activity,如果沒(méi)有activity配置這個(gè)屬性,就返回為null;
?
1.3.應(yīng)用程序的分享功能:打開系統(tǒng)的短信,給好友發(fā)送信息(或者QQ,微信,微博之類)
市面上一些即時(shí)通訊,或者社交類的應(yīng)用程序,都重寫了分享的action,如果是按發(fā)短信的方式分享,這些程序都會(huì)被列出來(lái).
短信應(yīng)用中,發(fā)短信的activity,ComposeMessageActivity,根據(jù)下面意圖過(guò)濾器的類型,可以發(fā)送不同的信息.有圖片,視頻,文字.
設(shè)置完intent的屬性,把要發(fā)送的文本放到intent.putExtra(intent.EXTRA_TEXT,.......);
?
1.4.應(yīng)用程序的信息功能:實(shí)際上是打開系統(tǒng)的應(yīng)用程序信息界面
在setting的系統(tǒng)源碼中配置清單的InstalledAppDetails
如果不知道怎么寫意圖信息,就找一個(gè)類型的軟件,打開它這個(gè)功能,會(huì)在日志中出現(xiàn).
Intent intent = new Intent(“android.setting.APPLICATION_DETATLS_SETTINGS”);
Intent.addCategory(intent.Category.DEFAULT)//設(shè)置默認(rèn)的Category
intent.setData(Uri.parse(“package:”?+ 包名));
?
2.進(jìn)程管理
2.1 ui界面標(biāo)題參考布局
?
ActivityManager am 進(jìn)程管理器
①通過(guò)進(jìn)程管理器 獲取當(dāng)前正在運(yùn)行的進(jìn)程.
am.getRunningAppProcesses()//返回當(dāng)前運(yùn)行的 APP集合
②獲取可用的內(nèi)存空間
am.getMemoryInfo(MemoryInfo outinfo)//對(duì)參數(shù)保存內(nèi)存信息概要,
outinfo.avaiMem(系統(tǒng)可用內(nèi)存空間).tatalMem(系統(tǒng)全部的內(nèi)存空間)
可用內(nèi)存返回是Long類型,需要轉(zhuǎn)換成mb形式formatter
③創(chuàng)建一個(gè)新的信息獲取類(獲取信息的放在engine包下):ProcessInfoProvider
獲取所有進(jìn)程信息的數(shù)據(jù).(需要一個(gè)實(shí)體類保存信息)
參考方法名getRunningProcessInfos();
實(shí)體類名:ProcessInfo
需要保存的信息:應(yīng)用程序名label,圖標(biāo)icon,內(nèi)存占用大小,應(yīng)用程序包名packageName.
區(qū)分是否是用戶和系統(tǒng)進(jìn)程(判斷是用戶程序還是系統(tǒng)程序即可);
//通過(guò)am得到正在運(yùn)行應(yīng)用程序的集合.
getRunningAppProcesses();//返回正在運(yùn)行的應(yīng)用程序的集合,
每一個(gè)對(duì)象info
info.importance //進(jìn)程的優(yōu)先級(jí)
Info.pid //進(jìn)程id,進(jìn)程的唯一標(biāo)識(shí)
info.processName //進(jìn)程名,實(shí)際上就是應(yīng)用程序的包名
//其它信息就跟前面獲取軟件信息應(yīng)用,拿到包名>>拿到包信息>>拿到想要的信息
PackageManager pm
pm.getPackageInfo(包名,0(附加可選標(biāo)記))//返回一個(gè)包信息Packageinfo packinfo
Packinfo.applicationInfo.xxxx//對(duì)應(yīng)的信息.
am.getProcessMemory(int[]{})//通過(guò)一個(gè)保存多個(gè)進(jìn)程pid返回對(duì)應(yīng)多個(gè)進(jìn)程信息.
返回的進(jìn)程信息.getTotalPrivateDirty()//返回的是kb,要*1024轉(zhuǎn)換成byte方便計(jì)算.
?
最后把每個(gè)封裝對(duì)象放到List集合中,返回給調(diào)用者.
安卓系統(tǒng)中的進(jìn)程有的不是app應(yīng)用,像system,多媒體,內(nèi)核應(yīng)用,音頻播放框架應(yīng)用并不是由純java編寫的,還有c的構(gòu)成,所以它們可能并沒(méi)有apk的名字.
//在通過(guò)getPakcagerInfo獲取包信息的時(shí)候,如果是這些進(jìn)程就會(huì)出異常,根據(jù)這一點(diǎn)在Catch代碼塊中,給它設(shè)置一個(gè)名稱(packname)和默認(rèn)圖片.
item條目參考ui
?
④其它類似應(yīng)用程序管理器,拆分小集合,增加提醒小條目.holder優(yōu)化,復(fù)用convert對(duì)象等.
?
3 帶勾選框ListView的處理
?
List中如果有Button,Check這一類搶焦點(diǎn)的控件,會(huì)把焦點(diǎn)從條目上搶走,這樣會(huì)導(dǎo)致ListView的條目點(diǎn)擊事件效果失效,一般在開發(fā)中把這些搶焦點(diǎn)的控件CLickable = “false”,focusable=”false”
不可被點(diǎn)擊,也不會(huì)獲取到焦點(diǎn)
給進(jìn)程應(yīng)用對(duì)象封裝類增加一個(gè)checkbox的布爾變量,用來(lái)判斷是否被選中了(也可以保存在一個(gè)集合中,但是用戶會(huì)希望這些被勾選的應(yīng)用,再以后也能被默認(rèn)勾選,所以封裝起來(lái)比較方便)
?
在ListView的點(diǎn)擊事件中,lv.getItemPosition(position);//得到被點(diǎn)擊的條目對(duì)象.
//返回的對(duì)象為null
因?yàn)樽远x適配器時(shí),getItem()方法返回為null,所以獲取的值也為null
所以可以在這個(gè)方法里返回被點(diǎn)擊的對(duì)象.
?
在點(diǎn)擊事件中,獲取到這個(gè)對(duì)象,同時(shí)獲取到CheckBox對(duì)象,點(diǎn)擊之后就設(shè)置對(duì)應(yīng)的參數(shù).
但是會(huì)出現(xiàn)復(fù)用歷史緩存的bug,在這里就需要在holder里增加一個(gè)checkbox變量,在適配器返回view的時(shí)候,對(duì)這個(gè) checkBox進(jìn)行賦值.
?
4,進(jìn)程管理的進(jìn)程清理
點(diǎn)擊按鈕之后清理進(jìn)程.
①循環(huán)遍歷集合,判斷進(jìn)程是否被選中.
②通過(guò)進(jìn)程管理器 ActivityManager.killBackgroundProcesses(包名);
//清理完之后需要刷新界面,重新獲取數(shù)據(jù)
③需要權(quán)限:KILL_BACKGROUND_PROCES
?
5,進(jìn)程管理的細(xì)節(jié)
①全選和反選:
全選:遍歷集合.全部設(shè)置為true,通知數(shù)據(jù)適配器更新數(shù)據(jù)
反選:遍歷集合,全部設(shè)置為原來(lái)的狀態(tài)取反,然后更新數(shù)據(jù).
?
額外:無(wú)法清除的進(jìn)程,系統(tǒng)進(jìn)程,系統(tǒng)ui進(jìn)程,前臺(tái)進(jìn)程,killBackgroundProcess是清理后臺(tái)進(jìn)程.
在開發(fā)者看來(lái)能理解,但是用戶不能理解.
②一鍵清理的清理效果,
只要全部清理,就把所有進(jìn)程在界面的顯示給清理掉(傻逼用戶)(市面上360的欺騙效果是比較好的,它甚至?xí)袛嗄阕罱那謇頃r(shí)間,如果太近的話,就直接提示為空)
一鍵清理完后,把用戶勾選的條目給移除掉(保存在一個(gè)集合Kill中,方便最后Toast中顯示)
?
Toast:清理了kill.size()個(gè)進(jìn)程,釋放了Kill中元素占用內(nèi)存相加之和.
更改標(biāo)題,運(yùn)行中進(jìn)程和內(nèi)存數(shù)量?jī)蓚€(gè)參數(shù).可以通過(guò)兩個(gè)成員變量去保存它們
然后把這兩個(gè)參數(shù)與上面移除集合中的數(shù)據(jù)相減即可(減去進(jìn)程數(shù)和占用內(nèi)存總數(shù)).
?
從界面上移除條目,遍歷kill集合,判斷是屬于哪個(gè)集合的,就從哪個(gè)集合去移除它,然后更新適配器.
額外:按常理來(lái)說(shuō),清理進(jìn)程不應(yīng)該清除自身應(yīng)用的進(jìn)程.
判斷如果返回的View為自身應(yīng)用的時(shí)候(根據(jù)包名判斷),就隱藏checkBox勾選框.
點(diǎn)擊事件里,也要做判斷,如果符合就直接終止,return掉事件.全選,反選也是一樣,跳過(guò)特殊選項(xiàng).
?
wanandroid.com //安卓知識(shí)點(diǎn)總結(jié)
?
posted on 2016-06-18 22:58 抓根寶 閱讀(...) 評(píng)論(...) 編輯 收藏轉(zhuǎn)載于:https://www.cnblogs.com/adventurer/p/5597115.html
總結(jié)
以上是生活随笔為你收集整理的手机卫士09_应用程序四种查看_ListView小标题_进程管理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: HTTPS与MITM
- 下一篇: 为什么toString方法可以用来区分数