怎麼理解onStart可見但不可互動

2022-06-30 18:18:10 字數 3280 閱讀 1478

今天朋友遇到乙個面試題,分享給大家:

onstart生命週期表示activity可見,那為什麼不能互動呢?

這個問題看似簡單,但涉及到的面還是比較多的,比如activity生命週期的理解,程序的理解,以及view繪製的時機。

一起看看吧。

首先,是關於onstart生命週期的理解。

官網是這麼介紹的:

當 activity 進入「已開始」狀態時,系統會呼叫此**。onstart() 呼叫使 activity 對使用者可見,因為應用會為 activity 進入前台並支援互動做準備。

對使用者可見?

奇怪了,對使用者可見,不就是我們可以看到了嗎,為什麼又不能互動呢?該怎麼理解這個可見呢?

首先,科普官方定義的兩個狀態。

然後我們做個小實驗,定義activityaactivitybactivityb為dialog主題,activitya中點選可以跳轉到b:

image.setonclicklistener 

進入activitya後,點選按鈕,跳轉到b,這時候a的生命週期走到了onpause,也就是回到了已開始狀態。

這個時候,介面是這個樣子:

activitya處在已開始狀態,對使用者可見。

這裡的可見是不是就很好理解了,確實對我們可見了,只不過不在前台,不能互動

所以延伸到普通的activity,這個可見,並不是表示使用者能用肉眼看到了,而是想表達:

activity已經顯示出來了,但是還不在前台,所以只是可見,但不可互動。

這個可見狀態是從onstart開始,onstop結束,我們可以分為兩個階段:

所以綜合兩個階段,我們把這種activity被建立或已經顯示出來,但是不在前台,介於兩者之間的狀態叫做可見狀態。

到此,我們知道了可見的意思,其實也就知道了另外乙個問題,也就是為什麼要設計出onstart和onresume這兩種狀態。

所以activity的生命週期又可以解釋為:

被建立(oncreate)——> 可見(onstart)——> 位於前台(onresume)——> 可見但不在前台(onpause)

從另外的角度看,這個可見 可以指的是可見程序

這就涉及到程序的分類。

為了確定在記憶體不足時應該終止哪些程序,android 會根據每個程序中執行的元件以及這些元件的狀態,將它們放入「重要性層次結構」。這些程序型別包括(按重要性排序):前台程序,可見程序,服務流程,快取程序

這些程序是什麼意思呢?所以activity的生命週期又可以通過程序分為:

可見程序(onstart)——> 前台程序(onresume)——> 可見程序(onpause)——> 快取程序(onstop)

這些程序有什麼用呢?

當記憶體不夠時(達到了某個閾值),系統首先會通過ontrimmemory()**方法告訴應用,讓應用自己來處理低記憶體情況下的減少記憶體操作。

這之後,如果記憶體還是很緊張,那麼就會開始對一些程序的殺除,以釋放記憶體。這裡就需要判斷程序的優先順序了,從低優先順序開始按順序終止程序。

所以,程序的分類作用就在這了。優先順序的高低其實就代表了 終止程序的順序,也代表了對使用者的影響程度。

當然實際**中,程序優先順序是有數字表示的,也就是adj,而上面說的程序型別都有相應的程序優先順序數字範圍。比如:

public final class processlist
再回到我們的問題上來:其中,可見程序這裡也出現了可見的概念,給出的解釋是:使用者知曉

當我們點選乙個頁面,我們知道這個頁面將要顯示出來,也知道之前的頁面在這個頁面後面。所以這些頁面和程序都是我們所知曉的,只是不在前台。

所以onstart表示的可見,也可以理解為可見程序,意思是這個activity所在的程序任務已經被建立並顯示,我們知曉它,只是沒在前台。

那麼可以互動到底是發生在什麼階段呢?

之前我們說過,在activity啟動過程中,呼叫了handleresumeactivity方法。在這個方法中,呼叫了onresume方法和addview方法,完成了view的第一次繪製,並顯示到介面上。

@override

public void handleresumeactivity()

}

所以到onresume,view才被繪製出來,並顯示到前台。

官網是這麼解釋onresume的:

activity 會在進入「已恢復」狀態時來到前台,然後系統呼叫 onresume() **。這是應用與使用者互動的狀態。應用會一直保持這種狀態,直到某些事件發生,讓焦點遠離應用。此類事件包括接到來電、使用者導航到另乙個 activity,或裝置螢幕關閉。

所以可互動狀態應該是在onresume之後,也就是activity可見並且處於前台。

總結下:

onstart狀態表示activity可見,而可見表示的意思是activity被建立出來了,被使用者所知曉,但是不在前台,還沒繪製介面,所以無法互動。也可以意指其所在的程序為可見程序。

其可見之意應該和onstop一起使用,即onstartonstop這個階段叫做可見階段。

而真正顯示出來可以進行互動 發生在onresume之後,也就是view繪製出來,並處於前台的時候。

《android開發藝術探索》

volatile可見性原理解析

程式執行所需要的資料 讀操作 直接來自於記憶體,而修改變數值 寫操作 實際上有如下三步 1 將主存中的資料載入到快取中 2 對快取中的資料進行修改 3 將修改後的值重新整理到記憶體中 多個執行緒共同操作乙個變數,如下圖 第一步 執行緒1 執行緒2 執行緒3操作的是主存中的同乙個變數,並且分別交由cp...

Java是怎麼保證原子性,可見性

先來談談可見性 1 volatile 變數 實際的作用 告訴jvm,這個變數的值不能取cpu的cache中的,應為那個值可能已經過時了,從這個層面來講,volatile已經實現了可見性,但是他並沒有實現原子性,原子性說白了就是一堆 要一起執行完,比如說x 這個在jvm層面上是要幾條語句。2 鎖 jv...

怎麼理解遞迴

遞迴最經典的例子就是 從前有座山,山里有座廟,廟裡有個老和尚,正在給小和尚講故事呢!故事是什麼呢?從前有座山,山里有座廟,廟裡有個老和尚,正在給小和尚講故事呢!故事是什麼呢?從前有座山,山里有座廟,廟裡有個老和尚,正在給小和尚講故事呢!故事是什麼呢?遞迴需要幾個條件 1,遞迴必須 要有邊界條件,也就...