成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

Android 初級面試者拾遺(前臺界面篇)之 Activity 和 Fragment

BlackHole1 / 930人閱讀

摘要:四種狀態(tài)運(yùn)行狀態(tài)暫停狀態(tài)停止?fàn)顟B(tài)銷毀狀態(tài)運(yùn)行狀態(tài)處于返回棧的棧頂位置,正在運(yùn)行與用戶發(fā)生著交互,系統(tǒng)不愿回收此種狀態(tài)的。和都是為了解決重復(fù)創(chuàng)建問題,的作用域是棧頂,的作用域是整個(gè)返回棧。

Context

Android 系統(tǒng)組件不同于普通類對象,能夠直接創(chuàng)建實(shí)例,需要各自的上下文環(huán)境——Context。
Context 上下文環(huán)境確保 Android 系統(tǒng)組件(Activity、Service、BroadcastReceiver)能夠正常工作。

Context 大致分為三種類型(通??梢酝ㄓ茫?/p>

Application

Activity

Service

getApplication() = getApplicationContext() = Application
getApplicationContext() 方法的作用域更廣,任何一個(gè) Context 實(shí)例(Activity, Service)通過調(diào)用 getApplicationContext() 方法都可以獲取到 Application。

ContextWrapper 抽象接口類

ContextImpl 具體實(shí)現(xiàn)類

ContextWrapper 中的方法通過組合委托方式交由 ContextImpl 具體實(shí)現(xiàn)。
getBaseContext() = ContextImpl

Context 數(shù)量計(jì)算公式:
Context 數(shù)量 = Activity 數(shù)量 + Service 數(shù)量 + 1(Application)

Activity Activity 返回棧

Android 使用任務(wù)(Task)返回棧(Back Stack)管理 Activity,任務(wù)是一組存放在棧(后進(jìn)先出)里的 Activity 集合。

返回棧管理 Activity 的入棧出棧操作,例如:啟動(dòng)新的 Activity 執(zhí)行入棧操作;Back 鍵返回或調(diào)用 finish() 方法,銷毀 Activity 執(zhí)行出棧操作。

系統(tǒng)總是顯示處于棧頂?shù)?Activity。

任務(wù)(Task)從前臺移至后臺時(shí),返回棧中所有的 Activity 都會(huì)進(jìn)入停止?fàn)顟B(tài),但是各個(gè) Activity 在棧中的順序都會(huì)原封不動(dòng)保留。

Activity 四種狀態(tài)

運(yùn)行狀態(tài)

暫停狀態(tài)

停止?fàn)顟B(tài)

銷毀狀態(tài)

運(yùn)行狀態(tài)

Activity 處于返回棧的棧頂位置,正在運(yùn)行與用戶發(fā)生著交互,系統(tǒng)不愿回收此種狀態(tài)的 Activity。

暫停狀態(tài)

Activity 不再處于返回棧的棧頂位置,但是依然可見,并非每個(gè) Activity 都會(huì)占滿屏幕,例如對話框形式的 Activity 只是占據(jù)部分區(qū)域,其后面的 Activity 是可見的。系統(tǒng)同樣不愿回收此種狀態(tài)的 Activity,除非在內(nèi)存嚴(yán)重不足的情況下,才考慮回收此種狀態(tài)的 Activity。

停止?fàn)顟B(tài)

Activity 不再處于返回棧的棧頂位置,并且完全處于不可見狀態(tài),系統(tǒng)仍然會(huì)保存停止?fàn)顟B(tài)的 Activity 的成員變量,但并不可靠,當(dāng)其他地方需要內(nèi)存時(shí),系統(tǒng)可能回收此種狀態(tài)的 Activity,保證內(nèi)存充足。

銷毀狀態(tài)

Activity 從返回棧出棧變?yōu)殇N毀狀態(tài),系統(tǒng)樂于回收此種狀態(tài)的 Activity,保證內(nèi)存充足。

Activity 生命周期回調(diào)方法

onCreate()

onStart()

onResume()

onPause()

onStop()

onDestroy()

onRestart()

onCreate() 方法在 Activity 第一次被創(chuàng)建的時(shí)候調(diào)用,完成 Activity 初始化操作,例如加載布局、綁定事件...。
onStart() 方法在 Activity 由不可見變?yōu)榭梢姷臅r(shí)候調(diào)用。
onResume() 方法在 Activity 準(zhǔn)備好與用戶進(jìn)行交互的時(shí)候調(diào)用。
onPause() 方法在系統(tǒng)準(zhǔn)備啟動(dòng)或者恢復(fù)另一個(gè) Activity 的時(shí)候調(diào)用。
onStop() 方法在 Activity 由可見變?yōu)椴豢梢姷臅r(shí)候調(diào)用。
onDestroy() 方法在 Activity 銷毀之前調(diào)用。
onRestart() 方法在 Activity 由停止?fàn)顟B(tài)變?yōu)檫\(yùn)行狀態(tài)的時(shí)候調(diào)用。

