簡體   English   中英

Activity中的onPause()和onStop()

[英]onPause() and onStop() in Activity

我是Android開發的新手,我仍然無法理解活動中的onPause()onStop()方法。

在我的應用程序中,我有一個靜態類,我將其命名為Counter,它將變量的狀態保存在應用程序的內存中。 我的應用程序在模擬器中運行良好。 我試圖測試的是onPause()onStop()差異行為。

對於onPause ,我希望保留Counter類成員中存儲的值,而調用onStop()我希望計數器值重置為零。 所以我重寫onStop()並將計數器類中的變量設置為零。 但是,在模擬器中,我似乎無法使應用程序處於暫停狀態。 在模擬器中,我打開我的應用程序,運用它。 然后我點擊模擬器的主頁按鈕(而不是后退按鈕),啟動另一個應用程序,相信這會模仿onPause()活動。 但是,模擬器似乎沒有遵守這一點(我使用的是armeabi v7a模擬器),它似乎總是調用onStop()因為我的計數器值全部回到零,按照onStop()覆蓋。 這是模擬器固有的,還是我做錯了讓我的活動進入暫停狀態?

我不確定你正在測試哪個模擬器,但onPause是一個總是保證在你的Activity失去焦點時被調用的方法(我總是說因為在某些設備上,特別是那些運行Android 3.2+, onStop的設備始終保證在Activity被銷毀之前被調用。

一個很好的方式,了解Activity初學者的生命周期是垃圾你重寫的方法與Log秒。 例如:

public class SampleActivity extends Activity {

    /**
     * A string constant to use in calls to the "log" methods. Its
     * value is often given by the name of the class, as this will 
     * allow you to easily determine where log methods are coming
     * from when you analyze your logcat output.
     */
    private static final String TAG = "SampleActivity";

    /**
     * Toggle this boolean constant's value to turn on/off logging
     * within the class. 
     */
    private static final boolean VERBOSE = true;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (VERBOSE) Log.v(TAG, "+++ ON CREATE +++");
    }

    @Override
    public void onStart() {
        super.onStart();
        if (VERBOSE) Log.v(TAG, "++ ON START ++");
    }

   @Override
    public void onResume() {
        super.onResume();
        if (VERBOSE) Log.v(TAG, "+ ON RESUME +");
    }

    @Override
    public void onPause() {
        super.onPause();
        if (VERBOSE) Log.v(TAG, "- ON PAUSE -");
    }

    @Override
    public void onStop() {
        super.onStop();
        if (VERBOSE) Log.v(TAG, "-- ON STOP --");
    }

   @Override
    public void onDestroy() {
        super.onDestroy();
        if (VERBOSE) Log.v(TAG, "- ON DESTROY -");
    }
}

我知道你的問題是6個月前,但萬一其他人偶然發現了這個問題:

我做錯了什么讓我的活動進入暫停狀態。

是的,你是。 這個:

我點擊模擬器的主頁按鈕(而不是后退按鈕),然后啟動另一個應用程序,相信這會模仿onPause()活動。

點擊主頁按鈕確實會調用onPause()方法,但由於主頁按鈕使您的活動不再可見,因此它將調用onStop()方法(如提到的愛國者和米爾特)。

根據Activities開發人員參考( http://developer.android.com/guide/components/activities.html ),您可以顯示一個對話框或只是將設備置於睡眠狀態。

或者,您調用的活動只會部分阻礙調用活動。 因此,調用一個活動來創建一個大小視圖的窗口:

 android:layout_width="100dp"
 android:layout_height="100dp"

這不會覆蓋整個屏幕,從而使調用活動部分可見,因此只調用調用活動的onPause()方法。

克隆該活動,以便兩個視圖大小都是“match_parent”而不是“100dp”並調用它,並且將調用調用活動的onPause()onStop()方法,因為調用活動將不可見。

當然可以有例外,比如被調用的活動導致其onCreate()onStart()onResume()的應用程序崩潰,那么調用活動的onStop()將不會被調用,顯然,我是這里只談一般情況。

調用onPause()和onStop()之間的差異可能非常微妙。 但是,正如此處所解釋的那樣,當當前活動仍在運行時,onPause()通常會在另一個活動獲得焦點(可能是彈出窗口或透明窗口)時執行。 如果您完全離開應用程序(例如,通過點擊主頁按鈕),活動將不再可見,系統可能會執行onStop()。 我只是說因為,正如亞力克提到的那樣,在某些情況下,在銷毀活動之前不會調用onStop。

在onPause():

“如果一項活動失去焦點但仍然可見(即,一項新的非全尺寸或透明活動專注於您的活動之上),它會暫停。暫停的活動完全存在(它保持所有狀態和成員信息並保持附加到窗口管理器),但可以在極低內存情況下被系統殺死。“

的onStop():

“如果某個活動被另一個活動完全遮擋,它就會被停止。它仍會保留所有狀態和成員信息,但是,它不再對用戶可見,因此它的窗口被隱藏,當內存經常會被系統殺死在其他地方需要。“

取自Android參考活動類: http//developer.android.com/reference/android/app/Activity.html

如果您正在模擬Android 4.x,您可以使用設置 - >開發者選項 - >不保持活動和后台進程限制來控制系統處理后台活動的方式。 對於舊版本,有一個名為Dev Tools的應用程序包含相同的設置。 但是,在內存不足的情況下,系統可以忽略這些設置並終止您的應用程序。 增加分配給模擬器的內存量可能會有所幫助。

此外,如果您從Eclipse重新啟動應用程序,它將終止先前的進程,而不是正常終止它。

我贊同米勒!

在onPause():

“如果一項活動失去焦點但仍然可見(即,一項新的非全尺寸或透明活動專注於您的活動之上),它會暫停。暫停的活動完全存在(它保持所有狀態和成員信息並保持附加到窗口管理器),但可以在極低內存情況下被系統殺死。“

如果您在沒有按Back(按住HOME)的情況下交換應用程序,則操作系統將調用onPause。 當您返回到onResume中的活動(再次按住HOME)時,您應該保留所有私有變量。 但你無法控制用戶,對吧?!

如果您預計用戶將要離開您的應用程序並且操作系統調用您的onStop,則最好保存數據,如果您打算從中斷處繼續。

我也有一個Timer,我需要保存經過的時間,所以當用戶返回時我可以恢復數據。 這是我保存的例子:

@Override 
public void onSaveInstanceState(Bundle savedInstanceState) { 
  super.onSaveInstanceState(savedInstanceState); 
  // Save UI state changes to the savedInstanceState. 
  // This bundle will be passed to onCreate if the process is 
  // killed and restarted. 

  savedInstanceState.putLong("elapsedTime", elapsedTime);
  // etc. 
} 

我的代碼還原:

@Override 
public void onRestoreInstanceState(Bundle savedInstanceState) { 
  super.onRestoreInstanceState(savedInstanceState); 
  // Restore UI state from the savedInstanceState. 
  // This bundle has also been passed to onCreate. 

  elapsedTime = savedInstanceState.getLong("elapsedTime");
} 

把這些方法放在你的課堂里,你很高興。 請記住,在我的情況下,字符串“elapsedTime”是系統的KEY,它必須是唯一的。 對要保存的每個數據使用唯一字符串。 例如“startClock”,“ClockTextColor”等......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM