四大組件之Activity詳解,四大activity詳解
一、Activity的概要說明
我看過Activity的源碼,Activity類注釋大概是這樣解釋的:幾乎所有的Activity都是與使用者互動用的,我想用了一個幾乎的意思應該是排除一些純展示介面吧,因此Activity類主要是建立一個視窗來展示我們所做的UI介面,我們用的時候通常是全屏來展示UI介面的,但是Activity也有一些其他的用途,比如當做一個懸浮的視窗來用(在資訊清單檔裡更改Activity的主)。
二、Activity的四種LaunchMode
設定:<activity android:name=".MainActivity" android:launchMode="standard" />
1、Standard:把Activity設定成Standard啟動模式的意思是:比如當前顯示的介面是FirstActivity,此時任務棧裡就會有一個FirstActivity執行個體,接下來由FirstActivity跳轉到FirstActivity,此時任務棧裡就會產生一個新的FirstActivity執行個體,如果再次跳轉到FirstActivity,任務棧裡又會多出第二個FirstActivity執行個體,到現在為止任務棧裡一共有三個FirstActivity執行個體,這時候我們連著按兩次Back鍵,才會返回到第一個FirstActivity,如所示:
2、SingleTop:比如當前介面顯示的介面是FirstActivity,此時任務棧裡就會有一個FirstActivity執行個體,接下來由FirstActivity跳轉到FirstActivity,這個時候系統發現在棧頂處已經存在一個FirstActivity執行個體了,所以就不會再建立FirstActivity執行個體了(如第一個圖),否則就會在棧頂建立它的執行個體(如第二個圖),從SecondActivity跳轉到FirstActivity的時候,發現雖然任務棧裡存在FirstActivity執行個體,但是位置不在棧頂,所有就建立了一個FirstActivity執行個體。
3、SingTask:比如我們當前顯示的介面是FirstActivity,此時任務棧裡就會有一個FirstActivivity執行個體,接下來由FirstActivity跳轉到SecondActivity,系統發現任務棧裡還沒有SecondActivity執行個體,於是就會建立一個SecongActivity執行個體放於棧頂(如的上半部分),接下來我們由SecondActivity跳轉到FirstActivivity,系統會發現在棧裡已經存在FirstActivivity執行個體了(不管位置在哪),所以就不會在棧裡建立FirstActivity執行個體的,同時還會把FirstActivity執行個體上面的對象全不都彈出棧(如的下半部分)。
intent) Activity的啟動模式為singleTop/singleTask會執行onNewIntent方法,比如從OneActivity(SingTask模式)跳轉到TwoActivity,再從TwoActivity回來,OneActivity的生命週期就會變成onNewIntent()---->onResart()------>onStart()----->onResume(),也就是說只要OneActivity在任務棧裡,並且又不是第一次進入到OneActivity,就會執行onNewIntent()方法。那麼 (二)onSaveInstanceState(Bundle outState) 在網上查過很多人資料,說這個方法只有在系統記憶體不夠時,Activity被強制殺死的時候才會被執行,但是這種說法是錯誤,我試了幾種情況,也會執行 onSaveInstanceState方法。 1、Activity正常的跳轉 2、按Home鍵退到背景時候 3、橫豎屏切換的時候,比如我們在看電影的時候,橫豎屏切換的時候,必須儲存切換之前看的進度。 3、onConfigurationChanged(Configuration newConfig) android:onConfigurationChanged實際對應的是Activity裡的onConfigurationChanged()方法。 在AndroidManifest.xml中添加上訴代碼的含義是表示在改變螢幕方向、彈出軟體盤和隱藏軟鍵盤時,不再去執行onCreate()方法,
而是直接執行onConfigurationChanged()。如果不申明此段代碼,按照Activity的生命週期,都會去執行一次onCreate()方法,而onCreate()方法通常會在顯示之前做 一些初始化工作。所以如果改變螢幕方向這樣的操作都去執行onCreate()方法,就有可能造成重複的初始化,降低程式效率是必然的了,而且更有可能因為重複的初始化而導 致資料的丟失。這是需要千萬避免的。