Android开发——查询/杀死手机里正在运行的进程
?0. 前言
以前有同學(xué)好像做過一個(gè)叫“自習(xí)君”的App,開啟后自動(dòng)檢測(cè)用戶這一天的自習(xí)時(shí)間,在學(xué)校里宣傳廣告還打了不少。其實(shí)實(shí)現(xiàn)原理非常簡單,在SQlite數(shù)據(jù)庫(也可以通過文件)先預(yù)置眾多應(yīng)用的PackageName,比如QQ,微信等等,然后開啟一個(gè)線程,不間斷的獲取到手機(jī)里的所有進(jìn)程信息,如果檢測(cè)到其中有processInfo.processName和預(yù)置的某個(gè)應(yīng)用的PackageName相同,那么就認(rèn)定為用戶沒有在“認(rèn)真學(xué)習(xí)”,最后通過網(wǎng)絡(luò)把數(shù)據(jù)上傳到服務(wù)器,加上基于好友功能的“學(xué)霸時(shí)間”排行榜,最后集成社會(huì)化SDK的分享功能,這個(gè)App就完成了。
(PS:其實(shí)很多功能從技術(shù)角度來看,真的很簡單。做應(yīng)用還得看創(chuàng)意點(diǎn),從這個(gè)角度來看的話,有些產(chǎn)品經(jīng)理做的事情,并不是一個(gè)開發(fā)者那么容易就可以替代的。(*^__^*) ?)
最后吐槽一下上面的應(yīng)用,因?yàn)樗囟ㄊ呛碾姷?#xff0c;檢測(cè)進(jìn)程的子進(jìn)程必定是頻繁進(jìn)行的(至少是一秒檢測(cè)一次),不過用這個(gè)應(yīng)用的學(xué)霸估計(jì)也不怎么玩手機(jī),所以那點(diǎn)耗電估計(jì)也不會(huì)被在意吧。⊙﹏⊙‖∣
廢話不多說,介紹本文的主要內(nèi)容。本文原創(chuàng),轉(zhuǎn)載請(qǐng)注明出處:Android開發(fā)——查詢/殺死手機(jī)里正在運(yùn)行的進(jìn)程_SEU_Calvin的博客-CSDN博客
1.?獲取手機(jī)里的所有進(jìn)程信息
以前寫過一個(gè)ProcessInfoProviderUtil工具類,拿出來分享一個(gè)。通過Context.ACTIVITY_SERVICE和PagerManager不僅可以獲取上面APP所需的進(jìn)程名(也是PackageName),判斷此進(jìn)程是否為系統(tǒng)進(jìn)程,還可以獲取到該進(jìn)程所占用的內(nèi)存大小,應(yīng)用名稱以及應(yīng)用圖標(biāo)。代碼如下。其中ProcessInfo為自定義的業(yè)務(wù)類,成員變量即為要獲取的信息,加上set/get方法即可。
/*** For Info of Process* Created by Calvin on 2016/4/24.*/ public class ProcessInfoProviderUtil {public static List<ProcessInfo> getProcessInfos(Context context){//創(chuàng)造要返回的集合List<ProcessInfo> list = new ArrayList<ProcessInfo>();PackageManager pm = (PackageManager)context.getPackageManager();//拿到手機(jī)里的所有進(jìn)程信息ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = am.getRunningAppProcesses();for(ActivityManager.RunningAppProcessInfo processInfo : runningAppProcesses) {//要添加的對(duì)象ProcessInfo info = new ProcessInfo();//包名即為進(jìn)程名字String packageName = processInfo.processName;info.setPackageName(packageName);//以進(jìn)程號(hào)為參數(shù),獲得進(jìn)程的信息(內(nèi)存占用的大小)//使用時(shí)通過Formatter.formatFileSize(this,SystemProcessUitl.getAvaMemory(this))轉(zhuǎn)換為MB即可Debug.MemoryInfo[] processMemoryInfo = am.getProcessMemoryInfo(new int[]{processInfo.pid});long totalPrivateDirty = processMemoryInfo[0].getTotalPrivateDirty()*1024l;info.setSize(totalPrivateDirty);//應(yīng)用名字和圖標(biāo)ApplicationInfo applicationInfo = null;try {applicationInfo = pm.getApplicationInfo(packageName, 0);String name = applicationInfo.loadLabel(pm).toString();info.setName(name);Drawable icon = applicationInfo.loadIcon(pm);info.setIcon(icon);if ( (applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM)== 0 ){//用戶進(jìn)程info.setUesrProcess(true);}else {//系統(tǒng)進(jìn)程info.setUesrProcess(false);}} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}if(info.getName()!=null) {list.add(info);}}return list;} }2.?殺死指定的進(jìn)程
殺死進(jìn)程很簡單。其實(shí)就是調(diào)用ActivityManager的killBackgroundProcesses方法,這里我做了一個(gè)優(yōu)化,即監(jiān)聽鎖屏廣播,在服務(wù)里創(chuàng)建內(nèi)部廣播接收者,鎖屏后即循環(huán)殺死所有的進(jìn)程。實(shí)現(xiàn)代碼如下。當(dāng)然,系統(tǒng)進(jìn)程是不會(huì)被殺死的。這樣就做到了一點(diǎn)省電優(yōu)化。當(dāng)然,自己需要的,即便是鎖屏也想保持運(yùn)行的后臺(tái)進(jìn)程,可以自定義一個(gè)集合維護(hù)需要被保護(hù)的進(jìn)程,殺死之前自行判斷即可。
/*** Service used to kill all user process when lock the phone* Created by user on 2016/4/26.*/ public class AutoCleanService extends Service {private ScreenOffReceiver screenOffReceiver;private ActivityManager am;@Nullable@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onCreate() {am =(ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);screenOffReceiver = new ScreenOffReceiver();registerReceiver(screenOffReceiver,new IntentFilter(Intent.ACTION_SCREEN_OFF));super.onCreate();}@Overridepublic void onDestroy() {unregisterReceiver(screenOffReceiver);screenOffReceiver = null;super.onDestroy();}private class ScreenOffReceiver extends BroadcastReceiver{@Overridepublic void onReceive(Context context, Intent intent) {List<ActivityManager.RunningAppProcessInfo> runningAppProcesses = am.getRunningAppProcesses();for (ActivityManager.RunningAppProcessInfo info : runningAppProcesses){//進(jìn)程名字 即為包名String processName = info.processName;//殺掉可以殺的am.killBackgroundProcesses(processName);}}} }總結(jié)
以上是生活随笔為你收集整理的Android开发——查询/杀死手机里正在运行的进程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 22.纯 CSS 创作出美丽的彩虹条纹文
- 下一篇: 好记心不如烂笔头,ssh登录 The a