成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

怎么理解 onStart可見但不可交互

開發(fā) 前端
onStart生命周期表示Activity可見,那為什么不能交互呢?這個問題看似簡單,但涉及到的面還是比較多的,比如Activity生命周期的理解,進程的理解,以及View繪制的時機。一起看看吧。

[[385900]]

前言

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

onStart生命周期表示Activity可見,那為什么不能交互呢?

這個問題看似簡單,但涉及到的面還是比較多的,比如Activity生命周期的理解,進程的理解,以及View繪制的時機。

一起看看吧。

onStart介紹

首先,是關(guān)于onStart生命周期的理解。

官網(wǎng)是這么介紹的:

當(dāng) Activity 進入“已開始”狀態(tài)時,系統(tǒng)會調(diào)用此回調(diào)。onStart() 調(diào)用使 Activity 對用戶可見,因為應(yīng)用會為 Activity 進入前臺并支持互動做準(zhǔn)備。

對用戶可見?

奇怪了,對用戶可見,不就是我們可以看到了嗎,為什么又不能互動呢?

更何況onStart 的時候界面都還沒繪制,該怎么理解這個可見呢?

做個小實驗

首先,科普官方定義的兩個狀態(tài)。

  • onStart到onStop中間的狀態(tài)叫做“已開始”狀態(tài)。
  • onResume到onPause中間的狀態(tài)叫做“已恢復(fù)”狀態(tài)。

然后我們做個小實驗,定義ActivityA 和 ActivityB,ActivityB為Dialog主題,ActivityA中點擊可以跳轉(zhuǎn)到B:

  1. image.setOnClickListener { 
  2.         startActivity(Intent(this, ActivityB::class.java)) 
  3.     } 
  4.  
  5.     <activity android:name=".activity.ActivityB" 
  6.         android:theme="@style/Theme.AppCompat.Light.Dialog" 
  7.         android:launchMode="standard"
  8.     </activity> 

 

進入ActivityA后,點擊按鈕,跳轉(zhuǎn)到B,這時候A的生命周期走到了onPause,也就是回到了已開始狀態(tài)。

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

ActivityA處在已開始狀態(tài),對用戶可見。

這里的可見是不是就很好理解了,確實對我們可見了,只不過 不在前臺,不能交互。

所以延伸到普通的Activity,這個可見,并不是表示用戶能用肉眼看到了,而是想表達(dá):

Activity已經(jīng)顯示出來了,但是還不在前臺,所以只是可見,但不可交互。

這個可見狀態(tài)是從onStart開始,onStop結(jié)束,我們可以分為兩個階段:

  • onStart到onResume。這個階段,Activity被創(chuàng)建,布局已加載,但是界面還沒繪制,可以說界面都不存在。
  • onPause到onStop。這個階段,就是我們剛才所做的實驗,Activity有界面,只是被新的界面所遮擋,也就是不在前臺。

所以綜合兩個階段,我們把這種Activity被創(chuàng)建或已經(jīng)顯示出來,但是不在前臺,介于兩者之間的狀態(tài)叫做 可見 狀態(tài)。

onStart 和 onResume

到此,我們知道了可見的意思,其實也就知道了另外一個問題,也就是為什么要設(shè)計出onStart和onResume這兩種狀態(tài)。

  • onStart和onStop,是從Activity是否可見的角度設(shè)計的。
  • onResume和onPause,是從Activity是否位于前臺的角度設(shè)計的。

所以Activity的生命周期又可以解釋為:

被創(chuàng)建(onCreate)——> 可見(onStart)——> 位于前臺(onResume)——> 可見但不在前臺(onPause)

可見進程

從另外的角度看,這個可見 可以指的是 可見進程。這就涉及到進程的分類。

為了確定在內(nèi)存不足時應(yīng)該終止哪些進程,Android 會根據(jù)每個進程中運行的組件以及這些組件的狀態(tài),將它們放入“重要性層次結(jié)構(gòu)”。這些進程類型包括(按重要性排序):前臺進程,可見進程,服務(wù)流程,緩存進程

