
前言
今天朋友遇到一個面試題,分享給大家:
onStart生命周期表示Activity可見,那為什么不能互動呢?
這個問題看似簡單,但涉及到的面還是比較多的,比如Activity生命周期的理解,行程的理解,以及View繪制的時機,
一起看看吧,
onStart介紹
首先,是關于onStart生命周期的理解,
官網是這么介紹的:
當 Activity 進入“已開始”狀態時,系統會呼叫此回呼,onStart() 呼叫使 Activity 對用戶可見,因為應用會為 Activity 進入前臺并支持互動做準備,
對用戶可見?
奇怪了,對用戶可見,不就是我們可以看到了嗎,為什么又不能互動呢?
更何況onStart 的時候界面都還沒繪制,該怎么理解這個可見呢?
做個小實驗
首先,科普官方定義的兩個狀態,
- onStart到onStop中間的狀態叫做
“已開始”狀態, - onResume到onPause中間的狀態叫做
“已恢復”狀態,
然后我們做個小實驗,定義ActivityA 和 ActivityB,ActivityB為Dialog主題,ActivityA中點擊可以跳轉到B:
image.setOnClickListener {
startActivity(Intent(this, ActivityB::class.java))
}
<activity android:name=".activity.ActivityB"
android:theme="@style/Theme.AppCompat.Light.Dialog"
android:launchMode="standard">
</activity>
進入ActivityA后,點擊按鈕,跳轉到B,這時候A的生命周期走到了onPause,也就是回到了已開始狀態,

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

