iT邦幫忙

2022 iThome 鐵人賽

DAY 23
0
Mobile Development

[Android] 在 activity 與 fragment 身上的 lifecycle系列 第 23

[Day 23] Activity 的 lifecycle - 甜點應用程式 - onCreate() vs onStart()

  • 分享至 

  • xImage
  •  

在本篇,我們想要瞭解onCreate()onStart()之間的差異。

我們原本在 MainActivity class 立刻宣告已售出甜點數量(變數: dessertsSold)的初始化。

class MainActivity : AppCompatActivity(), LifecycleObserver {

    private var revenue = 0
    private var dessertsSold = 0
    ...
}

現在我們將dessertsSold = 0移到不同的生命週期回調方法來觀察它們的差異。

先在onCreate()加入dessertsSold = 0

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Log.i("MainActivity", "onCreate called")
        
        dessertsSold = 0
        
        // Use Data Binding to get reference to the views
        binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
        ...
}

執行甜點應用程式後,我們先在畫面上點擊甜點,增加甜點售出數量、金額。

接著按下桌面鍵,再回到甜點應用程式,繼續在畫面上點擊甜點。
我們可以看到甜點售出數量、金額是在先前的紀錄數值上累加。看起來運作得很完美。

然後,我們把dessertsSold = 0移至onStart()

override fun onStart() {
        super.onStart()
        
        dessertsSold = 0
        
        Log.i("MainActivity", "onStart called")
}

接著按下桌面鍵,再回到甜點應用程式,繼續在畫面上點擊甜點。
這時候,情況不一樣了。在點擊畫面甜點後,已售出甜點數量(變數: dessertsSold)突然回到我只做了 1 個的狀態。

這是因為在按下桌面鍵後再回到甜點應用程式,應用程式從不可見->可見(visible),調用了onStart()。將已售出甜點數量(變數: dessertsSold)重新設置為 0 。

onCreate()只會在 Activity 第一次啟動時調用,將dessertsSold = 0設置在onCreate()比較能達到我們想要的使用者體驗。

onPause()onStop()onDestory()被調用,對於開發者的你而言,這是需要清理、釋放你不再使用資源的訊號。

onCreate()onStart()onResume()被調用,你可以撰寫程序來再次使用這些資源


參考資料


上一篇
[Day 22] Activity 的 lifecycle - 甜點應用程式 - 分享選單(Share dialog)
下一篇
[Day 24] 場外主題 - val 及 var
系列文
[Android] 在 activity 與 fragment 身上的 lifecycle30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言