close

本來想說這不是一個大問題,但隨著APP的接近完成時,卻發現螢幕上元件的顥示值會隨著某些情境改變或亂掉,才又重新思考及研究一下這個東西,網路文章很多但解釋的不清楚,我們今天要從使用者的使用情境角度去思考生命週期的事件變化。

下圖是在網路上常見的activity 生命週期圖

undefined

下面這篇比較詳細依照情境去描述event的發生順序,所以請參考下面這篇文章

Activity的生命週期,它會自動執行那些方法? 方法如何覆寫?

上篇文章說明了(1)一般情境 (2)暫停情境 (3)切換Activity情境

我將每個情境做一些歸納並加入第4種使用情境=>(4)手機螢幕切換情境,(5)Activity 啟動另一個 Activity 情境

(1)一般情境

01-05​13:32:30.266:​DEBUG/StateInfo(5477):​onCreate
01-05​13:32:30.296:​DEBUG/StateInfo(5477):​onStart
01-05​13:32:30.296:​DEBUG/StateInfo(5477):​onResume
..........手機持續使用中.......,當使用者按下返回鍵結束Activity
01-05​13:35:20.106:​DEBUG/StateInfo(5477):​onPause
01-05​13:35:20.106:​DEBUG/StateInfo(5477):​onStop
01-05​13:35:20.106:​DEBUG/StateInfo(5477):​onDestroy

(2)暫停情境

在執行應用程式時,使用者執行 Toast、 AlertDiaog或按下手機的返回桌面後再按鈕執行撥打電話應用程式,
就會使得目前執行的 Activity 進入暫停狀態,目前執行的 Activity 會退到背景執行,但是 Activity並未結束。
此時執行過程為先執行 onPause() 接著執行 onStop()。然後將執行權交給另一個內建的 Activity。

01-05​13:32:30.266:​DEBUG/StateInfo(5477):​onCreate
01-05​13:32:30.296:​DEBUG/StateInfo(5477):​onStart
01-05​13:32:30.296:​DEBUG/StateInfo(5477):​onResume
對話框出現在Activity的前面,此時Activity是無法使用的,進入暫停狀態 
01-05​13:35:20.106:​DEBUG/StateInfo(5477):​onPause
01-05​13:32:30.296:​DEBUG/StateInfo(5477):​onStop

等接完電話回來時,原來進入暫停的 Activity又會回復執行。這個時候執行過程為先執行  onRestart()接著執行 onStart()  
和 onResume(),原來的 Activity就會取回螢幕控制權。

01-05​13:32:30.296:​DEBUG/StateInfo(5477):​onReStart
01-05​13:32:30.296:​DEBUG/StateInfo(5477):​onStart
01-05​13:32:30.296:​DEBUG/StateInfo(5477):​onResume

(3)切換Activity情境(從前景到背景)

使用者點擊另一個APP執行,讓原本在前景的Activity進入背景前,

01-05​13:35:20.106:​DEBUG/StateInfo(5477):​onPause
01-05​13:35:20.106:​DEBUG/StateInfo(5477):​onStop
會先呼叫onPause方法,再呼叫onStop方法後,此時Activity完全進入背景,不在手機畫面上。
使用者再由APP清單中點擊這個Activity後,這個Activity會被重新執行。

01-05​13:32:30.296:​DEBUG/StateInfo(5477):​onReStart
01-05​13:32:30.296:​DEBUG/StateInfo(5477):​onStart
01-05​13:32:30.296:​DEBUG/StateInfo(5477):​onResume

(4)手機螢幕切換或改變方向情境

開始使用時

01-05​13:32:30.266:​DEBUG/StateInfo(5477):​onCreate
01-05​13:32:30.296:​DEBUG/StateInfo(5477):​onStart
01-05​13:32:30.296:​DEBUG/StateInfo(5477):​onResume

..........手機持續使用中.......
當使用者手機螢幕切換
時, 會先Destory 再Create 
01-05​13:35:20.106:​DEBUG/StateInfo(5477):​onPause
01-05​13:35:20.106:​DEBUG/StateInfo(5477):​onStop
01-05​13:35:20.106:​DEBUG/StateInfo(5477):​onDestroy
01-05​13:35:20.246:​DEBUG/StateInfo(5477):​onCreate
01-05​13:35:20.256:​DEBUG/StateInfo(5477):​onStart
01-05​13:35:20.256:​DEBUG/StateInfo(5477):​onResume

.........手機使用中.......
(5)一個應用程式內,Activity 啟動另一個 Activity 情境(程式開發人員參考用)

其中一個 Activity 啟動另一個 Activity 時。 Activity A 啟動 Activity B 時所發生的操作順利如下:
Activity A 的 onPause() 方法會執行。
Activity B 按順序執行 onCreate()、onStart() 以及 onResume() 方法。 (Activity B 現在擁有使用者焦點)。
然後,如果螢幕上已經看不到 Activity A,就會執行 Activity A 的 onStop() 方法。

後記

(1)對任何activity ,有二種方法將資料儲存下來要將狀態儲存在Pause() event中。
(2)儲存資料的View要在 android:id attribute 要命名,如有手機螢幕切換時會把值保存下來 。
(3)Activity 的整個生命週期是介於 onCreate() 呼叫和 onDestroy() 呼叫之間。您的 Activity 應在 onCreate() 中設定「全域」狀態 (例如定義版面配置),並且在 onDestroy() 中釋放所有剩餘的資源。 例如,如果您的 Activity 有一個執行緒在背景執行,並從網路下載資料,那麼最好可以在 onCreate() 中建立該執行緒,然後在 onDestroy() 中將它停止。
(4)Activity 的可見生命週期是介於 onStart() 呼叫和 onStop() 呼叫之間。在此期間,使用者可以在螢幕上看到該 Activity,並與之互動。 例如,啟動新的 Activity,而這個 Activity 不再看得到時,會呼叫 onStop()。 在這兩個方法之間,您可以維護需要讓使用者看到的資源。 例如,您可以在onStart() 中註冊 BroadcastReceiver,以監視影響到 UI 的變更,然後當使用者不再看到您顯示的內容時,在 onStop() 中將它取消註冊。 系統可以在 Activity 的整個生命週期時,多次呼叫 onStart()  onStop(),因為 Activity 對使用者而言會一直在顯示和隱藏之間切換。
(5)Activity 的前景生命週期是介於 onResume() 呼叫和 onPause() 呼叫之間。在此期間,Activity 會在螢幕上所有其他 Activity 的前面,而且具有使用者輸入焦點。 Activity 可以經常在前景和背景之間轉換 — 例如,裝置進入睡眠或顯示對話方塊時,會呼叫 onPause()。 由於此狀態可能會經常轉換,因此這兩個方法中的程式碼應十分精簡,這樣可以避免使用者在轉換時等待。

 

arrow
arrow

    stanley 發表在 痞客邦 留言(0) 人氣()