Android編程實(shí)現(xiàn)任務(wù)管理器的方法
本文實(shí)例講述了Android編程實(shí)現(xiàn)任務(wù)管理器的方法。分享給大家供大家參考,具體如下:
任務(wù)管理器可以實(shí)現(xiàn)的功能有:
1.查看當(dāng)前系統(tǒng)下運(yùn)行的所有的進(jìn)程
2.可以查看每個(gè)進(jìn)程的進(jìn)程號(hào)、版本號(hào)以及內(nèi)存占用情況
3.殺死進(jìn)程(可以殺死全部進(jìn)程或者殺死指定的進(jìn)程)
4.查看系統(tǒng)剩余內(nèi)存
效果圖:
殺死全部進(jìn)程
實(shí)現(xiàn)思路:
ActivityManager類(lèi)可以獲取到當(dāng)前系統(tǒng)的所有進(jìn)程,以及每個(gè)進(jìn)程的信息,也可以殺死某個(gè)進(jìn)程,
ActivityManager.getRunningAppProcesses(); 獲取系統(tǒng)的所有進(jìn)程
ActivityManager.getProcessMemoryInfo(pids); 根據(jù)進(jìn)程號(hào)獲取每個(gè)進(jìn)程的內(nèi)存占用情況
ActivityManager.restartPackage(processName) ; 根據(jù)進(jìn)程的包名殺死某個(gè)進(jìn)程
PackageManager可以根據(jù)包名獲取程序的圖標(biāo)、版本號(hào)、名字、權(quán)限、簽名
核心代碼:
/* * 獲取所有進(jìn)程及用戶(hù) 的進(jìn)程 */ protected void initData() { runningAppProcessInfos =ActivityManager.getRunningAppProcesses(); //獲取所有的進(jìn)程 userRunningAppProcessInfos = new ArrayList<ActivityManager.RunningAppProcessInfo>();//獲取用戶(hù)的進(jìn)程 for(int i = 0; i< runningAppProcessInfos.size();i++){ if("system".equals(runningAppProcessInfos.get(i).processName) ||"android.process.media".equals(runningAppProcessInfos.get(i).processName) ||"android.process.acore".equals(runningAppProcessInfos.get(i).processName) ){ continue; } userRunningAppProcessInfos.add(runningAppProcessInfos.get(i)); } }
注:殺死全部進(jìn)程實(shí)際上殺死的是用戶(hù)的所有進(jìn)程,系統(tǒng)進(jìn)程是無(wú)法殺死的,所以這里要獲取到用戶(hù)的所有的進(jìn)程。
/* * 獲取某個(gè)進(jìn)程占用的內(nèi)存信息 */ ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); int[] pids = {userRunningAppProcessInfos.get(position).pid}; android.os.Debug.MemoryInfo[] memoryInfos = am.getProcessMemoryInfo(pids); int memorysize = memoryInfos[0].getTotalPrivateDirty(); tv_app_memory.setText("內(nèi)存占用為 "+ memorysize +" KB");
public class TaskInfo { Context context ; PackageManager pm ; public TaskInfo(Context context) { this.context = context; pm = context.getPackageManager(); } /* * 根據(jù)包名 查詢(xún) 圖標(biāo) */ public Drawable getAppIcon(String packname){ try { ApplicationInfo info = pm.getApplicationInfo(packname, 0); return info.loadIcon(pm); } catch (NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } /* *獲取程序的版本號(hào) */ public String getAppVersion(String packname){ try { PackageInfo packinfo = pm.getPackageInfo(packname, 0); return packinfo.versionName; } catch (NameNotFoundException e) { e.printStackTrace(); return null; } } /* * 獲取程序的名字 */ public String getAppName(String packname){ try { ApplicationInfo info = pm.getApplicationInfo(packname, 0); return info.loadLabel(pm).toString(); } catch (NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); return null; } } /* * 獲取程序的權(quán)限 */ public String[] getAppPremission(String packname){ try { PackageInfo packinfo = pm.getPackageInfo(packname, PackageManager.GET_PERMISSIONS); //獲取到所有的權(quán)限 return packinfo.requestedPermissions; } catch (NameNotFoundException e) { e.printStackTrace(); return null; } } /* * 獲取程序的簽名 */ public String getAppSignature(String packname){ try { PackageInfo packinfo = pm.getPackageInfo(packname, PackageManager.GET_SIGNATURES); //獲取到所有的權(quán)限 return packinfo.signatures[0].toCharsString(); } catch (NameNotFoundException e) { e.printStackTrace(); return null; } } }
/* * 殺死所有進(jìn)程 */ private void killAll() { for (int i = 0 ; i< userRunningAppProcessInfos.size();i++){ System.out.println(userRunningAppProcessInfos.get(i).processName); activitymanager.restartPackage(userRunningAppProcessInfos.get(i).processName); } // 更新顯示的界面 pd.show(); new Thread(){ @Override public void run() { initData(); Message msg = new Message(); msg.what = GET_RUNNING_APP_FINISH; hander.sendMessage(msg); } }.start(); } /* * 殺死選擇的進(jìn)程 */ private void killSelected() { for (int i=0 ;i < isselected.size(); i++){ if(isselected.get(i)){ //如果用戶(hù)也選中則返回true //終止一個(gè)activity 需要用到 activitymanager activitymanager.restartPackage(userRunningAppProcessInfos.get(i).processName); } } //更新listview的顯示 pd.show(); new Thread(){ @Override public void run() { initData(); Message msg = new Message(); msg.what = GET_RUNNING_APP_FINISH; hander.sendMessage(msg); } }.start(); }
/* * 獲取系統(tǒng)的剩余內(nèi)存 */ ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); MemoryInfo outInfo = new ActivityManager.MemoryInfo(); am.getMemoryInfo(outInfo); long availMemorySize = outInfo.availMem; String strMemorySize = availMemorySize/1024/1024 + "MB";
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
相關(guān)文章
Android中DrawerLayout+ViewPager滑動(dòng)沖突的解決方法
這篇文章主要為大家詳細(xì)介紹了Android中DrawerLayout+ViewPager滑動(dòng)沖突的解決方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-06-06Android中BroadcastReceiver(異步接收廣播Intent)的使用
Broadcast Receiver是Android的五大組件之一,使用頻率也很高,用于異步接收廣播Intent,本文將詳細(xì)介紹,需要的朋友可以參考下2012-12-12Android webview用法實(shí)例簡(jiǎn)析
這篇文章主要介紹了Android webview用法,結(jié)合實(shí)例形式簡(jiǎn)單分析了Android中webview的功能、用法與相關(guān)注意事項(xiàng),需要的朋友可以參考下2016-01-01Android 實(shí)現(xiàn)視頻字幕Subtitle和橫豎屏切換示例
下面小編就為大家分享一篇Android 實(shí)現(xiàn)視頻字幕Subtitle和橫豎屏切換示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-01-01Android開(kāi)發(fā)手機(jī)無(wú)線調(diào)試的方法
今天小編就為大家分享一篇關(guān)于Android開(kāi)發(fā)手機(jī)無(wú)線調(diào)試的方法,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12一步步教你寫(xiě)Slack的Loading動(dòng)畫(huà)
這篇文章主要為大家詳細(xì)手摸手教你寫(xiě)Slack的Loading動(dòng)畫(huà),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09Android SDK Manager解決更新時(shí)的問(wèn)題 :Failed to fetch URL...
本文主要介紹解決安裝使用SDK Manager更新時(shí)的問(wèn)題:Failed to fetch URL...,這里提供了詳細(xì)的資料及解決問(wèn)題辦法,有需要的小伙伴可以參考下2016-09-09關(guān)于Android SDCard存儲(chǔ)的問(wèn)題
本篇文章小編為大家介紹,關(guān)于Android SDCard存儲(chǔ)的問(wèn)題。需要的朋友參考下2013-04-04android中Webview實(shí)現(xiàn)截屏三種方式小結(jié)
本篇文章主要介紹了android Webview實(shí)現(xiàn)截屏,主要詳解了3種方式,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03