Android Activity launchMode研究,androidlaunchmode

來源:互聯網
上載者:User

Android Activity launchMode研究,androidlaunchmode

Android Activity launchMode研究Activity的Launch mode一共有四種:standard, singleTop, singleTask, singleInstance, 預設情況下是standard.  四種啟動模式分為兩組Activity的這四種啟動模式可以分為兩組:standard和singleTop是一組, 這兩種模式標記的activity可以有多個執行個體(被初始化多次), 這些執行個體可以屬於任何task, 並且可以被放在activity stack中的任何位置. 通常情況下,這兩種模式標記的activity會被啟動到調用startActivity()的那個task裡, 除非Intent對象包含了FLAG_ACTIVITY_NEW_TASK這個標記, 則會啟動一個新的task.singleTask和singleInstance是另一組, 這兩種模式的activity只能開始一個task, 它們永遠在activity stack的根部, 而且裝置在一個時間內只能持有一個activity的執行個體, 也即只有一個這樣的task.  launchMode說明standard預設模式.每次有一個新的Intent對象來啟動standard activity時, 這個activity的一個新的執行個體就會被建立,來處理這個intent,也即每一個activity執行個體處理一個intent.singleTop與standard模式類似,一個新的singleTop的activity的執行個體也可能被建立,來處理一個新的intent.但是,如果目標task中已經有一個這個singleTop的activity的執行個體,並且它是在棧頂,則這個已經存在的執行個體將接受這個新的intent( onNewIntent() 方法被調用), 新的執行個體不會被建立. 其他的情況,比如,存在執行個體在目標task,但是不在棧頂;或者它在一個棧頂,卻不在目標task,則新的執行個體都會被建立,並且放在棧頂, 這時候的行為和standard一樣.singleTasksingleTask和singleInstance唯一的區別就是, singleTask的activity允許其他activity在它的task中.啟動模式為singleTask的activity永遠在它的task的根部, 同時, 其他的activities (launch mode為standard和singleTop) 可以被啟動到這個task中. 系統在啟動一個activity的時候,發現它的launchMode是singleTask, 並不能保證就會真的開啟一個新的task, 還會檢查activity的taskAffinity屬性.如果taskAffinity屬性沒有指定,預設是application的taskAffinity,名稱即包名.如果發現這個taskAffinity指定的task已經存在,則會在該task中建立一個activity; 如果該task不存在,才會建立一個task. 做了一個實驗,用一個standard的activity來start一個singleTask的activity:沒有指定taskAffinity時, 它們的taskId相同, 說明它們還是在同一個task裡;為singleTask的activity指定一個新的taskAffinity後,singleTask的activity得到的taskId就和standard的不同了, 說明這時候開啟了一個新的task. 在啟動一個singleTask的activity執行個體時, 如果系統中已經存在這樣一個執行個體, 將會把這個執行個體調度到task棧頂, 並清除它的task中棧上方的所有activities.  singleInstance一個launch mode為singleInstance的activity, 不允許其他的activity在它的task中, 它自己是這個task中唯一的activity. 如果它啟動另一個activity, 那個新的activity會被分配到一個不同的task中去, 就好像intent中含有FLAG_ACTIVITY_NEW_TASK Flag一樣. 系統在啟動一個activity的時候,如果發現它的launchMode是singleInstance,就會啟動一個新的task,因為這種activity不會跟別人共用task. 所以和singleTask不同, singleInstance不需要特殊指定taskAffinity.在singleInstance中啟動的activity也不會跟它放在同一個task裡, 根據要啟動的activity的taskAffinity選擇,可能在其他已有的task裡,也可能開啟新的task, 總之不是在singleInstance的task裡.     taskAffinity屬性taskAffinity屬性規定了activity歸屬於什麼task. 有相同這一屬性的activities從概念上來講, 應該屬於同一個task, 從使用者的角度來看, 屬於同一個應用.一個task的affinity是由它的根activity的affinity決定的. affinity決定兩件事情:1.activity re-parented到哪個task; 可以查看 allowTaskReparenting 屬性的說明.2.當activity被帶有FLAG_ACTIVITY_NEW_TASK flag的Intent啟動時,哪個task來收容這個activity. 預設情況下, 一個application中的所有activities擁有相同的affinity.你可以設定taskAffinity這個屬性來將activities分組,也可以將不用應用中定義的activities放在同一個task裡. 也即: 跨應用,跨進程的activities可以在同一個task裡.如果要設定一個activity沒有對任何一個task的affinity, 可以將這個屬性設為一個Null 字元串. 如果Activity的taskAffinity屬性沒有被設定, activity會繼承application的這個屬性. 對於application來說, 預設的affinity的名字就是manifest元素指定的包名.所以預設情況下, 一個application中的所有activities有著相同的affinity, 名稱即應用程式套件名. 注意: 自己指定taskAffinity時,需要以應用程式套件名開頭,或者是省略包名,用點開頭,後面加上一個自己取的名字. 否則會在安裝時報錯.  Up Navigation在App中,所有非Home的屏都應該提供給使用者一種方法,讓使用者通過點擊action bar上的Up鍵, 來返回到應用邏輯上的prarent screen.從Android 4.1,即API 16開始,可以通過activity的 android:parentActivityName 屬性來指定每個activity邏輯上的parent.通過上面的屬性指定了parent之後,就可以通過  NavUtilsAPI來navigate Up到parent了.具體可以參見: http://developer.android.com/training/implementing-navigation/ancestral.html 在這裡想說的是, 在navigate up到一個當前stack上的activity時, 具體的行為是由parent activity的launch mode決定的.如果parent activity是singleTop(或者up intent包含了 FLAG_ACTIVITY_CLEAR_TOP Flag), parent activity就會被帶到棧頂, 而且它的狀態會被儲存, Navigation intent被parent的  onNewIntent() 方法所接收.如果parent activity的launch mode是standard(並且up intent不包含  FLAG_ACTIVITY_CLEAR_TOP Flag), 當前的activity和它的parent都會被彈出棧, 並且parent activity的新執行個體會被建立,來接收這個intent.   參考資料:實驗項目地址: https://github.com/mengdd/HelloActivityAndFragment之前的博文:http://www.cnblogs.com/mengdd/archive/2013/06/13/3134380.html別人的博文: http://blog.csdn.net/zhangjg_blog/article/details/10923643 Activity elements:http://developer.android.com/guide/topics/manifest/activity-element.htmlTasks and Back Stack:http://developer.android.com/guide/components/tasks-and-back-stack.htmlProviding Up Navigationhttp://developer.android.com/training/implementing-navigation/ancestral.html 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.