關於“熄屏、轉屏、Home鍵返回、Activity跳轉”對activity生命狀態影響的分析
阿新 • • 發佈:2019-02-03
1 說明
最近寫了一個程式,用到了Service將資料傳給Activity,然後Activity進行介面資料顯示。發現Service對數值的改變,在熄屏的狀態下和Activity 介面顯示的數值不一致,便想到熄屏狀態Activity的生命狀態被影響了。這裡將熄屏和轉屏對Activity生命狀態的改變驚醒對照分析。
activity生命週期狀態圖:
2 熄屏
當程式被開啟,生命狀態執行到Onresume():
05-15 22:30:24.074 30285-30285/? I/houyafei: ----------------->onCreate(Bundle savedInstanceState)
05-15 22:30:24.113 30285-30285/? I/houyafei: -------------->onStart()
05-15 22:30:24.116 30285-30285/? I/houyafei: -------------->onResume()
熄屏後:
05-15 22:31:42.417 30285-30285/? I/houyafei: -------------->onPause()
05-15 22:31:42.431 30285-30285/? I/houyafei: -------------->onStop()
再次點亮螢幕:
05-15 22:32:48 .090 30285-30285/? I/houyafei: -------------->onRestart()
05-15 22:32:48.100 30285-30285/? I/houyafei: -------------->onStart()
05-15 22:32:48.103 30285-30285/? I/houyafei: -------------->onResume()
退出程式:
05-15 22:34:13.997 30285-30285/? I/houyafei: -------------->onPause()
05-15 22:34:14.308 30285-30285/? I/houyafei: -------------->onStop()
05-15 22:34:14.308 30285-30285/? I/houyafei: -------------->onDestroy()
3 轉屏
開啟程式(豎屏):
05-15 22:35:01.520 30285-30285/? I/houyafei: ----------------->onCreate(Bundle savedInstanceState)
05-15 22:35:01.529 30285-30285/? I/houyafei: -------------->onStart()
05-15 22:35:01.531 30285-30285/? I/houyafei: -------------->onResume()
開始旋轉為橫屏:
05-15 22:35:38.452 30285-30285/? I/houyafei: -------------->onPause()
05-15 22:35:38.453 30285-30285/? I/houyafei: -------------->onStop()
05-15 22:35:38.453 30285-30285/? I/houyafei: -------------->onDestroy()
05-15 22:35:38.516 30285-30285/? I/houyafei: ----------------->onCreate(Bundle savedInstanceState)
05-15 22:35:38.532 30285-30285/? I/houyafei: -------------->onStart()
05-15 22:35:38.532 30285-30285/? I/houyafei: -------------->onResume()
再次旋轉為豎屏:
05-15 22:37:01.296 30285-30285/? I/houyafei: -------------->onPause()
05-15 22:37:01.296 30285-30285/? I/houyafei: -------------->onStop()
05-15 22:37:01.296 30285-30285/? I/houyafei: -------------->onDestroy()
05-15 22:37:01.387 30285-30285/? I/houyafei: ----------------->onCreate(Bundle savedInstanceState)
05-15 22:37:01.409 30285-30285/? I/houyafei: -------------->onStart()
05-15 22:37:01.411 30285-30285/? I/houyafei: -------------->onResume()
關閉程式:
05-15 22:37:55.848 30285-30285/? I/houyafei: -------------->onPause()
05-15 22:37:56.139 30285-30285/? I/houyafei: -------------->onStop()
05-15 22:37:56.139 30285-30285/? I/houyafei: -------------->onDestroy()
也就是說,選裝螢幕相當於程式瞬間關閉然後重新開啟。
4 activity之間跳轉
開啟程式啟動第一個Activity:
05-15 22:39:31.526 30285-30285/? I/houyafei: ----------------->onCreate(Bundle savedInstanceState)
05-15 22:39:31.537 30285-30285/? I/houyafei: -------------->onStart()
05-15 22:39:31.538 30285-30285/? I/houyafei: -------------->onResume()
點選切換到第二個Activity,則第一個Activity的生命狀態:
05-15 22:40:17.056 30285-30285/? I/houyafei: -------------->onPause()
05-15 22:40:17.499 30285-30285/? I/houyafei: -------------->onStop()
再返回第一個Activity:
05-15 22:40:45.307 30285-30285/? I/houyafei: -------------->onRestart()
05-15 22:40:45.308 30285-30285/? I/houyafei: -------------->onStart()
05-15 22:40:45.308 30285-30285/? I/houyafei: -------------->onResume()
到這裡大家肯定會發現,切換Activity和熄屏狀態,對Activity生命週期的影響是一樣的。
5返回桌面
開啟Activity:
05-15 22:43:16.000 30285-30285/? I/houyafei: ----------------->onCreate(Bundle savedInstanceState)
05-15 22:43:16.011 30285-30285/? I/houyafei: -------------->onStart()
05-15 22:43:16.013 30285-30285/? I/houyafei: -------------->onResume()
點選Home鍵後:
05-15 22:43:51.699 30285-30285/? I/houyafei: -------------->onPause()
05-15 22:43:52.011 30285-30285/? I/houyafei: -------------->onStop()
點選桌面程式圖示再次開啟程式(1):
05-15 22:44:36.597 30285-30285/? I/houyafei: -------------->onRestart()
05-15 22:44:36.601 30285-30285/? I/houyafei: -------------->onStart()
05-15 22:44:36.602 30285-30285/? I/houyafei: -------------->onResume()
點選選單鍵再次開啟程式(2):
05-15 22:47:02.261 30285-30285/? I/houyafei: -------------->onRestart()
05-15 22:47:02.275 30285-30285/? I/houyafei: -------------->onStart()
05-15 22:47:02.276 30285-30285/? I/houyafei: -------------->onResume()
以上兩種狀態是一致的。
6總結
對於,熄屏、Activity跳轉、Home鍵返回主介面等對Activity生命週期的影響是一樣的。因此,對於一些程式執行的資料一定要在onPause()中儲存,在onResume()重新讀取。
對於旋轉螢幕則是程式關於又重新開啟,因此程式執行的資料一定要儲存好。暫時就寫到這裡,回去睡覺啦~~