這些進程是什么意思呢?

  • 前臺進程是用戶目前執(zhí)行操作所需的進程。比如 正在用戶的互動屏幕上運行一個 Activity(其 onResume() 方法已被調(diào)用)
  • 可見進程是正在進行用戶當(dāng)前知曉的任務(wù)。比如 正在運行的 Activity 在屏幕上對用戶可見,但不在前臺(其 onPause() 方法已被調(diào)用)
  • 服務(wù)流程包含一個已使用 startService() 方法啟動的 Service。
  • 緩存進程是目前不需要的進程。比如 當(dāng)前不可見的一個或多個 Activity 實例(onStop() 方法已被調(diào)用并返回)

所以Activity的生命周期又可以通過進程分為:

可見進程(onStart)——> 前臺進程(onResume)——> 可見進程(onPause)——> 緩存進程(onStop)

這些進程有什么用呢?

我們都知道,在Android系統(tǒng)中有很多很多運行中的APP,也就代表了不同的進程。

當(dāng)內(nèi)存不夠時(達(dá)到了某個閾值),系統(tǒng)首先會通過onTrimMemory()回調(diào)方法告訴應(yīng)用,讓應(yīng)用自己來處理低內(nèi)存情況下的減少內(nèi)存操作。這之后,如果內(nèi)存還是很緊張,那么就會開始對一些進程的殺除,以釋放內(nèi)存。這里就需要判斷進程的優(yōu)先級了,從低優(yōu)先級開始按順序終止進程。

所以,進程的分類作用就在這了。優(yōu)先級的高低其實就代表了 終止進程的順序,也代表了對用戶的影響程度。