ActivityA處在已開始狀態,對用戶可見,
這里的可見是不是就很好理解了,確實對我們可見了,只不過 不在前臺,不能互動,
所以延伸到普通的Activity,這個可見,并不是表示用戶能用肉眼看到了,而是想表達:
Activity已經顯示出來了,但是還不在前臺,所以只是可見,但不可互動,
這個可見狀態是從onStart開始,onStop結束,我們可以分為兩個階段:
- onStart到onResume,這個階段,Activity被創建,布局已加載,但是界面還沒繪制,可以說界面都不存在,
- onPause到onStop,這個階段,就是我們剛才所做的實驗,Activity有界面,只是被新的界面所遮擋,也就是不在前臺,
所以綜合兩個階段,我們把這種Activity被創建或已經顯示出來,但是不在前臺,介于兩者之間的狀態叫做 可見 狀態,
onStart 和 onResume
到此,我們知道了可見的意思,其實也就知道了另外一個問題,也就是為什么要設計出onStart和onResume這兩種狀態,
onStart和onStop,是從Activity是否可見的角度設計的,onResume和onPause,是從Activity是否位于前臺的角度設計的,
所以Activity的生命周期又可以解釋為:
被創建(onCreate)——> 可見(onStart)——> 位于前臺(onResume)——> 可見但不在前臺(onPause)
可見行程
從另外的角度看,這個可見 可以指的是 可見行程,這就涉及到行程的分類,
為了確定在記憶體不足時應該終止哪些行程,Android 會根據每個行程中運行的組件以及這些組件的狀態,將它們放入“重要性層次結構”,這些行程型別包括(按重要性排序):前臺行程,可見行程,服務流程,快取行程
這些行程是什么意思呢?
前臺行程是用戶目前執行操作所需的行程,比如 正在用戶的互動螢屏上運行一個 Activity(其 onResume() 方法已被呼叫)可見行程是正在進行用戶當前知曉的任務,比如 正在運行的 Activity 在螢屏上對用戶可見,但不在前臺(其 onPause() 方法已被呼叫)服務流程包含一個已使用 startService() 方法啟動的 Service,快取行程是目前不需要的行程,比如 當前不可見的一個或多個 Activity 實體(onStop() 方法已被呼叫并回傳)
所以Activity的生命周期又可以通過行程分為:
可見行程(onStart)——> 前臺行程(onResume)——> 可見行程(onPause)——> 快取行程(onStop)
這些行程有什么用呢?
我們都知道,在Android系統中有很多很多運行中的APP,也就代表了不同的行程,
當記憶體不夠時(達到了某個閾值),系統首先會通過onTrimMemory()回呼方法告訴應用,讓應用自己來處理低記憶體情況下的減少記憶體操作,這之后,如果記憶體還是很緊張,那么就會開始對一些行程的殺除,以釋放記憶體,這里就需要判斷行程的優先級了,從低優先級開始按順序終止行程,
所以,行程的分類作用就在這了,優先級的高低其實就代表了 終止行程的順序,也代表了對用戶的影響程度,
當然實際代碼中,行程優先級是有數字表示的,也就是ADJ,而上面說的行程型別都有相應的行程優先級數字范圍,比如:
public final class ProcessList {
//可見行程
static final int VISIBLE_APP_ADJ = 100;
// 前臺行程
static final int FOREGROUND_APP_ADJ = 0;
// 服務行程
static final int SERVICE_ADJ = 500;
// 快取行程
static final int CACHED_APP_MIN_ADJ = 900;
//...
}
再回到我們的問題上來:
其中,可見行程這里也出現了可見的概念,給出的解釋是:用戶知曉,
當我們點擊一個頁面,我們知道這個頁面將要顯示出來,也知道之前的頁面在這個頁面后面,所以這些頁面和行程都是我們所知曉的,只是不在前臺,
所以onStart表示的可見,也可以理解為可見行程,意思是這個Activity所在的行程任務已經被創建并顯示,我們知曉它,只是沒在前臺,
可互動
那么可以互動到底是發生在什么階段呢?
之前我們說過,在Activity啟動程序中,呼叫了handleResumeActivity方法,在這個方法中,呼叫了onResume方法和addView方法,完成了View的第一次繪制,并顯示到界面上,
@Override
public void handleResumeActivity() {
//onResume
final ActivityClientRecord r = performResumeActivity(token, finalStateRequest, reason);
//addView
if (r.window == null && !a.mFinished && willBeVisible) {
wm.addView(decor, l);
}
}
所以到onResume,View才被繪制出來,并顯示到前臺,
官網是這么解釋onResume的:
Activity 會在進入“已恢復”狀態時來到前臺,然后系統呼叫 onResume() 回呼,這是應用與用戶互動的狀態,應用會一直保持這種狀態,直到某些事件發生,讓焦點遠離應用,此類事件包括接到來電、用戶導航到另一個 Activity,或設備螢屏關閉,
所以可互動狀態應該是在onResume之后,也就是Activity可見并且處于前臺,
小結
總結下:
onStart狀態表示Activity可見,而可見表示的意思是Activity被創建出來了,被用戶所知曉,但是不在前臺,還沒繪制界面,所以無法互動,也可以意指其所在的行程為可見行程,
其可見之意應該和onStop一起使用,即onStart到onStop這個階段叫做 可見 階段,
而真正顯示出來可以進行互動 發生在onResume之后,也就是View繪制出來,并處于前臺的時候,
面試前做好準備戰!
接下來將分享面試的一個復習路線,如果你也在準備面試但是不知道怎么高效復習,可以參考一下我的復習路線,有任何問題也歡迎一起互相交流,加油吧!
這里給大家提供一個方向,進行體系化的學習:
1、看視頻進行系統學習
前幾年的Crud經歷,讓我明白自己真的算是菜雞中的戰斗機,也正因為Crud,導致自己技術比較零散,也不夠深入不夠系統,所以重新進行學習是很有必要的,我差的是系統知識,差的結構框架和思路,所以通過視頻來學習,效果更好,也更全面,關于視頻學習,個人可以推薦去B站進行學習,B站上有很多學習視頻,唯一的缺點就是免費的容易過時,
另外,我自己也珍藏了好幾套視頻,有需要的我也可以分享給你,
2、進行系統梳理知識,提升儲備
客戶端開發的知識點就那么多,面試問來問去還是那么點東西,所以面試沒有其他的訣竅,只看你對這些知識點準備的充分程度,so,出去面試時先看看自己復習到了哪個階段就好,
系統學習方向:
-
架構師筑基必備技能:深入Java泛型+注解深入淺出+并發編程+資料傳輸與序列化+Java虛擬機原理+反射與類加載+動態代理+高效IO
-
Android高級UI與FrameWork原始碼:高級UI晉升+Framework內核決議+Android組件內核+資料持久化
-
360°全方面性能調優:設計思想與代碼質量優化+程式性能優化+開發效率優化
-
解讀開源框架設計思想:熱修復設計+插件化框架解讀+組件化框架設計+圖片加載框架+網路訪問框架設計+RXJava回應式編程框架設計+IOC架構設計+Android架構組件Jetpack
-
NDK模塊開發:NDK基礎知識體系+底層圖片處理+音視頻開發
-
微信小程式:小程式介紹+UI開發+API操作+微信對接
-
Hybrid 開發與Flutter:Html5專案實戰+Flutter進階
知識梳理完之后,就需要進行查漏補缺,所以針對這些知識點,我手頭上也準備了不少的電子書和筆記,這些筆記將各個知識點進行了完美的總結,
3、讀原始碼,看實戰筆記,學習大神思路
“編程語言是程式員的表達的方式,而架構是程式員對世界的認知”,所以,程式員要想快速認知并學習架構,讀原始碼是必不可少的,閱讀原始碼,是解決問題 + 理解事物,更重要的:看到原始碼背后的想法;程式員說:讀萬行原始碼,行萬種實踐,
主要內含微信 MMKV 原始碼、AsyncTask 原始碼、Volley 原始碼、Retrofit原始碼、OkHttp 原始碼等等,

4、面試前夕,刷題沖刺
面試的前一周時間內,就可以開始刷題沖刺了,請記住,刷題的時候,技術的優先,演算法的看些基本的,比如排序等即可,而智力題,除非是校招,否則一般不怎么會問,
關于面試刷題,我個人也準備了一套系統的面試題,幫助你舉一反三:

還有耗時一年多整理的一系列Android學習資源:Android原始碼決議、Android第三方庫原始碼筆記、Android進階架構師七大專題學習、歷年BAT面試題決議包、Android大佬學習筆記等等,
以上這些內容均免費分享給大家,需要完整版的朋友,點這里可以看到全部內容,或者點擊 【這里】 查看獲取方式,
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/271399.html
標籤:其他
下一篇:2021新型面試題-血虐面試官斬獲位元組跳動Offer!Android 精選版面試題級答案(Android+Java+演算法+性能優化+四大組件...)
