iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 26
1
Mobile Development

程式初學:Android與Kotlin系列 第 26

Day 26--Lifecycles and logging(中)

  • 分享至 

  • xImage
  •  

在activities,apps之間往返時,例如user切換app,突然有來電等
使得原本的activity暫時不顯示在當前螢幕時,被稱為putting the activity into the background

當一個被放在background的activity不應該過度消耗系統資源與電力
所以我們可以利用lifecycles來將運作中的activity暫停
關於效能也是同樣的,如果user開了過多的app,許多不在當前螢幕,已在background的app還不斷消耗系統資源的話,
整個系統都會被拖慢

重新執行app,再按Home鍵將app放至後台,這時觀察lifecycle

會看到activity先onPause(),然後onStop()

  • onPause() is called, the app no longer has focus
  • onStop(), the app is no longer visible on screen
    但還沒有onDestroy(),表示這個activity物件仍在記憶體中

    再使用最近程式,將app帶回到畫面

    因為這個activity沒有onDestroy(),還在記憶體中,就不用再建立,也就不會再次onCreate()
    所以就是從onRestart()將activity帶回來,onStart(),onResume()讓activity顯示於畫面上等待操作

使用最近程式切換到其它app,再切回來,觀察lifecycle

一樣是onPause() -> onStop() -> onRestart() -> onStart() -> onResume()的循環

最重要的是在onStop(),onStart() 這二個方法
視需求在丟到background的時候,override onStop()
視需求在帶回foreground的時候,override onStart()

onRestart()類似onCreate(),都是在activity可見之前被呼叫執行


在onStart()將activity顯示於畫面:visible,接著onResume()聚焦:focus
(其實不太懂這意思,先理解是像開機,app也是打開後等一下下就可以開始操作了)
以上這個部分被稱為 interactive lifecycle
然後app放去background時,先在onPause()失去焦點:lost focus,接著在onStop()消失在目前螢幕:no longer visible

在聚焦focus與可見visible的差別,就是讓activity可以介於隱約但沒有完全顯示在螢幕上
如範例app,當按下分享鍵時,另一個sharing activity跳出顯示在下半螢幕,原activity畫面略暗並顯示於上半螢幕

此時lifecycle被呼叫的是onPause(),後面並沒有接著onStop()
在呼叫onPause(),activity lost focus之後,就不能操作此activity了

為何要區分這樣的lifecycle?因為可能有當activity進入onPause()時,還要運行或停止的動作,這時就可以寫在onPause()中
但要注意在此的動作必須是輕度的,因為onPause()會影響其它內容顯示,例如當操作app時,有來電,此時activity就要進入onPause(),再顯示來電,如果onPause()寫一堆東西,可能就會delay顯示來電

再觀察點掉sharing activity,回到原本app的activity,這時就呼叫了onResume()

  • 呼叫onPause()當activity lost focus
  • 呼叫onResume()當 activity has focus

上一篇
Day 25--Lifecycles and logging(上)
下一篇
Day 27--Lifecycles and logging(下)
系列文
程式初學:Android與Kotlin30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言