編輯:關於Android編程
task是一個從用戶角度出發的概念,它是一些activity的組合,它們組合起來是為了讓用戶完成某一件工作(或者說操作)。
task內的activity們以棧的形式組織起來,也就是back stack了。棧內的activity不會重新排序,只能push或者pop。棧內的activity可以來自不同的app,因此可以是運行在不同的進程,但是它們都屬於同一個task內。
安卓系統是實時多task系統,用戶可以隨意在多個task之間切換。當一個task的棧內所有activity都pop之後,task也就銷毀了。有時系統為了回收內存,會銷毀activity,但是task不會銷毀。
activity在manifest中有launchMode選項,可以配置其啟動的模式。標准模式下,允許一個activity同時存在多個實例,既可以在同一個task,也可以在不同task。manifest可以指定launchMode,intent可以指定intent flag,前者供被啟動者使用,後者供啟動者使用,同時使用時後者會覆蓋前者。
onNewIntent()
而不創建新實例,其他情況都和standard一致主要測試的是singleTask這一屬性,其他的文檔描述都比較清楚,也不容易產生誤解。兩組實驗,不設置taskAffinity和設置taskAffinity時,singleTask的行為。對比兩者“最近任務”,dumpsys,logcat,返回導航的差異。
不設置taskAffinity,MainActivity -> SingleTaskFirstActivity -> SimpleActivity -> SingleTaskSecondActivity -> 選擇圖片Intent,再一路返回。
最近任務內只能看到一個TaskDemo的任務,dumpsys的結果如下:
所有的activity均在同一個task內,驗證了老羅的結論。另外注意標紅的兩處,它們的ProcessRecord對象不同,ImageGallery和SingleTaskActivity處於不同的進程,也驗證了前文所述“可以運行在不同的進程”。
logcat日志如下:
一路返回依次回到SingleTaskSecondActivity, SimpleActivity, SingleTaskFirstActivity,MainActivity, 桌面。
設置SingleTaskFirstActivity的taskAffinity為單獨的值,MainActivity -> SingleTaskFirstActivity。
通過最近任務可以看到,有了兩個TaskDemo的任務。而dumpsys結果如下:
可以看到,MainActivity和SingleTaskFirstActivity運行在了兩個不同的task裡面(棧底為MainActivity的t225, 棧底為SingleTaskFirstActivity的t226),但是他們仍屬於同一進程。
我們接著啟動SimpleActivity,再通過最近任務切換回t225,並且也啟動SimpleActivity,這時通過dumpsys結果如下:
SimpleActivity同時存在兩個實例,他們的hashCode是不同的,目前處於resumed狀態的是在t225中的實例。
而通過查看logcat:
我們同樣發現SimpleActivity被創建了兩個實例。
此時我們通過最近任務切換回t226,並在此啟動SingleTaskSecondActivity,查看dumpsys,然後再切換回t225也啟動SingleTaskSecondActivity,查看dumpsys和logcat:
我們可以看到盡管第一次啟動SingleTaskSecondActivity是在t226,但是SingleTaskSecondActivity實例卻運行在t225中,為什麼呢?因為SingleTaskSecondActivity並沒有設置taskAffinity屬性,所以它和MainActivity將會運行在同一個task中!和老羅的分析一致。而第二次啟動時,並未創建新的SingleTaskSecondActivity實例,而是調用了它的onNewIntent方法,和文檔描述一致。
現在我們測試一下返回導航,依次按下返回鍵,觀察每次回到的activity,以及每次dumpsys的結果,以及logcat的結果:
第一次回到了t225的SimpleActivity,dumpsys:
第二次回到了t225的MainActivity,dumpsys:
第三次回到了t226的SimpleActivity,dumpsys:
第四次回到了t226的SingleTaskFirstActivity,dumpsys:
最後一次返回就回到了桌面。
logcat日志如下:
從上面的返回路徑來看,確實驗證了developer文檔上關於back stack“拼接”的情況的描述,即:並不是按照most recent first的順序返回的,而是優先把一個task的back stack(t225) pop完畢之後,再pop下一個task的back stack(t226)。
基於測試2的版本,MainActivity -> SingleTaskFirstActivity -> SimpleActivity,再切換回MainActivity,再啟動SingleTaskFirstActivity。
查看最近任務,仍然有兩個task,但是查看dumpsys以及logcat:
我們可以看到,第一次啟動的SimpleActivity就被pop(destroy)了,從而把未在棧頂的SingleTaskFirstActivity提到了棧頂。這也驗證了back stack內的activity不會重新排序,最會pop和push的事實。
只要搞清楚了launchMode中容易產生誤解的地方,對於intent flag來說,只需要記住一點即可:intent flag可以覆蓋launchMode的設置。為了避免內容過於冗長,本文就不對intent flag進行詳細的測試分析了。
本文實例講述了Android編程中TextView寬度過大導致Drawable無法居中問題解決方法。分享給大家供大家參考,具體如下:在做項目的時候,很多時候我們都要用到文
從5.0版本開始,微信只支持用手機號開通賬號,那麼問題來了,如果換了手機號,原來的微信是不是也作廢了?裡面的好友怎麼辦?還有我們的零錢啊!!不用著急,換號不
MVP(Model View Presenter)的設計模式是從MVC中演化而來的,主要作用是能夠:劃分模塊職責,降低模塊耦合易測試,提高代碼復用Model:數據:負責數
一.概述代理模式也是平時比較常用的設計模式之一,代理模式其實就是提供了一個新的對象,實現了對真實對象的操作,或成為真實對象的替身.在日常生活中也是很常見的.例如A要租房,