前言
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保存圖片下載請求并且綁定生命周期