注:本文翻譯自Google官方的Android Developers Training文檔,譯者技術一般,由于喜愛安卓而產生了翻譯的念頭,純屬個人興趣愛好。
原文鏈接: http://developer.android.com/training/basics/activity-lifecycle/stopping.html
正確地停止和重啟你的activity在整個生命周期過程中是非常重要的,它可以讓用戶感覺到你的應用一直處于活躍狀態,并且不會丟失他們的進度。以下是一些你的activity被停止或者被重啟的例子:
- 用戶打開了最近使用過的應用窗口,并且從你的應用切換到了另一個應用。此時你的處于前臺的activity被停止。如果用戶從主菜單頁面或者最近使用過的應用窗口回到你的應用,此時之前被停止的activity會被重啟。
- 用戶在你的應用中進行了一個啟動另一個新activity的操作。當新activity被創建時,當前的activity會被停止。如果用戶此時按下返回鍵,第一個activity會被重啟。
- 當用戶在使用你的應用時接到了電話
Activity 類中的兩個生命周期函數 onStop() 和 onRestart() ,使你可以在activity被停止或被重啟時,進行一些處理。不像在暫停態時,activity是部分可見的。停止態時的activity是完全不可見的,同時用戶的焦點也在另一個activity上(或另一個應用上)。
Note:
因為當 Activity 被停止時,系統在RAM中保存了它的實例,所以有可能你并不需要實現 onStop() 和 onRestart() 方法(甚至連 onStart() 方法也不需要,對于大多數相對比較簡單的activity來說,即使這些方法沒有實現也不會有什么問題,你只需要使用 onPause() 方法停止正在執行的操作,并且釋放系統資源就行了)。
?
圖1. 當用戶離開你的activity時,系統會調用 onStop() 方法來停止你的activity(1),當用戶返回到這個activity時,
系統會調用
onRestart()
方法(
2
)
緊跟著執行
onStart()
(
3
)方法和
onResume()
(
4
)。注意不管發生了什么使得
activity
被停止,
系統都會在調用
onStop()
方法之前調用
onPause()
方法。
?
一). 停止你的Activity
當你的Activity被調用了 onStop() 方法,此時它將不再可見,并且釋放大多數用戶不再需要的資源。一旦你的Activity被停止,系統可能會在內存不足的情況下銷毀它的實例。在極端的情況下,系統可能會直接結束你的應用進程,并且不調用最終的 onDestroy() 回調函數,所以務必要在 onStop() 中釋放資源來防止內存泄露。
雖然 onPause() 在 onStop() 之前被調用,你應該在 onStop() 中進行負荷更大,更消耗CPU的操作,比如把信息寫入數據庫。
例如,以下是一個 onStop() 的實現,它將一段內容的草稿存到手機存儲當中:
@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. ); }
當你的 Activity 被停止時,activity對象會保存在存儲中,并且當它恢復時,會從存儲中重新調用。你不需要再重新初始化那些進入恢復態之前的所有回調函數中已經創建好了的組件。系統也會在一個 Bundle (一種鍵值對)中對布局中的每一個 View 記錄好它的狀態(如 EditText 中的文字)。并且當用戶回到相同的activity實例時,恢復它們。(下一節課會繼續討論使用 Bundle 來存儲其它的數據,防止你的activity被銷毀或重新創建)。
?
二). 啟動/重啟你的Activity
當你的activity從停止態回到前臺,它會調用
onRestart()
方法。系統也同時會調用
onStart()
方法,該方法每當你的
activity
變為可見時會調用(不管是被重新啟動的還是被第一次創建的)。然而,
onRestart()
方法只在
activity
從停止態恢復時才會被調用,所以你可以用它來實現一些特殊的恢復工作,這些工作也許僅在
activity
之前被停止,但沒有被銷毀時,有著特殊的作用。
對于一個應用來說,使用 onRestart() 方法來恢復狀態看上去不太尋常,所以關于這個方法應該如何使用,沒有一個指導性的建議。不過,因為你的 onStop() 方法會清除你的activity的大部分資源,因此 當activity重啟時, 你需要重新初始化它們。然而另一方面,當activity第一次被創建時(即沒有該activity已經存在的實例),你也需要初始化它們。所以,你應該經常使用 onStart() 方法來和 onStop() 方法相對應,因為在上述兩種情況下(activity從停止態恢復和第一次被創建),系統都會調用 onStart() 方法。
例如,因為用戶可能在回到你的應用之前已經離開你的應用很久了,在 onStart() 方法中檢查一些需要的系統功能是否可以被調用是一個不錯的方法:
@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 }
當系統銷毀了你的activity時,它會對你的activity調用
onDestroy()
方法。因為你已經在
onStop()
方法中釋放了幾乎所有占用的資源,故當被調用
onDestroy()
方法時,其實大多數應用沒有什么特別需要做的。這個方法是你清除那些可能會導致內存泄露的資源的最后機會,所以你應該確定那些額外的線程被清除,并且那些長時間運行的操作,如函數追蹤器也被停止了。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

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