android_Activity

Activity的生命週期

Activity四種啓動模式

1.Standared(默認)激活該Activity,則會向任務棧中加入新創建的實例,退出Activity則會在任務棧中銷燬該實例

       2.SingleTop這種模式會考慮當前要激活的Activity實例在任務棧中是否正處於棧頂,如果處於棧頂則無需重新創建新的實例,會重用已存在的實例,否則會在任務棧中創建新的實例。

       3.SingleTask如果任務棧中存在該模式的Activity實例,則把棧中該實例以上的Activity實例全部移除,調用該實例的newInstance()方法重用該Activity,使該實例處於棧頂位置,否則就重新創建一個新的Activity實例。

       4.SingleInstance當該模式Activity實例在任務棧中創建後,只要該實例還在任務棧中,即只要激活的是該類型的Activity,都會通過調用實例的newInstance()方法重用該Activity,此時使用的都是同一個Activity實例,它都會處於任務棧的棧頂。此模式一般用於加載較慢的,比較耗性能且不需要每次都重新創建的Activity

Activity兩種啓動方式

        顯式:戶點擊應用程序圖標時,Launcher會爲我們啓動應用程序的主Activity

隱式:內部通過調用startActvity接口啓動新的Activity,隱式啓動可以使得Activity之間的藕合性更加鬆散  MainActivity不需要知道SubActivity的存在,即它不直接擁有SubActivity的接口,但是它可以通過一個字符串來告訴應用程序框架層,它要啓動的Activity的名稱是什麼,其它的事情就交給應用程序框架層來做,當然,應用程序框架層會根據這個字符串來找到其對應的Activity,然後把它啓動起來。這樣,就使得Android應用程序中的Activity藕合性很鬆散,從而使得Android應用程序的模塊性程度很高

Activty啓動流程

啓動新的Activity需要藉助於應用程序框架層的ActivityManagerService服務進程  ActivityManagerService和ActivityStack位於同一個進程中,ApplicationThread和ActivityThread位於另一個進程中,  ActivityManagerService是負責管理Activity的生命週期的,ActivityManagerService還藉助ActivityStack是來把所有的 Activity按照後進先出的順序放在一個堆棧中,ActivityThread來表示應用程序的主進程,而每一個ActivityThread都包含有一 個ApplicationThread實例,它是一個Binder對象,負責和其它進程進行通信

     1. 無論是通過Launcher來啓動Activity,還是通過Activity內部調用startActivity接口來啓動新的Activity,都通過Binder進程間通信進入到ActivityManagerService進程中,並且調用ActivityManagerService.startActivity接口; 

     2. ActivityManagerService調用ActivityStack.startActivityMayWait來做準備要啓動的Activity的相關信息;

     3. ActivityStack通知ApplicationThread要進行Activity啓動調度了,這裏的ApplicationThread代表的是調用ActivityManagerService.startActivity接口的進程,對於通過點擊應用程序圖標的情景來說,這個進程就是Launcher了,而對於通過在Activity內部調用startActivity的情景來說,這個進程就是這個Activity所在的進程了;

     4. ApplicationThread不執行真正的啓動操作,它通過調用ActivityManagerService.activityPaused接口進入到ActivityManagerService進程中,看看是否需要創建新的進程來啓動Activity;

    5. 對於通過點擊應用程序圖標來啓動Activity的情景來說,ActivityManagerService在這一步中,會調用startProcessLocked來創建一個新的進程,而對於通過在Activity內部調用startActivity來啓動新的Activity來說,這一步是不需要執行的,因爲新的Activity就在原來的Activity所在的進程中進行啓動;

    6. ActivityManagerServic調用ApplicationThread.scheduleLaunchActivity接口,通知相應的進程執行啓動Activity的操作;

    7. ApplicationThread把這個啓動Activity的操作轉發給ActivityThread,ActivityThread通過ClassLoader導入相應的Activity類,然後把它啓動起來。


Activity顯示窗口樣式

清單文件activity中android:theme="@android :style/Theme.Dialog"

<item name="android:windowBackground">@android :color/transparent</item>窗口背景色

<item name="android:windowFrame">@null</item>DialogwindowFrame框爲無

<item name="android:windowIsFloating">true</item>是否浮現在activity之上

<item name="android:windowIsTranslucent">true</item>窗口是否半透明——是(與第一條配合使用)

<item name="android:windowAnimationStyle">@android :style/Animation.Dialog</item>窗口彈出效果

<item name="android:backgroundDimEnabled">true</item> 是否允許背景模糊

<item name="android:windowContentOverlay">@null</item>這個不設置的話,可能會出現邊框黑線


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