當(dāng)然實際代碼中,進程優(yōu)先級是有數(shù)字表示的,也就是ADJ,而上面說的進程類型都有相應(yīng)的進程優(yōu)先級數(shù)字范圍。比如:

  1. public final class ProcessList { 
  2.     //可見進程 
  3.     static final int VISIBLE_APP_ADJ = 100; 
  4.  
  5.     // 前臺進程 
  6.     static final int FOREGROUND_APP_ADJ = 0; 
  7.  
  8.     // 服務(wù)進程 
  9.     static final int SERVICE_ADJ = 500; 
  10.  
  11.     // 緩存進程 
  12.     static final int CACHED_APP_MIN_ADJ = 900; 
  13.  
  14.     //... 

再回到我們的問題上來:

其中,可見進程這里也出現(xiàn)了可見的概念,給出的解釋是:用戶知曉。

當(dāng)我們點擊一個頁面,我們知道這個頁面將要顯示出來,也知道之前的頁面在這個頁面后面。所以這些頁面和進程都是我們所知曉的,只是不在前臺。

所以onStart表示的可見,也可以理解為可見進程,意思是這個Activity所在的進程任務(wù)已經(jīng)被創(chuàng)建并顯示,我們知曉它,只是沒在前臺。

可交互

那么可以交互到底是發(fā)生在什么階段呢?

之前我們說過,在Activity啟動過程中,調(diào)用了handleResumeActivity方法。在這個方法中,調(diào)用了onResume方法和addView方法,完成了View的第一次繪制,并顯示到界面上。

  1. @Override 
  2.  public void handleResumeActivity() { 
  3.      //onResume 
  4.      final ActivityClientRecord r = performResumeActivity(token, finalStateRequest, reason); 
  5.      //addView 
  6.      if (r.window == null && !a.mFinished && willBeVisible) { 
  7.          wm.addView(decor, l); 
  8.      } 
  9.  }    

所以到onResume,View才被繪制出來,并顯示到前臺。

官網(wǎng)是這么解釋onResume的:

Activity 會在進入“已恢復(fù)”狀態(tài)時來到前臺,然后系統(tǒng)調(diào)用 onResume() 回調(diào)。這是應(yīng)用與用戶互動的狀態(tài)。應(yīng)用會一直保持這種狀態(tài),直到某些事件發(fā)生,讓焦點遠(yuǎn)離應(yīng)用。此類事件包括接到來電、用戶導(dǎo)航到另一個 Activity,或設(shè)備屏幕關(guān)閉。

所以可交互狀態(tài)應(yīng)該是在onResume之后,也就是Activity可見并且處于前臺。

小結(jié)

總結(jié)下:

onStart狀態(tài)表示Activity可見,而可見表示的意思是Activity被創(chuàng)建出來了,被用戶所知曉,但是不在前臺,還沒繪制界面,所以無法交互。也可以意指其所在的進程為可見進程。

其可見之意應(yīng)該和onStop一起使用,即onStart到onStop這個階段叫做 可見 階段。

而真正顯示出來可以進行交互 發(fā)生在onResume之后,也就是View繪制出來,并處于前臺的時候。

參考

《Android開發(fā)藝術(shù)探索》 https://juejin.cn/post/6896751245722615815 https://juejin.cn/post/6891911483379482637

本文轉(zhuǎn)載自微信公眾號「碼上積木」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請聯(lián)系碼上積木公眾號。

 

責(zé)任編輯:武曉燕 來源: 碼上積木
相關(guān)推薦

2015-02-05 09:29:25

Android 5.1

2015-02-10 11:15:46

Android 5.1Google

2021-01-29 09:58:55

MySQL數(shù)據(jù)庫

2015-08-20 14:30:42

云計算云趨勢

2010-07-08 13:38:42

SQL Server不

2015-06-25 13:29:21

2021-07-14 14:24:14

Python密碼程序員

2021-10-08 07:53:01

Go 尋址元素

2009-07-06 18:36:21

linux要求可寫但不可刪

2020-08-26 09:58:56

AI 數(shù)據(jù)人工智能

2013-10-21 15:20:27

Linux命令cat 命令

2014-12-18 09:55:09

2011-04-01 14:43:14

SQL Server不可見字符

2011-04-21 13:01:15

visibilitydisplay

2022-04-25 11:44:58

數(shù)據(jù)隱私安全

2021-05-08 19:33:51

移除字符零寬

2009-10-14 16:46:25

VB.NET OnSt

2020-12-09 13:20:22

數(shù)據(jù)科學(xué)技能數(shù)據(jù)科學(xué)家

2021-07-22 23:04:41

區(qū)塊鏈數(shù)據(jù)技術(shù)

2023-05-17 08:52:56

Java原子性可見性
點贊
收藏

51CTO技術(shù)棧公眾號

主站蜘蛛池模板: 国产一区二区视频在线观看 | www日本在线播放 | 日韩欧美操 | 欧美成视频 | 国产精产国品一二三产区视频 | 日韩中文字幕一区 | 国产成人高清视频 | 欧美在线视频一区二区 | 国产高清免费视频 | 日韩视频精品在线 | 91免费小视频 | 99re在线免费视频 | 国产做爰| 欧美日日| 日韩电影一区二区三区 | 国产日韩欧美在线 | 99久久婷婷国产亚洲终合精品 | 日韩精品在线一区 | 亚洲精品视频导航 | 在线观看中文字幕 | 精品久久久久久亚洲精品 | 欧美色专区 | 狠狠干狠狠操 | 99精品视频网 | 天天曰夜夜操 | 婷婷免费视频 | 亚洲一区二区三区四区五区午夜 | 日韩看片| 久久久www成人免费无遮挡大片 | 三级黄色片在线播放 | 91欧美激情一区二区三区成人 | 欧美精品一区二区三区在线播放 | 亚洲一区二区三区视频 | 日韩一区av | 天堂在线91 | 久久久久久亚洲精品不卡 | 欧美精品一区二区三区在线播放 | 久久美女网 | 四虎成人精品永久免费av九九 | 国产线视频精品免费观看视频 | 国产日产久久高清欧美一区 |