Activity之啓動模式

什麼是Activity的啓動模式

        Activity的啓動模式是定義Activity實例與Task的關聯方式;


Activity的啓動模式

        Standard
        Standard模式是默認啓動模式,總會爲目標Activity創建一個新的實例,並將新創建的Activity實例添加到當前Task中,置於Back Stack頂部;
        SingleTop
        SingleTop模式是如果將要被啓動的Activity已經存在且位於棧頂,系統不會重新創建目標Activity實例而是直接複用位於棧頂的Activity實例;
        SingleTask
        SingleTask模式的Activity在同一個棧內只有一個實例。
        1.如果要啓動的Activity實例不存在則創建一個新的Activity實例存放於棧頂;
        2.如果要啓動的Activity實例存在且位於棧頂,那麼直接複用位於棧頂的目標Activity實例;
        3.如果要啓動的Activity實例存在但不位於棧頂,那麼會將Back Stack中的目標Activity實例提升至棧頂,原本位於目標Activity實例上面的其他實例將被清理出棧;
        SingleInstance
        SingleInstance模式的Activity無論哪個Task中啓動目標Activity只會創建一個目標Activity實例且會用一個全新的棧來裝載該Activity實例(全局單例)。
        1.如果將要啓動的Activity不存在,那麼系統將會先創建一個全新的棧,再創建目標Activity實例並將該Activity實例如此這個棧中;
        2.如果要啓動的Activity已經存在,無論它位於哪個應用,哪個棧中,系統都會把該Activity所在的棧轉到前臺,從而使得目標Activity顯示出來。



使用AndroidManifest.xml設置Activity的啓動模式

        設置Activity的啓動模式可以通過修改在清單文件目標Activity標籤中的android:launchMode屬性實現;
Alt



使用Intent設置Activity啓動模式

        啓動Activity的時候可以在傳給startActivity()的intent中包含相應標誌用來修改當前Activity的與Task的關係(啓動模式);
        FLAG_ACTIVITY_NEW_TASK
        與"SingleTask"模式相同,在新的Task中啓動Activity,如果要啓動的Activity已經運行於某Task中,則那個Task將調入前臺。
        FLAG_ACTIVITY_SINGLE_TOP
        與"SingleTop"模式相同,如果要啓動的Activity位於Back Stack頂,系統不會重新創建目標Activity實例而是直接複用Task棧頂的Activity。
        FLAG_ACTIVITY_CLEAR_TOP
        如果要啓動的Activity已經在當前Task中運行,則不再啓動一個新的實例,且所有在其上面的Activity將被銷燬。



啓動模式的建議

        一般不要改變Activity和Task默認的工作方式。
        如果確定要修改保持謹慎,確保Activity在啓動和從其他Activity返回時的可用性,多做測試和安全方面的工作。



Activity的啓動模式爲SingleTop,如果視圖再次啓動該Activity會怎麼樣?

        Activity有一個onNewIntent(Intent)的回調方法,該方法被啓動模式設置爲SingleTop的Activity回調,或者是通過設置Intent.FLAG_ACTIVITY_SINGLE_TOP的Intent啓動Activity時的被回調。
        任何情況下,只要當棧頂的Activity被重新啓動時沒有重新創建一個新的Activity實例而是複用位於棧頂的Activity實例,那麼onNewIntent(Intent)方法會被回調。當一個Activity接收到新Intent的時候會處於暫停狀態,因此可以統計到onResume()被再次執行,在onNewIntent()之後。
        如果我們在Activity中調用getIntent()方法返回的還是老的Intent,如果想getIntent()方法接收到最新的Intent可以通過setIntent(Intent)方法設置。



Activity的回調機制

        回調
        對於一個具有通用性質的程序架構來說,程序架構完成整個應用的通用功能、流程,但在某個特定的點上,需要一段業務相關的代碼——通用的程序架構無法實現這段代碼,那麼程序架構會在這個點上留一個"空"。
        1.以接口的形式存在
        該接口由開發者實現,實現該接口時將會實現該接口的方法,那麼通用的程序架構就會回調該方法來完成業務相關的處理;
        2.以抽象方法的形式存在
        就是Activity的實現,在這些特定的點上方法已被定義,開發者可以有選擇性地重寫這些方法,通用的程序架構就會回調該方法來完成業務相關的處理;


如何修改Activity進入和退出的動畫

        1.通過定義Activity的主題,在style.xml中編碼,在AndroidManifest.xml中給指定的Activity指定theme;

<style name="AnimationActivity" parent="@android:style/Animation.Activity">
    <item name="android:activityOpenEnterAnimation">@anim/slide_in_left</item> 
    <item name="android:activityOpenExitAnimation">@anim/slide_out_left</item> 
    <item name="android:activityCloseEnterAnimation">@anim/slide_in_right</item> 
    <item name="android:activityCloseExitAnimation">@anim/slide_out_right</item> 
</style>

<style name="ThemeActivity"> 
    <item name="android:windowAnimationStyle">@style/AnimationActivity</item> 
    <item name="android:windowNoTitle">true</item> 
</style>

        2.第二種方法是通過重寫Activity的overridePendingTransition方法;

overridePendingTransition(R.anim.fade, R.anim.hold);
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章