Android暫停與恢復(fù)Activity

2018-08-02 18:34 更新

編寫:kesenhoo - 原文:http://developer.android.com/training/basics/activity-lifecycle/pausing.html

在正常使用app時(shí),前端的activity有時(shí)會(huì)被其他可見(jiàn)的組件阻塞(obstructed),從而導(dǎo)致當(dāng)前的activity進(jìn)入Pause狀態(tài)。例如,當(dāng)打開(kāi)一個(gè)半透明的activity時(shí)(例如以對(duì)話框的形式),之前的activity會(huì)被暫停。 只要之前的activity仍然被部分可見(jiàn),這個(gè)activity就會(huì)一直處于Paused狀態(tài)。

然而,一旦之前的activity被完全阻塞并不可見(jiàn)時(shí),則其會(huì)進(jìn)入Stop狀態(tài)(將在下一小節(jié)討論)。

activity一旦進(jìn)入paused狀態(tài),系統(tǒng)就會(huì)調(diào)用activity中的onPause()方法, 該方法中可以停止不應(yīng)該在暫停過(guò)程中執(zhí)行的操作,如暫停視頻播放;或者保存那些有可能需要長(zhǎng)期保存的信息。如果用戶從暫停狀態(tài)回到當(dāng)前activity,系統(tǒng)應(yīng)該恢復(fù)那些數(shù)據(jù)并執(zhí)行onResume()方法。

Note: 當(dāng)我們的activity收到調(diào)用onPause()的信號(hào)時(shí),那可能意味者activity將被暫停一段時(shí)間,并且用戶很可能回到我們的activity。然而,那也是用戶要離開(kāi)我們的activtiy的第一個(gè)信號(hào)。

basic-lifecycle-paused

Figure 1. 當(dāng)一個(gè)半透明的activity阻塞activity時(shí),系統(tǒng)會(huì)調(diào)用onPause()方法并且這個(gè)activity會(huì)停留在Paused 狀態(tài)(1). 如果用戶在這個(gè)activity還是在Paused 狀態(tài)時(shí)回到這個(gè)activity,系統(tǒng)則會(huì)調(diào)用它的onResume() (2).

暫停Activity

當(dāng)系統(tǒng)調(diào)用activity中的onPause(),從技術(shù)上講,意味著activity仍然處于部分可見(jiàn)的狀態(tài).但更多時(shí)候意味著用戶正在離開(kāi)這個(gè)activity,并馬上會(huì)進(jìn)入Stopped state. 通常應(yīng)該在onPause()回調(diào)方法里面做以下事情:

  • 停止動(dòng)畫(huà)或者是其他正在運(yùn)行的操作,那些都會(huì)導(dǎo)致CPU的浪費(fèi).
  • 提交在用戶離開(kāi)時(shí)期待保存的內(nèi)容(例如郵件草稿).
  • 釋放系統(tǒng)資源,例如broadcast receivers, sensors (比如GPS), 或者是其他任何會(huì)影響到電量的資源。

例如, 如果程序使用Camera,onPause()會(huì)是一個(gè)比較好的地方去做那些釋放資源的操作。

@Override
public void onPause() {
    super.onPause();  // Always call the superclass method first

    // Release the Camera because we don't need it when paused
    // and other activities might need to use it.
    if (mCamera != null) {
        mCamera.release()
        mCamera = null;
    }
}

通常,不應(yīng)該使用onPause()來(lái)保存用戶改變的數(shù)據(jù) (例如填入表格中的個(gè)人信息) 到永久存儲(chǔ)(File或者DB)上。僅僅當(dāng)確認(rèn)用戶期待那些改變能夠被自動(dòng)保存的時(shí)候(例如正在撰寫郵件草稿),才把那些數(shù)據(jù)存到永久存儲(chǔ) 。但是,我們應(yīng)該避免在onPause()時(shí)執(zhí)行CPU-intensive 的工作,例如寫數(shù)據(jù)到DB,因?yàn)樗鼤?huì)導(dǎo)致切換到下一個(gè)activity變得緩慢(應(yīng)該把那些heavy-load的工作放到onStop()去做)。

如果activity實(shí)際上是要被Stop,那么我們應(yīng)該為了切換的順暢而減少在OnPause()方法里面的工作量。

Note:當(dāng)activity處于暫停狀態(tài),Activity實(shí)例是駐留在內(nèi)存中的,并且在activity 恢復(fù)的時(shí)候重新調(diào)用。我們不需要在恢復(fù)到Resumed狀態(tài)的一系列回調(diào)方法中重新初始化組件。

恢復(fù)activity

當(dāng)用戶從Paused狀態(tài)恢復(fù)activity時(shí),系統(tǒng)會(huì)調(diào)用onResume()方法。

請(qǐng)注意,系統(tǒng)每次調(diào)用這個(gè)方法時(shí),activity都處于前臺(tái),包括第一次創(chuàng)建的時(shí)候。所以,應(yīng)該實(shí)現(xiàn)onResume()來(lái)初始化那些在onPause方法里面釋放掉的組件,并執(zhí)行那些activity每次進(jìn)入Resumed state都需要的初始化動(dòng)作 (例如開(kāi)始動(dòng)畫(huà)與初始化那些只有在獲取用戶焦點(diǎn)時(shí)才需要的組件)

下面的onResume()的例子是與上面的onPause()例子相對(duì)應(yīng)的。

@Override
public void onResume() {
    super.onResume();  // Always call the superclass method first

    // Get the Camera instance as the activity achieves full user focus
    if (mCamera == null) {
        initializeCamera(); // Local method to handle camera init
    }
}


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)