編輯:關於Android編程
我不知道大家有沒有這樣問題,項目做多了,就容易忽略最最基礎的知識,其實我也是在最近發現了自己也存在這樣的問題。因此打算做一些最基礎的知識的調研來重新學習和回顧這些容易被忽略的知識。在這篇文章中,我打算針對Android的生命周期為題,重新介紹一下onPause()和onStop()這兩個方法在一個Activity中的調用情況。
從Android的源碼來看,我們可以看到Android是這樣給出的關於onPause()的解釋:
(1)當Activity進入後台並且該Activity並未被銷毀時,該方法會被調用。
(2)在Activity A中啟動Activity B,如果B的活動頁面覆蓋在Activity A上方時,那麼Activity A則會調用onPause()。
(3)onPause()方法的對應方法是onResume。也即,如果一個Activity調用了onPause()不活動狀態時,那麼當Activity進入活動狀態的時候必定會調用onResume()。
/** * Called as part of the activity lifecycle when an activity is going into * the background, but has not (yet) been killed. The counterpart to * {@link #onResume}. * * <p>When activity B is launched in front of activity A, this callback will * be invoked on A. B will not be created until A's {@link #onPause} returns, * so be sure to not do anything lengthy here. * @see #onResume * @see #onSaveInstanceState * @see #onStop */ @CallSuper protected void onPause() { if (DEBUG_LIFECYCLE) Slog.v(TAG, "onPause " + this); getApplication().dispatchActivityPaused(this); mCalled = true; }
Android源碼中關於onStop()方法是這樣給出解釋的:
(1)當前的Activity不再呈現給用戶的時候,onStop()被調用。那麼如果Activity的theme是Dialog呢?我們在下面了解。
(2)如果onStop()方法被調用之後,那麼該Activity就處於掛起狀態。那麼在此時的情況下,要麼喚醒它(onRestart()),要麼銷毀它(onDestroy())。
(3)在某些情況下,該方法可能不會被調用。比如,系統內存過低導致無法確保在onPause()方法在被調用之後該Activity繼續保持著運行狀態。
/** * Called when you are no longer visible to the user. You will next * receive either {@link #onRestart}, {@link #onDestroy}, or nothing, * depending on later user activity. * * <p>Note that this method may never be called, in low memory situations * where the system does not have enough memory to keep your activity's * process running after its {@link #onPause} method is called. * * </p><p><em>Derived classes must call through to the super class's * implementation of this method. If they do not, an exception will be * thrown.</em></p> * * @see #onRestart * @see #onResume * @see #onSaveInstanceState * @see #onDestroy */ @CallSuper protected void onStop() { if (DEBUG_LIFECYCLE) Slog.v(TAG, "onStop " + this); if (mActionBar != null) mActionBar.setShowHideAnimationEnabled(false); mActivityTransitionState.onStop(); getApplication().dispatchActivityStopped(this); mTranslucentCallback = null; mCalled = true; }
那麼在了解了這兩個方法在Android生命周期的意義之後,大家可以開始思考幾個問題:
(1)Activity A啟動了Activity B的時候,Activity A和Activity B的生命周期的運行的方法排序是什麼?
(2)當處於Activity B時,點擊返回鍵回到Activity A時,Activity A和Activity B的生命周期的運行的方法排序是什麼?
(3)當處於Activity B時,按下鎖屏按鈕,Activity A和Activity B的生命周期方法排序是什麼?
(4)如果設置Activity B的主題為Dialog風格的話,那麼(1)(2)(3)的結果分別是什麼?
基於這三個問題,我們可以通過創建工程通過代碼編寫來一一驗證。
首先我們先設置Activity B為普通的Activity風格。在Activity A中啟動Activity B之後,發現調用方法的排序如下:
onPause(A) -> onCreate(B) -> onStart(B) -> onResume(B) -> onStop(A)
此時,我們處於Activity B,這時我們點擊返回按鈕,發現生命周期中的方法排序如下:
onPause(B) -> onRestart(A) -> onStart(A) -> onResume(A) -> onStop(B) -> onDestroy(B)
那麼如果我們現在處於Activity B,這時按下鎖屏按鈕之後,發現生命周期中的方法調用如下:
onPause(B) -> onStop(B)
重新喚醒屏幕時,我們能夠得到如下結果:
onRestart(B) -> onStart(B) -> onResume(B)
之後,我們修改一下Activity B的主題風格為dialog看看在以上三個生命周期的排序中有什麼變化。
那麼在第一個問題中,從Activity A進入Activity B我們得到的結果如下:
onPause(A) -> onCreate(B) -> onStart(B) -> onResume(B)
通過與之前的普通Activity B的主題方式比較,我們發現在打印的結果中少了onStop()方法,這時因為Activity B采用了Dialog的主題方式,Activity A對於用戶依然可見,所以Activity A不會調用自己的onStop()方法。
此時,我們處於Activity B,並且Activity B覆蓋在Activity A的上方,但是Activity依然可見。這時點擊返回鍵,我們發現如下結果:
onPause(B) -> onResume(A) -> onStop(B) -> onDestroy(B)
通過與之前的普通Activity B的主題方式比較,由於Activity A不調用自己的onStop()方法,那麼自然在Activity B銷毀之後,Activity A將不會調用自己的onRestart()和onStart()方法。
那麼如果在Activity B時,我們按下鎖屏鍵,發現結果如下:
onPause(B) -> onStop(B) -> onStop(A)
通過與之前的普通Activity B的主題方式比較,由於Activity A對於用戶可見,因此在鎖屏時,自身會調用onStop()方法將自己掛起。
當我們重新喚醒屏幕時,我們將得到如下結果:onRestart(B) -> onStart(B) -> onRestart(A) -> onStart(A) -> onResume(B)
通過與之前的普通Activity B的主題方式比較,在重新喚醒屏幕之後,自然Activity A重新被喚醒時則會調用onRestart()和onStart()方法。
通過以上的代碼運行結果,我們可以得到一下幾點結論:
(1)當Activity A啟動Activity B時,Activity A首先會將自己的狀態變為不活動狀態,也即調用onPause()。然後系統開始啟動Activity B,並開始走Activity B的生命周期。在完成Activity B的生命周期之後,再將Activity A掛起,即調用Activity A的onStop()方法。
(2)onPause()和onResume()方法是成對出現的。
(3)onStop()方法和onRestart()方法是成對出現的。
移動端集成支付,似乎是每個App都可能面臨的一件事。所有項目都在談盈利模式,而從C端獲取現金流是盈利中最重要的一個途徑之一。當前大家主要采用微信支付和阿裡支付集成到自己的
一 、前言最近實在太忙,一個多禮拜沒有更新文章了,於是今晚加班加點把demo寫出來,現在都12點了才開始寫文章。1.我們的目標把RecyclerView下拉刷新上拉加載更
本章內容第1節菜單概述第2節選項菜單和子菜單第3節上下文菜單第4節使用XML定義菜單第5節 ActionBar的作用本章目標了解各版本菜單的特征。掌握創建選項菜單的方法。
引言在windows安裝Android的開發環境不簡單也說不上算復雜,本文寫給第一次想在自己Windows上建立Android開發環境投入Android浪潮的朋友們,為了