onPause() ——> onResume() 暫停狀態(tài)向運(yùn)行狀態(tài)切換。對話框式 Activity 無法占滿屏幕,其后面的 Activity 依然可見。

Activity 回收情況

Activity 執(zhí)行 onStop() 方法,處于停止?fàn)顟B(tài)(不可見),可能被系統(tǒng)回收。
若系統(tǒng)內(nèi)存充足,保留 Activity 狀態(tài)數(shù)據(jù),當(dāng)用戶再次返回 Activity,執(zhí)行 onRestart() 方法。
若系統(tǒng)內(nèi)存不足,將 Activity 回收,用戶再次返回 Activity,執(zhí)行 onCreate() 而非 onRestart()。

Activity 提供 onSaveInstanceState() 回調(diào)方法,保證在 Activity 被回收之前調(diào)用此方法,保存臨時(shí)數(shù)據(jù)。隨后可以在 Activity onCreate(Bundle savedInstanceState) 方法恢復(fù)數(shù)據(jù)。

完整生存期:onCreate() ——> onDestroy()

可見生存期:onStart() ——> onStop()

前臺生存期:onResume() ——> onPause()

Activity 啟動(dòng)模式

定義啟動(dòng)模式

使用 AndroidManifest.xml 文件指定 標(biāo)簽的 android:launchMode 屬性。

調(diào)用 startActivity() 方法時(shí)使用 Intent FLAG 參數(shù)。
Intent 中定義的啟動(dòng)模式 FLAG 將會(huì)覆蓋 AndroidManifest.xml 文件中的定義。

standard

singleTop

singleTask

singleInstance

standard 模式不在乎一個(gè) Activity 是否已經(jīng)存在于返回棧之中,每次啟動(dòng)都會(huì)創(chuàng)建新的 Activity 放入返回棧中。

singleTop 模式啟動(dòng) Activity 時(shí),如果當(dāng)前返回棧的棧頂位置已是該類型 Activity,則無需創(chuàng)建新的實(shí)例,直接使用棧頂位置的 Activity。如果該類型 Activity 存在于返回棧中,但并非處于棧頂位置,還是會(huì)創(chuàng)建新的 Activity 實(shí)例。

singleTask 模式啟動(dòng) Activity 時(shí),如果當(dāng)前返回棧中存在該類型 Activity,則直接使用該 Activity 實(shí)例,并將這個(gè) Activity 實(shí)例之上的 Activity 統(tǒng)統(tǒng)出棧。如果整個(gè)返回棧中不存在該類型 Activity,還是會(huì)創(chuàng)建新的 Activity 實(shí)例。

singleTop 和 singleTask 都是為了解決重復(fù)創(chuàng)建 Activity 問題,singleTop 的作用域是棧頂,singleTask 的作用域是整個(gè)返回棧。

singleInstance 創(chuàng)建活動(dòng)到獨(dú)立返回棧,從而實(shí)現(xiàn)不同程序可以共享 Activity 實(shí)例。

taskAffinity 參數(shù)用于指定 Activity 依附于哪個(gè)任務(wù)。

Activity 啟動(dòng)流程

ActivityManagerService,負(fù)責(zé)系統(tǒng)中所有的 Activity 的生命周期。
ActivityThread,App 真正的入口,執(zhí)行 main() 方法,初始化主線程的消息循環(huán)隊(duì)列。
Zygote,Linux 系統(tǒng)所有進(jìn)程均是由 “init“ 進(jìn)程拷貝(fork)而來。

點(diǎn)擊應(yīng)用圖標(biāo) Launcher 程序?qū)Ⅻc(diǎn)擊事件轉(zhuǎn)換為 startActivity(intent),通過 Binder IPC 路由通知 ActivityManagerService。ActivityManagerService 首先通過 PackageManager 收集 intent 信息,然后檢查是否具有喚醒組件的權(quán)限,開啟新的 TASK(FLAG_ACTIVITY_NEW_TASK),最后創(chuàng)建進(jìn)程去實(shí)例化組件。

創(chuàng)建進(jìn)程過程:
ActivityManagerService Process.start() 由 Zygote 進(jìn)程(Linux init 進(jìn)程)孵化出應(yīng)用進(jìn)程,并實(shí)例化 ActivityThread(主線程/UI 線程)對象執(zhí)行 main() 方法,初始化主線程的 Looper、Handler,開啟消息循環(huán)隊(duì)列,無限等待消息到來(Looper.loop())。

