注:本文翻譯自Google官方的Android Developers Training文檔,譯者技術(shù)一般,由于喜愛安卓而產(chǎn)生了翻譯的念頭,純屬個(gè)人興趣愛好。
原文鏈接: http://developer.android.com/training/basics/activity-lifecycle/stopping.html
正確地停止和重啟你的activity在整個(gè)生命周期過程中是非常重要的,它可以讓用戶感覺到你的應(yīng)用一直處于活躍狀態(tài),并且不會丟失他們的進(jìn)度。以下是一些你的activity被停止或者被重啟的例子:
- 用戶打開了最近使用過的應(yīng)用窗口,并且從你的應(yīng)用切換到了另一個(gè)應(yīng)用。此時(shí)你的處于前臺的activity被停止。如果用戶從主菜單頁面或者最近使用過的應(yīng)用窗口回到你的應(yīng)用,此時(shí)之前被停止的activity會被重啟。
- 用戶在你的應(yīng)用中進(jìn)行了一個(gè)啟動另一個(gè)新activity的操作。當(dāng)新activity被創(chuàng)建時(shí),當(dāng)前的activity會被停止。如果用戶此時(shí)按下返回鍵,第一個(gè)activity會被重啟。
- 當(dāng)用戶在使用你的應(yīng)用時(shí)接到了電話
Activity 類中的兩個(gè)生命周期函數(shù) onStop() 和 onRestart() ,使你可以在activity被停止或被重啟時(shí),進(jìn)行一些處理。不像在暫停態(tài)時(shí),activity是部分可見的。停止態(tài)時(shí)的activity是完全不可見的,同時(shí)用戶的焦點(diǎn)也在另一個(gè)activity上(或另一個(gè)應(yīng)用上)。
Note:
因?yàn)楫?dāng) Activity 被停止時(shí),系統(tǒng)在RAM中保存了它的實(shí)例,所以有可能你并不需要實(shí)現(xiàn) onStop() 和 onRestart() 方法(甚至連 onStart() 方法也不需要,對于大多數(shù)相對比較簡單的activity來說,即使這些方法沒有實(shí)現(xiàn)也不會有什么問題,你只需要使用 onPause() 方法停止正在執(zhí)行的操作,并且釋放系統(tǒng)資源就行了)。
?
圖1. 當(dāng)用戶離開你的activity時(shí),系統(tǒng)會調(diào)用 onStop() 方法來停止你的activity(1),當(dāng)用戶返回到這個(gè)activity時(shí),
系統(tǒng)會調(diào)用
onRestart()
方法(
2
)
緊跟著執(zhí)行
onStart()
(
3
)方法和
onResume()
(
4
)。注意不管發(fā)生了什么使得
activity
被停止,
系統(tǒng)都會在調(diào)用
onStop()
方法之前調(diào)用
onPause()
方法。
?
一). 停止你的Activity
當(dāng)你的Activity被調(diào)用了 onStop() 方法,此時(shí)它將不再可見,并且釋放大多數(shù)用戶不再需要的資源。一旦你的Activity被停止,系統(tǒng)可能會在內(nèi)存不足的情況下銷毀它的實(shí)例。在極端的情況下,系統(tǒng)可能會直接結(jié)束你的應(yīng)用進(jìn)程,并且不調(diào)用最終的 onDestroy() 回調(diào)函數(shù),所以務(wù)必要在 onStop() 中釋放資源來防止內(nèi)存泄露。
雖然 onPause() 在 onStop() 之前被調(diào)用,你應(yīng)該在 onStop() 中進(jìn)行負(fù)荷更大,更消耗CPU的操作,比如把信息寫入數(shù)據(jù)庫。
例如,以下是一個(gè) onStop() 的實(shí)現(xiàn),它將一段內(nèi)容的草稿存到手機(jī)存儲當(dāng)中:
@Override protected void onStop() { super .onStop(); // Always call the superclass method first // Save the note's current draft, because the activity is stopping // and we want to be sure the current note progress isn't lost. ContentValues values = new ContentValues(); values.put(NotePad.Notes.COLUMN_NAME_NOTE, getCurrentNoteText()); values.put(NotePad.Notes.COLUMN_NAME_TITLE, getCurrentNoteTitle()); getContentResolver().update( mUri, // The URI for the note to update. values, // The map of column names and new values to apply to them. null , // No SELECT criteria are used. null // No WHERE columns are used. ); }
當(dāng)你的 Activity 被停止時(shí),activity對象會保存在存儲中,并且當(dāng)它恢復(fù)時(shí),會從存儲中重新調(diào)用。你不需要再重新初始化那些進(jìn)入恢復(fù)態(tài)之前的所有回調(diào)函數(shù)中已經(jīng)創(chuàng)建好了的組件。系統(tǒng)也會在一個(gè) Bundle (一種鍵值對)中對布局中的每一個(gè) View 記錄好它的狀態(tài)(如 EditText 中的文字)。并且當(dāng)用戶回到相同的activity實(shí)例時(shí),恢復(fù)它們。(下一節(jié)課會繼續(xù)討論使用 Bundle 來存儲其它的數(shù)據(jù),防止你的activity被銷毀或重新創(chuàng)建)。
?
二). 啟動/重啟你的Activity
當(dāng)你的activity從停止態(tài)回到前臺,它會調(diào)用
onRestart()
方法。系統(tǒng)也同時(shí)會調(diào)用
onStart()
方法,該方法每當(dāng)你的
activity
變?yōu)榭梢姇r(shí)會調(diào)用(不管是被重新啟動的還是被第一次創(chuàng)建的)。然而,
onRestart()
方法只在
activity
從停止態(tài)恢復(fù)時(shí)才會被調(diào)用,所以你可以用它來實(shí)現(xiàn)一些特殊的恢復(fù)工作,這些工作也許僅在
activity
之前被停止,但沒有被銷毀時(shí),有著特殊的作用。
對于一個(gè)應(yīng)用來說,使用 onRestart() 方法來恢復(fù)狀態(tài)看上去不太尋常,所以關(guān)于這個(gè)方法應(yīng)該如何使用,沒有一個(gè)指導(dǎo)性的建議。不過,因?yàn)槟愕? onStop() 方法會清除你的activity的大部分資源,因此 當(dāng)activity重啟時(shí), 你需要重新初始化它們。然而另一方面,當(dāng)activity第一次被創(chuàng)建時(shí)(即沒有該activity已經(jīng)存在的實(shí)例),你也需要初始化它們。所以,你應(yīng)該經(jīng)常使用 onStart() 方法來和 onStop() 方法相對應(yīng),因?yàn)樵谏鲜鰞煞N情況下(activity從停止態(tài)恢復(fù)和第一次被創(chuàng)建),系統(tǒng)都會調(diào)用 onStart() 方法。
例如,因?yàn)橛脩艨赡茉诨氐侥愕膽?yīng)用之前已經(jīng)離開你的應(yīng)用很久了,在 onStart() 方法中檢查一些需要的系統(tǒng)功能是否可以被調(diào)用是一個(gè)不錯(cuò)的方法:
@Override protected void onStart() { super .onStart(); // Always call the superclass method first // The activity is either being restarted or started for the first time // so this is where we should make sure that GPS is enabled LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); boolean gpsEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER); if (! gpsEnabled) { // Create a dialog here that requests the user to enable GPS, and use an intent // with the android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS action // to take the user to the Settings screen to enable GPS when they click "OK" } } @Override protected void onRestart() { super .onRestart(); // Always call the superclass method first // Activity being restarted from stopped state }
當(dāng)系統(tǒng)銷毀了你的activity時(shí),它會對你的activity調(diào)用
onDestroy()
方法。因?yàn)槟阋呀?jīng)在
onStop()
方法中釋放了幾乎所有占用的資源,故當(dāng)被調(diào)用
onDestroy()
方法時(shí),其實(shí)大多數(shù)應(yīng)用沒有什么特別需要做的。這個(gè)方法是你清除那些可能會導(dǎo)致內(nèi)存泄露的資源的最后機(jī)會,所以你應(yīng)該確定那些額外的線程被清除,并且那些長時(shí)間運(yùn)行的操作,如函數(shù)追蹤器也被停止了。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長非常感激您!手機(jī)微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
