Android中TASK和PROCESS的區別,擷取最近啟動並執行程式和正在啟動並執行進程

來源:互聯網
上載者:User

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 />}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.