綁定應(yīng)用過程:
bindApplication() 方法發(fā)送 BIND_APPLICATION 消息到消息循環(huán)隊(duì)列,關(guān)聯(lián)(attach)創(chuàng)建的進(jìn)程和應(yīng)用程序。加載應(yīng)用程序 Class 到線程私有內(nèi)存空間。

啟動(dòng) Activity 過程:
realStartActivity() 發(fā)送 LAUNCH_ACTIVITY 消息到消息循環(huán)隊(duì)列,啟動(dòng) Activity 管理自身生命周期,首先回調(diào) onCreate() 方法。

scheme 頁面跳轉(zhuǎn)協(xié)議

自定義 scheme 協(xié)議以便跳轉(zhuǎn)至 App 期望到達(dá)的各個(gè)頁面,可由服務(wù)端定制化。

原生 App 頁面

HTML5 頁面

其他 App 頁面

Fragment

Fragment 是一種可以嵌入在 Activity 中的 UI 片段,就好像是 mini Activity 同樣包含布局,并擁有自己的生命周期。Android 引入 Fragment 概念,力求在開發(fā)過程中同時(shí)兼顧手機(jī)和平板屏幕的大小。

Fragment 結(jié)合 Activity 使用方式

靜態(tài)創(chuàng)建方式和動(dòng)態(tài)創(chuàng)建方式

在布局中靜態(tài)添加 標(biāo)簽,通過 android:name 屬性指定 Fragment 類名。

在程序運(yùn)行時(shí)動(dòng)態(tài)地添加 Fragment 到 Activity 中。

動(dòng)態(tài)添加過程:

創(chuàng)建 Fragment 實(shí)例

獲取 FragmentManager,在 Activity 中通過 getSupportFragmentManager() 方法可以得到。

FragmentManager 開啟事務(wù) FragmentTransaction

FragmentTransaction 向布局中的指定容器(ViewGroup)添加或替換(replace) Fragment

提交事務(wù) FragmentTransaction.commit()

FragmentTransaction add()、replace() 方法區(qū)別

不同之處在于,是否清空容器后再添加 Fragment,replace() 會(huì)清空而 add() 不會(huì)。通常 add() 方法需要配合 hide()remove() 方法一起使用,而 replace() 方法一般多帶帶使用。

transaction.replace(viewId, fragment);

等價(jià)操作:

transaction.add(viewId, fragment);
transaction.show(fragment);
transaction.hide(preFragment);
transaction.remove(preFragment);
Fragment 通信方式

Activity 調(diào)用 Fragment 方法:Activity FragmentManager findFragmentById() 方法獲取 Fragment 實(shí)例。

Fragment 調(diào)用 Activity 方法:Fragment getActivity() 方法獲取 Activity 實(shí)例。

Fragment 調(diào)用 Fragment 方法:Activity 作為中介。

Fragment 返回棧

FragmentTransaction 提供 addToBackStack() 方法,可以添加事務(wù)到返回棧中。根據(jù)應(yīng)用需求決定是否使用 addToBackStack() 方法。例如 Back 鍵返回時(shí)顯示上一次 FragmentTransaction 記錄結(jié)果,則需事先調(diào)用 addToBackStack() 方法。

addToBackStack() 方法保存的是一系列針對 FragmentTransaction 的操作記錄。

Fragment 四種狀態(tài)

運(yùn)行狀態(tài)

暫停狀態(tài)

停止?fàn)顟B(tài)

銷毀狀態(tài)

運(yùn)行狀態(tài):Fragment 所關(guān)聯(lián)的 Activity 處于運(yùn)行狀態(tài)

暫停狀態(tài):Fragment 所關(guān)聯(lián)的 Activity 處于暫停狀態(tài)

停止動(dòng)態(tài):當(dāng) Activity 進(jìn)入停止?fàn)顟B(tài)時(shí),與它相關(guān)聯(lián)的 Fragment 就會(huì)進(jìn)入停止?fàn)顟B(tài)。或者通過調(diào)用 FragmentTransaction 的 remove()、replace() 方法將 Fragment 從 Activity 中移除,但在事務(wù)提交之前調(diào)用 addToBackStack() 方法,這時(shí) Fragment 也會(huì)進(jìn)入停止?fàn)顟B(tài)。

銷毀狀態(tài):Fragment 依附于 Activity 而存在,因此 Activity 銷毀,與它相關(guān)聯(lián)的 Fragment 就會(huì)進(jìn)入銷毀狀態(tài)?;蛘咄ㄟ^調(diào)用 FragmentTransaction 的 remove()、replace() 方法將 Fragment 從 Activity 中移除,但在事務(wù)提交之前沒有調(diào)用 addToBackStack() 方法,這時(shí) Fragment 也會(huì)進(jìn)入銷毀狀態(tài)。

