Tasks and Back Stack

地址:https://developer.android.com/guide/components/tasks-and-back-stack.html html

一個任務就是一個activity的集合,activity都被安排在一個棧裏,按activity的打開順序。android

設備home界面是大部分任務啓動的地方。當用戶觸摸應用的啓動圖標或是快捷方式,應用的任務就會來到前臺,若是不存在這個應用的任務,就會建立新的任務,這個應用的mainactivity將做爲棧的根activity打開。ide

噹噹前的activity啓動了另外一個,新的activity就會被放到棧的頂部,並得到焦點。而以前的activity則遺留在棧中,可是是暫停狀態。當一個activtiy是暫停的,系統會保留當前用戶接口的狀態。當用戶按了回退鍵,當前activity就會從棧的頂部移除,前一個activity就會恢復。當全部的activity都從棧中移除後,棧就再也不存在。ui

當用戶啓動一個新的任務或是跳轉到home界面,以前的任務就會移到後臺。在後臺的時候,任務重全部的activity都是暫停的,任務的回退棧會完整保留。spa

多個任務都會保存在後臺,可是若是用戶運行了不少任務,系統可能會銷燬後臺的activity來恢復內存 。這會致使activity 的狀態丟失。component

全部的activity均可以被實例化屢次,甚至是從其餘任務。htm

當系統暫停你的activity,系統若是須要內存可能會徹底銷燬activtiy。當這發生的時候,activity 的狀態信息將會消失。爲了不丟失用戶的操做,你須要實現onSaveInstanceState()方法保留他。接口

若是你想要啓動一個activity在新的任務中,或是要啓動一個activity,想從原來已存在的activity中獲取,或是用戶離開任務時,除了rootactivity,其餘全部activity都被清除。內存

要實現這些能夠給activity設置屬性和flagsci

<activity>主要有:

taskAffinity、launchMode、allowTaskReparenting、clearTaskOnLaunch、alwaysRetainTaskState、finishOnTaskLaunch

主要的intent flags有:

FKAG_ACTIVITY_NEW_TASK  FKAG_ACTIVITY_CLEAR_TOP  FKAG_ACTIVITY_SINGLE_TOP  

區別activity如何關聯任務可使用<activity>的launchMode元素能夠定義的類型有4種

standard(默認類型):默認,系統會建立一個新的activity實例。activity能夠被實例化屢次,每一個實例能夠屬於很少的任務,一個任務能夠有多個實例。

singleTop:若是當前任務的頂部存在這個activity實例,那麼系統跳轉到這個實力並調用onNewIntent()方法。不然就會建立一個新的activity實例。activity能夠實例化屢次,每一個activity能夠屬於不一樣的任務,一個任務也能夠有多個實例。

singleTask:系統建立一個新的任務,而且實力化這個activity做爲新的任務的根activity。然而若是activity實例存在於一個不一樣的任務中,系統會跳轉到這個已存在實例,調用onNewIntent()方法,而不是建立一個新的方法,只有一個activity實例能夠建立。經過activity啓動了一個新的任務,返回的時候仍是到上一個activity。

singleInstance:和singleTask同樣,這個activity老是他的任務重的惟一一個,他啓動的其餘activity都是在不一樣任務重。若是你啓動的一個activity指定了singleTask模式,若是在後臺任務重存在這個activity實例,那麼這整個任務都會移到前臺,

用launchMode指定的activity行爲能夠被flags覆蓋。

FLAG_ACTIVITY_NEW_TASK:啓動一個activity在一個新的任務中,若是一個任務已經運行了這個activity,那麼將會把他從後臺移到前臺,activity會接收到onNewIntent()方法。這與singleTask很像。

FLAG_ACTIVITY_SINGLE_TOP:若是啓動的activity就是當前的activity,將會調用onNewIntent()。不然就會建立一個新的activity,與singleTop很像。

FLAG_ACTIVITY_CLEAR_TOP:若是要啓動的activity已經在當前的任務中運行了,不須要啓動一個新的activity實例,只要恢復這個activity實例,並把他以前的activity都銷燬。FLAG_ACTIVITY_CLEAR_TOP常常與FLAG_ACTIVITY_NEW_TASK配合。

affinity是activity屬於任務的標誌。

應用中全部的activity都有本身的affinity標誌。默認一個應用中全部的activity都是屬於一個任務。然而,你能夠修改一個activity的affinity.不一樣應用的activity能夠共享一個affinity,或是同一個應用的activity能夠分配不一樣的任務affinities。

你能夠經過<activity>的taskAffinity屬性修改affinity。

taskAffinity是一個字符串,默認是包名。

affinity在兩種狀況下有用:

一、當啓動一個activity使用FLAG_ACTIVITY_NEW_TASK標誌,

啓動一個activity默認都是在同一個任務中,若是帶有FLAG_ACTIVITY_NEW_TASK標誌,系統會在不一樣的任務中查找這個acitivity。一般都是新的任務,若是某個有一樣affinity的任務存在那麼將會在這兒任務中啓動activity。若是沒有,就會啓動一個新的任務。

二、當一個activity的allowTaskReparenting屬性爲true

用於配製是否容許activity能夠更換從屬的task,一般和taskAffinity一塊兒使用,表示可否從啓動的task移動到taskAffinity指定的任務。

相關文章
相關標籤/搜索