Activity相關面試題

1,Activity的生命週期

   正常情況下生命週期:oncreate--onStart--onResume--onPause--onStop--onDestory

   異常情況下:onSaveInstanceState-onPause-onStop-onDestory  重建後onCreate--onRestoreInstanceState

  系統資源不足會回收低優先級的activity,前臺--可見但非前臺--後臺  後臺被優先回收,會調用onSaveInstanceState和onRestoreInstanceState來保存和恢復數據。

2,onStart onResume和onPause onStop的區別?

    onStart onStop是針對activity是否可見來說的,onPause onResume是從activity是否位於前臺來回調的

3,Activity A啓動另一個Activity B會回調哪些方法?如果Activity B是完全透明的呢?如果啓動的是一個Dialog呢?

    onPause--onSto--onDestory,onPause, 當前dialog啓動不會執行任何回調,其他activity會回調onPause

4,如何避免配置改變時Activity重建?

    在miannifest文件註冊activity清單配置configChanges屬性,常用的屬性有local orientation和keyboardHidden,分別代表系統語言、屏幕旋轉和屏幕鍵盤

5,Activity的四種啓動模式?

   standard默認啓動模式  singleTop棧頂模式 singleTask棧內複用模式  singleInstance單實例模式

   standard標準啓動模式,每次啓動都會新建一個實例對象,會默認進入啓動它所在的任務棧

   singleTop棧頂複用模式,如果新activity在棧頂,那麼這個activity不會被重新創建,並且會回調onNewIntent方法,通過這個方法的參數取出當前請求的信息。

   singleTask棧內複用模式,如果新的activity在棧內存在,那麼不會重新創建實例,也會回調onNewIntent方法,會把啓動的activity放到棧頂,之前在棧內在這個activity之上的會出棧銷燬。

   singleInstance單實例模式,加強的singleTask,這個模式的activity只能單獨存在一個任務棧中,後續請求均不會創建新的實例。

6,什麼是activity需要的任務棧?啓動Activity的標誌位?

activity的一個參數taskAffinity 任務相關性,默認是應用的包名,它主要是和singleTask配對使用的,新建的activity實例會運行在名字和taskAffinity的任務棧中。

NEW_TASK,SINGLE_TOP, CLEAR_TOP,(singleTask中設置這個flag,如果被啓動的採用standard模式,那麼它和它之上的activity都會出棧。)FROM_RECENTES,(不希望通過back按鍵返回到這個activity,不會出現在歷史activity列表中)

7,onNewIntent調用時機

前提:activity已經在棧中存在,啓動模式爲singleTop,activity在棧頂時,會回調onNewIntent。 啓動模式爲singleTask和singleIns時會回調onNewIntent。

8,activity的啓動流程

   主要是根activity的啓動,luncher組件會向ams發送一個啓動activity的進程間的通信請求。activityManagerService是一個系統關鍵服務,主要負責系統activity的啓動和調度。luncher組件也是由ams所啓動,是手機的home程序,管理和顯示手機的所有應用。從packagemanagerservic中獲取應用信息。

1,luncher組件首先向ams發送一條啓動應用根activity的進程間通信請求

2,ams會把這要啓動的應用信息保存下來,然後讓luncher組件進入終止狀態通信請求。

3,luncher進入終止狀態後會給ams一個已經終止完畢的信號,ams收到信號後會繼續進行啓動activity的請求

4,ams去尋找這個運行activity的進程,如果這個進程不存在,它就會給zaygote進程發送一個進程間的請求,zaygote進程會通過最終調用fork方法通過複製自身創建一個新進程。zaygote進程在創建的時候會在內部創建一個虛擬機實例,通過複製它自身就能得到一個應用程序。

5,最後ams將第二步保存下來的Activity組件信息發送給zaygote進程創建的新的進程,

6,新的應用進程啓動完畢後,就會給ams發送一個啓動完成的進程間的請求,經過一系列調用startactivity方法來啓動activity

 

 

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