默認行爲
1. 當Activity A啓動Activity B, A stopped, 系統保存A狀態。當Back pressed, 則A resumed 並恢復相關狀態。
2. 當Home button pressed, 則當前activity stopped, task 進如background,系統保存每一個task的狀態。當用戶啓動了以前開始task的app,則此task進入前臺,而且恢復task棧頂的Activity。
3. 當用戶點擊Back, 則當前Activity會被彈出task stack 而且被destroy,系統也再也不retain其狀態。
4. Activities可被實例化屢次,甚至時從其餘tasks。app
當Activity stopped, 系統會默認保存其狀態。當也仍是建議使用回調函數保存Activity的狀態,以防止系統在內存不存進行內存回收,銷燬掉進入後臺的task。這種狀況下,當系統再次進入該task時,系統仍然具備task鏈,可是在將task棧頂的Activity進行顯示時,將會是從新create,而不是resume。因此應主動使用回調函數 onSaveInstanceState() 來保存Activity State。函數
Principal < activity > attributsspa
taskAffinity launchMode allowTaskReparenting clearTaskOnLaunch alwaysRetainTaskState finishOnTaskLaunch
Principal intent flags:3d
FLAG_ACTIVITY_NEW_TASK FLAG_ACTIVITY_CLEAR_TOP FLAG_ACTIVITY_SINGLE_TOP
當用A啓動B時,A指定了啓動B的Flag,而B也在Manifest中指定了不一樣task。此種狀況下,在Intent中的指定Flags將覆蓋掉Manifest指定的task。rest
此外,有些launchmode 在flag中有,但在Manifest中沒有,一樣,在Manifest中有,flag中有。code
指定activity的launchMode屬性:blog
|standard|singleTop|singleTask|singleInstance| |--- | | | | |默認的,可被實例化屢次,可分屬不一樣task,也可在同一task| 當要啓動的Activity 存在棧頂,在該模式下,系統將把啓動該Activity的Intent經過調用onNewIntent()方法將路由至棧頂的Activity實例,再也不啓動的新的實例。若是要啓動的Activity的實例再也不棧頂,則啓動新的實例。注意:該種模式下,back button沒法返回調用onNewIntent以前的狀態,由於task back stack仍是保持原樣。|建立新的task,實例化Activity到task的棧底。但若時此時現有task stack中已經有該Activity的實例,那麼系統就不會啓動新的task和實例,而是路由到該task中的Activity,並銷燬task stack中在這之上的Activity,使之成爲棧頂,而後將該Intent經過onNewIntent路由到Activity。 同一時刻,Activity只有一個實例。|相似於singleTask,Activity只有一個實例,而且也會時task的爲一個棧元素,它啓動的任何Activity都將會出如今其餘的task棧中。
Android Browser就是一個使用singleTask模式的應用。
此外,對於back stack,不論Activity時被啓動到一個新的task仍是在啓動它的Activity所在task stack,back button均可以返回到上一個Activity。
另外,對於啓動使用singleTask模式的Activity,那麼系統首先按照它自己模式啓動,以後會將該Activity所在的task stack總體遷移到啓動它的back stack。如圖所示:
ip
在startActivity可指定的flag包括:
內存
FLAG_ACTIVITY_NEW_TASK | FLAG_ACTIVITY_SINGLE_TOP | FLAG_ACTIVITY_CLEAR_TOP |
---|---|---|
與singTask屬性相同 | 與singleTop相同 | 若是要啓動的Activity已經存在task棧中,那麼系統將會clear掉在Activity元素到task 棧頂的全部Activity,而後將Intent經過onNewIntent()傳遞給已經在棧頂的Activity。該flag一般和FLAG_ACTIVITY_NEW_TASK一塊兒使用。 |
affinity 屬性暗示了Activity更傾向加入的task。默認,同一個Application裏的Activity更傾向於在同一個task裏。可經過修改activity元素的taskAffinity屬性。該屬性的值時一個字符串,默認的爲包名,所以,若是但願傾向於啓動在不一樣的task,那麼指定以個不一樣於包名的字符串便可。ci
使用Affinity的兩種狀況
- 使用FLAG_ACTIVITY_NEW_TASK
當A啓動B時,若指定了FLAG_ACTIVITY_NEW_TASK,那麼系統首先尋找傾向的task來裝載這個新的B。若是存在與B具備相同Affinity的task,則將其啓動到該task,不然啓動新的task。好比InCallScreen,當用戶按Home離開該Activity,該如何回到該Activity,除了在launch裏啓動以外(若是launchMode爲main的話),還能夠在notification bar中顯示。
- activity元素的屬性allowTaskReparenting 爲true,
意思就是本Appliancation中的Activity A 具備其餘Application裏的Activity B相同的affinity。那麼在A中啓動B時,B將隸屬於A的task,那麼在B所屬的Application啓動後,B將從A所屬的task中經過Reparenting到B所屬的Application應用。
若用戶離開task 很長時間,系統將會清理task,只留下task stack的root activti。當用戶重返task,只會restore root Activtiy。但幾個Activity能夠修改這樣的行爲