Fragment 生命周期回調(diào)方法

onAttach()

onCreate()

onCreateView()

onActivityCreated()

onStart()

onResume()

onPause()

onStop()

onDestroyView()

onDestroy()

onDetach()

onRestart()

除了與 Activity 相同的生命周期回調(diào)方法之外,F(xiàn)ragment 還附加幾個(gè)回調(diào)方法。

onAttach():當(dāng) Fragment 和 Activity 建立關(guān)聯(lián)的時(shí)候調(diào)用
onCreateView():為 Fragment 創(chuàng)建視圖(加載布局)的時(shí)候調(diào)用
onActivityCreated():確保 Fragment 和關(guān)聯(lián)的 Activity 都創(chuàng)建完畢
onDestroyView():當(dāng) Fragment 移除視圖結(jié)構(gòu)的時(shí)候調(diào)用
onDetach():當(dāng) Fragment 和 Activity 解除關(guān)聯(lián)的時(shí)候調(diào)用

與 Activity 生命周期協(xié)調(diào)一致

Fragment 與 ViewPager 組合使用

ViewPager extends ViewGroup,允許用戶左右滑動(dòng)(幻燈片效果)瀏覽視圖,并根據(jù)提供的 PagerAdapter 填充數(shù)據(jù)。

FragmentPagerAdapter 與 FragmentStatePagerAdapter 的區(qū)別

ViewPager 提供兩種頁面適配器(PagerAdapter)來管理不同的 Fragment 之間滑動(dòng)切換。

FragmentPagerAdapter:ViewPager 中的所有 Fragment 實(shí)例常駐內(nèi)存,當(dāng) Fragment 變得不可見時(shí)僅銷毀視圖結(jié)構(gòu),即調(diào)用 onDestroyView() 方法。由于 FragmentPagerAdapter 內(nèi)存消耗較大,所以適合少量靜態(tài)頁面的場景。

FragmentStatePagerAdapter:當(dāng) Fragment 變得不可見時(shí),不僅銷毀視圖層次,F(xiàn)ragment 實(shí)例也被銷毀,即調(diào)用了 onDestroyView()onDestroy() 方法,僅保存 Fragment 狀態(tài)。相比而言, FragmentStatePagerAdapter 內(nèi)存占用較小,所以適合大量動(dòng)態(tài)頁面的場景。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/72022.html

相關(guān)文章

  • Android 初級面試拾遺前臺界面 View ViewGroup

    摘要:層面中可以通過方法攔截事件傳遞,返回代表同一事件列不再向下傳遞給子,返回代表事件繼續(xù)傳遞,默認(rèn)返回。同時(shí)注冊兩者事件傳遞順序,方法將會(huì)先于方法執(zhí)行,并且方法可能執(zhí)行多次事件。如此反復(fù)執(zhí)行初始化布局繪制過程容易造成性能問題。 View 和 ViewGroup View 是 Android 中最基本的 UI 組件,在屏幕上繪制一塊矩形區(qū)域。 ViewGroup 是一種特殊的 View,它...

    malakashi 評論0 收藏0
  • Android 初級面試拾遺前臺界面 View ViewGroup

    摘要:層面中可以通過方法攔截事件傳遞,返回代表同一事件列不再向下傳遞給子,返回代表事件繼續(xù)傳遞,默認(rèn)返回。同時(shí)注冊兩者事件傳遞順序,方法將會(huì)先于方法執(zhí)行,并且方法可能執(zhí)行多次事件。如此反復(fù)執(zhí)行初始化布局繪制過程容易造成性能問題。 View 和 ViewGroup View 是 Android 中最基本的 UI 組件,在屏幕上繪制一塊矩形區(qū)域。 ViewGroup 是一種特殊的 View,它...

    Juven 評論0 收藏0
  • Android 初級面試拾遺前臺界面 ListView RecyclerView

    摘要:方法根據(jù)子項(xiàng)所處的位置判斷具體類型并返回。調(diào)用方法解除子項(xiàng)與之間的關(guān)聯(lián)。自定義適配器適配器繼承自,并將泛型指定為內(nèi)部類。使用支持多種布局方式借助能夠靈活地將列表控件放入不同的容器。 ListView 和 RecyclerView 最常用和最難用的控件 由于手機(jī)屏幕空間有限,無法顯示全部內(nèi)容。當(dāng)有大量數(shù)據(jù)需要展示的時(shí)候,借助列表控件。通過手指上下滑動(dòng),使得屏幕內(nèi)外的數(shù)據(jù)不斷進(jìn)出。 最基本...

    MartinDai 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<