Android中關於任務和進程的概念有點混淆,網上看到一篇說得很好的文章,摘過來記錄一下~~~
http://bbs.sjtu.edu.cn/bbstcon,board,MobilePhone,reid,1288709685,file,M.1288709685.A.html
我的個人理解:
首先你看到的不是進程(process),是任務(Task)。
用終端,輸ps,可以看到真正的運行中的linux process,我的milestone上一般會有90
多個。
Android裡,app和process和task是三個完全不同的概念……
process是一個繼承自Linux的概念,一般一個app會有一個uid,需要時會獨立地開一個p
rocess。有些process是作為app的容器的,其它process是底層linux用到的。同時,雖
然很少見,也會有多個app共用一個process或者uid。
task是一個activity的棧,其中"可能"含有來自多個App的activity,也就是來自多個p
rocess,殺task一般是關閉Task的根activity引出的子樹,不一定會連帶kill掉對應的
process。
所以這三個東西是會混在一起的,沒有windows或者其它os中那麼清晰的進程邊界。
API中,關於獲得運行中的那些東西,有一個類ActivityManager,它可以:
getRecentTasks() 最近開的task,HOME鍵長按會看到這個
getRunningAppProcesses() 運行中的作為app容器的process。
getRunningServices() 運行中的後台服務
getRunningTasks() 運行中的任務
所以即使在API中,這些東西也不統一。
如果一個activity A不是作為task的root activity而是被別的task調用,那麼A對應的p
rocess是開著的,這時是否顯示它呢?
另外,如果一個app只有service開著而沒有Activity或者task,算不算開著呢?
加上不同的killer可能會有不同的對系統關鍵進程或者關鍵服務的過濾方式,這可能也
會增加一定程度的混亂。
說到底,android裡原本就沒有別的os中那麼清晰的任務概念,這些概念都是那些程式自
己定義出來的,所以比較混亂……
擷取最近啟動並執行程式列表:
public void getTaskList() {<br />ImageButton ivIcon;<br />ActivityManager am = (ActivityManager)getSystemService(ACTIVITY_SERVICE);<br />PackageManager pm = this.getPackageManager();<br />try {<br />List<RecentTaskInfo> list = am.getRecentTasks(64, 0);<br />llTaskBar.removeAllViews();<br />for (RecentTaskInfo ti : list) {<br />Intent intent = ti.baseIntent;<br />ResolveInfo resolveInfo = pm.resolveActivity(intent, 0);<br />if (resolveInfo != null) {<br />ivIcon = new ImageButton(this);<br />ivIcon.setImageDrawable(resolveInfo.loadIcon(pm));<br />ivIcon.setFocusable(true);<br />ivIcon.setClickable(true);<br />ivIcon.setEnabled(true);</p><p>ivIcon.setScaleType(ScaleType.CENTER);</p><p>ivIcon.setLayoutParams(new LinearLayout.LayoutParams(120, 120));<br />llTaskBar.addView(ivIcon);<br />}<br />}<br />} catch (SecurityException se) {<br />se.printStackTrace();<br />}<br />}
擷取正在啟動並執行進程列表:
public void getRunningProcessList() {<br />ImageButton ivIcon;<br />ActivityManager am = (ActivityManager)getSystemService(ACTIVITY_SERVICE);<br />List<ActivityManager.RunningAppProcessInfo> list = am.getRunningAppProcesses();<br />PackageManager pm = this.getApplicationContext().getPackageManager();<br />llTaskBar.removeAllViews();<br />for (ActivityManager.RunningAppProcessInfo pi : list) {<br />if (pm.getLaunchIntentForPackage(pi.processName) != null) {<br />try {<br />ApplicationInfo ai = pm.getApplicationInfo(pi.processName,<br />PackageManager.GET_META_DATA);<br />if (ai != null) {<br />ivIcon = new ImageButton(this);<br />ivIcon.setImageDrawable(ai.loadIcon(pm));<br />ivIcon.setFocusable(true);<br />ivIcon.setClickable(true);<br />ivIcon.setEnabled(true);</p><p>ivIcon.setScaleType(ScaleType.CENTER);</p><p>ivIcon.setLayoutParams(new LinearLayout.LayoutParams(120, 120));<br />llTaskBar.addView(ivIcon);<br />}<br />} catch (NameNotFoundException e) {<br />e.printStackTrace();<br />}<br />}<br />}<br />}