注:本文翻譯自Google官方的Android Developers Training文檔,譯者技術(shù)一般,由于喜愛(ài)安卓而產(chǎn)生了翻譯的念頭,純屬個(gè)人興趣愛(ài)好。
原文鏈接: http://developer.android.com/training/basics/activity-lifecycle/pausing.html
在正常使用應(yīng)用的過(guò)程中,在前臺(tái)的activity有時(shí)候會(huì)被其它組件所遮擋,導(dǎo)致這個(gè)activity進(jìn)入到暫停態(tài)。例如:當(dāng)打開(kāi)一個(gè)半透明activity(dialog中有這樣一種風(fēng)格),之前的activity會(huì)被暫停。只要這個(gè)activity仍然保持部分可見(jiàn),同時(shí)當(dāng)前沒(méi)有獲得用戶焦點(diǎn),它就會(huì)保持在暫停態(tài)。
然而,當(dāng)一個(gè)activity被完全遮蔽,同時(shí)變得不可見(jiàn),那么它將進(jìn)入停止態(tài)(這塊內(nèi)容將在下一節(jié)課展開(kāi))。
當(dāng)你的activity進(jìn)入暫停態(tài),系統(tǒng)將會(huì)對(duì)你的activity調(diào)用 onPause() 方法,這使得你可以停止那些在暫停態(tài)階段不能繼續(xù)進(jìn)行的操作(比如一個(gè)正在播放的視頻),或者存儲(chǔ)一些信息,以防如果用戶退出應(yīng)用后丟失數(shù)據(jù)。如果用戶從暫停態(tài)回到你的activity,系統(tǒng)會(huì)調(diào)用 onResume() 方法來(lái)恢復(fù)它。
Note:
當(dāng)你的activity執(zhí)行了 onPause() 方法,這表明activity可能會(huì)臨時(shí)地暫停一下,用戶可能會(huì)重新獲得activity焦點(diǎn)。然而,它也通常可能意味著用戶將要離開(kāi)你的activity。
?
圖1. 當(dāng)一個(gè)半透明的activity遮擋了你的activity,系統(tǒng)會(huì)調(diào)用
onPause()
方法,然后
activity
在暫停態(tài)保持等待(1)。
如果用戶回到這個(gè)
activity
時(shí),
activity
處于暫停態(tài),將會(huì)調(diào)用
onResume()
方法(2)。
?
一). 暫停你的Activity
當(dāng)系統(tǒng)對(duì)你的Activity調(diào)用
onPause()
方法,從技術(shù)上說(shuō),這表明你的activity處于部分顯示的狀態(tài),但多數(shù)情況這意味著用戶將要離開(kāi)activity,并且activity將要馬上進(jìn)入停止態(tài)。你應(yīng)該經(jīng)常在以下情況下使用
onPause()
回調(diào)函數(shù):
- 停止那些會(huì)消耗CPU資源的動(dòng)畫或其它正在執(zhí)行的操作
- 提交還未保存的修改(僅當(dāng)用戶希望當(dāng)他們離開(kāi)時(shí)這些變化會(huì)被永久的保存,比如:一個(gè)郵件草稿)
- 釋放系統(tǒng)資源,比如廣播接收器(broadcast receiver),對(duì)傳感器(如:GPS)的控制權(quán),或其它任何可能消耗電量的資源(如果用戶不再需要這些資源)
例如,如果你的應(yīng)用使用相機(jī)( Camera ),在 onPause() 中釋放是一個(gè)不錯(cuò)的辦法:
@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)存儲(chǔ)用戶的變更(比如在一個(gè)表單中填寫的個(gè)人信息)到ROM中,只有在你確定用戶期望這些改變(比如郵件草稿)應(yīng)該被永久存儲(chǔ)時(shí),才應(yīng)該在 onPause() 中把它們永久存儲(chǔ)起來(lái)。然而,你應(yīng)該避免在 onPause() 中執(zhí)行大量消耗CPU資源的事務(wù),比如寫入數(shù)據(jù)庫(kù),因?yàn)檫@將會(huì)影響到下一個(gè)activity變化為可見(jiàn)狀態(tài)的流暢度。(這些大量消耗資源的事務(wù)應(yīng)該在 onStop() 方法中執(zhí)行)
你應(yīng)該盡量保持在 onPause() 中執(zhí)行的操作相對(duì)簡(jiǎn)單,以此使得用戶到下一個(gè)目的地的切換是流暢的(如果你的activity實(shí)際上已經(jīng)進(jìn)入了停止態(tài))。
Note:
當(dāng)你的activity處于暫停態(tài), Activity 實(shí)例會(huì)存儲(chǔ)在RAM中, 當(dāng)這個(gè)activity恢復(fù)時(shí),會(huì)重新從存儲(chǔ)里調(diào)用。在activity切換到恢復(fù)態(tài)的過(guò)程中你不再需要重新初始化任何已經(jīng)創(chuàng)建過(guò)的組件。
?
二). 恢復(fù)你的Activity
當(dāng)用戶將你的activity從暫停態(tài)恢復(fù)到恢復(fù)態(tài)時(shí),系統(tǒng)會(huì)調(diào)用
onResume()
方法。
注意:每當(dāng)你的activity來(lái)到前臺(tái)時(shí),系統(tǒng)都會(huì)調(diào)用這個(gè)方法,包括當(dāng)它第一次被創(chuàng)建時(shí)。例如:你應(yīng)該在 onResume() 中初始化那些你在 onPause() 方法中釋放的組件,并且完成其他當(dāng)activity進(jìn)入恢復(fù)態(tài)時(shí)必須執(zhí)行的初始化操作。(例如啟動(dòng)一些動(dòng)畫,以及初始化那些只有activity獲取了用戶焦點(diǎn)時(shí)才會(huì)被使用的組件)
下面這個(gè)
onResume()
例子對(duì)應(yīng)于上述
onPause()
的
例子,它初始化了當(dāng)
activity
進(jìn)入暫停態(tài)時(shí)釋放的相機(jī):
@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
}
}
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

