Android停止與重啟Activity

2018-08-02 18:34 更新

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

恰當?shù)耐V古c重啟我們的activity是很重要的,在activity生命周期中,他們能確保用戶感知到程序的存在并不會丟失他們的進度。在下面一些關(guān)鍵的場景中會涉及到停止與重啟:

  • 用戶打開最近使用app的菜單并從我們的app切換到另外一個app,這個時候我們的app是被停止的。如果用戶通過手機主界面的啟動程序圖標或者最近使用程序的窗口回到我們的app,那么我們的activity會重啟。
  • 用戶在我們的app里面執(zhí)行啟動一個新activity的操作,當前activity會在第二個activity被創(chuàng)建后stop。如果用戶點擊back按鈕,第一個activtiy會被重啟。
  • 用戶在使用我們的app時接收到一個來電通話.

Activity類提供了onStop()onRestart()方法來允許在activity停止與重啟時進行調(diào)用。不同于暫停狀態(tài)的部分阻塞UI,停止狀態(tài)是UI不再可見并且用戶的焦點轉(zhuǎn)移到另一個activity中.

Note: 因為系統(tǒng)在activity停止時會在內(nèi)存中保存Activity的實例,所以有時不需要實現(xiàn)onStop(),onRestart()甚至是onStart()方法. 因為大多數(shù)的activity相對比較簡單,activity會自己停止與重啟,我們只需要使用onPause()來停止正在運行的動作并斷開系統(tǒng)資源鏈接。

basic-lifecycle-stopped

Figure 1. 上圖顯示:當用戶離開我們的activity時,系統(tǒng)會調(diào)用onStop()來停止activity (1). 這個時候如果用戶返回,系統(tǒng)會調(diào)用onRestart()(2), 之后會迅速調(diào)用onStart()(3)與onResume()(4). 請注意:無論什么原因?qū)е耡ctivity停止,系統(tǒng)總是會在onStop()之前調(diào)用onPause()方法。

停止activity

當activity調(diào)用onStop()方法, activity不再可見,并且應該釋放那些不再需要的所有資源。一旦activity停止了,系統(tǒng)會在需要內(nèi)存空間時摧毀它的實例(和棧結(jié)構(gòu)有關(guān),通常back操作會導致前一個activity被銷毀)。極端情況下,系統(tǒng)會直接殺死我們的app進程,并不執(zhí)行activity的onDestroy()回調(diào)方法, 因此我們需要使用onStop()來釋放資源,從而避免內(nèi)存泄漏。(這點需要注意)

盡管onPause()方法是在onStop()之前調(diào)用,我們應該使用onStop()來執(zhí)行那些CPU intensive的shut-down操作,例如往數(shù)據(jù)庫寫信息。

例如,下面是一個在onStop()的方法里面保存筆記草稿到persistent storage的示例:

@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已經(jīng)停止后,Activity對象會保存在內(nèi)存中,并在activity resume時被重新調(diào)用。我們不需要在恢復到Resumed state狀態(tài)前重新初始化那些被保存在內(nèi)存中的組件。系統(tǒng)同樣保存了每一個在布局中的視圖的當前狀態(tài),如果用戶在EditText組件中輸入了text,它會被保存,因此不需要保存與恢復它。

Note: 即使系統(tǒng)會在activity stop時停止這個activity,它仍然會保存View對象的狀態(tài)(比如EditText中的文字) 到一個Bundle中,并且在用戶返回這個activity時恢復它們(下一小節(jié)會介紹在activity銷毀與重新建立時如何使用Bundle來保存其他數(shù)據(jù)的狀態(tài)).

啟動與重啟activity

當activity從Stopped狀態(tài)回到前臺時,它會調(diào)用onRestart().系統(tǒng)再調(diào)用onStart()方法,onStart()方法會在每次activity可見時都會被調(diào)用。onRestart()方法則是只在activity從stopped狀態(tài)恢復時才會被調(diào)用,因此我們可以使用它來執(zhí)行一些特殊的恢復(restoration)工作,請注意之前是被stopped而不是destrory。

使用onRestart()來恢復activity狀態(tài)是不太常見的,因此對于這個方法如何使用沒有任何的guidelines。然而,因為onStop()方法應該做清除所有activity資源的操作,我們需要在重啟activtiy時重新實例化那些被清除的資源,同樣, 我們也需要在activity第一次創(chuàng)建時實例化那些資源。介于上面的原因,應該使用onStart()作為onStop()所對應方法。因為系統(tǒng)會在創(chuàng)建activity與從停止狀態(tài)重啟activity時都會調(diào)用onStart()。也就是說,我們在onStop里面做了哪些清除的操作,就該在onStart里面重新把那些清除掉的資源重新創(chuàng)建出來。

例如:因為用戶很可能在回到這個activity之前已經(jīng)過了很長一段時間,所以onStart()方法是一個比較好的地方來驗證某些必須的系統(tǒng)特性是否可用。

@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
}

當系統(tǒng)Destory我們的activity,它會為activity調(diào)用onDestroy()方法。因為我們會在onStop方法里面做釋放資源的操作,那么onDestory方法則是我們最后去清除那些可能導致內(nèi)存泄漏的地方。因此需要確保那些線程都被destroyed并且所有的操作都被停止。


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

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號