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