Android開發(fā)技術(shù)之HeadlessFragment

前言

Android開發(fā)技術(shù)系列主要介紹一些日常開發(fā)中常用的開發(fā)技術(shù),他們通常是完成特定目標的方法的最佳實踐,被廣泛使用,但因為屬于技術(shù)細節(jié),很少有人會專門來講這些,這里將這些技術(shù)整理總結(jié)并歸納,以造福廣大開發(fā)者,喜歡的點個關(guān)注吧。

簡介

今天要將的HeadlessFragment你可能沒有聽過,但絕對用到過,因為太多優(yōu)秀的開源庫都使用了這個技術(shù)。例如
tbruyelle/RxPermissions
bumptech/glide
jetpack中的viewModel實際上是這種思想的一個變種

什么是HeadlessFragment

headless的意思就是沒有顯示,例如虛擬機支持headless方式啟動,啟動后沒有ui界面,只能通過遠程訪問,這在一些沒有ui交互、對新能要求較高的使用場景很有用。
Fragment我們通常用來顯示一個view,F(xiàn)ragment工作像是一個view controller,其實我們可以在onCreateView的時候不創(chuàng)建view,直接返回null也是可以的。Fragment還有另外一個特性,就是他在創(chuàng)建的時候可以設(shè)置一個屬性叫retainInstance,設(shè)置為true之后,在activity銷毀重建的時候當前Fragment不會被銷毀而是從新attach到新的activity中。
所以滿足下面兩個條件的Fragment被成為HeadlessFragment:

  • onCreateView 方法返回null
  • retainInstance == true

例如:

class HeadlessFragment : Fragment() {
    init {
        retainInstance = true
    }
    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        return null
    }
}

為什么要HeadlessFragment

在Android開發(fā)中有一個經(jīng)常遇到的問題就是Activity的自動銷毀重建機制。屏幕旋轉(zhuǎn)或者其他配置改變都會自動銷毀重建,那所謂saveInstance方式其實很惡心,因為很多東西是無法序列化的,例如一個listener, 很大的bitmap,隨著業(yè)務的復雜,saveInstance方式也極易出錯
設(shè)想以下場景:

  • 一個網(wǎng)絡請求正在被執(zhí)行,這時候Activity旋轉(zhuǎn)了?
  • fragment 與fragment通信,fragment與activity通信

HeadlessFragment解決了什么問題

解決了Activity自動銷毀重建的狀態(tài)保存問題,例如RxPermissions使用一個headlessFragment作為中轉(zhuǎn),glide使用headlessFragment保存圖片下載請求并且綁定生命周期

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容