Jetpack 之 LifeCycle 小白入手

聲明 : http://www.reibang.com/p/714062a9af75
目錄

簡(jiǎn)介
原理
使用方法

1,Activty 中使用
2,Fragment 中使用
3,service 中使用
4,Application監(jiān)聽 app 的聲明周期

?? 簡(jiǎn)介:

??LifeCycle可以幫助開發(fā)者創(chuàng)建可感知生命周期的組件,這樣, 組件便能夠在內(nèi)部管理自己的聲明周期,從而降低模塊間的耦合度,并降低內(nèi)存泄漏發(fā)生的可能性.

?? 工作原理:

??Jetpack 為我們提供了兩個(gè)類,LifecycleOwner(被觀察者)和 LifecycleObserver(觀察者).即通過觀察者模式,實(shí)現(xiàn)對(duì)頁面聲明周期的監(jiān)聽.通過源碼可以看出來,Activity 已經(jīng)默認(rèn)實(shí)現(xiàn)了 LifecycleOwner 接口,并提供了一個(gè) getLifecycle(LiftcycleObserver observer)方法,LifecycleOwner 正是通過該方法實(shí)現(xiàn)觀察者模式的.

@RestrictTo(LIBRARY_GROUP_PREFIX)
public class ComponentActivity extends Activity implements
        LifecycleOwner,
        KeyEventDispatcher.Component {
        .......
    /**
     * This is only used for apps that have not switched to Fragments 1.1.0, where this
     * behavior is provided by <code>androidx.activity.ComponentActivity</code>.
     */
    private LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);

     ......

    @CallSuper
    @Override
    protected void onSaveInstanceState(@NonNull Bundle outState) {
        mLifecycleRegistry.markState(Lifecycle.State.CREATED);
        super.onSaveInstanceState(outState);
    }
    ......
}
?? 使用方法:

1,Activty 中使用:

class MainActivity : AppCompatActivity() {
    companion object {
        const val Tag = "MainActivity"

    }

    var myLifeCycle = MyLifeCycle()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
       //將觀察者和被觀察者綁定~~~
        lifecycle.addObserver(myLifeCycle)
        Log.i(Tag, "MainAc---OnCreate")
    }

    override fun onStart() {
        super.onStart()
        Log.i(Tag, "MainAc---onStart")

    }
    //........雷同代碼不再貼出來

}

MyLifeCycle

class MyLifeCycle : LifecycleObserver {
    companion object {
        const val Tag = "MyLifeCycle"
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    fun myLifeOnCreate() {
        Log.d(Tag, "MyLifeCycle---OnCreate")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun myLifeonStart() {
        Log.d(Tag, "MyLifeCycle---onStart")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun myLifeonResume() {
        Log.d(Tag, "MyLifeCycle---onResume")
    }

   //.....雷同代碼補(bǔ)貼出來了

}

運(yùn)行一下


結(jié)果圖.png

結(jié)果圖 2.png

是不是超級(jí)簡(jiǎn)單啊,????就這樣,LifeCycle 就完美的解決了組件對(duì)生命周期的依賴問題,使組件能夠管理自己的生命周期,降低耦合度.如果與 Activity 數(shù)據(jù)有交互,那就寫一個(gè)接口,回調(diào)一下的啦~~懶了,不想寫代碼了,當(dāng)然了Fragment 同樣的使用方法,看下面

2,Fragment 中使用

class HomeFragment : Fragment() {
    var myLifeCycle = MyLifeCycle()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        myLifeCycle = MyLifeCycle()
        lifecycle.addObserver(myLifeCycle)
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
                              savedInstanceState: Bundle?): View? {
        // Inflate the layout for this fragment
        return inflater.inflate(R.layout.fragment_home, container, false)
    }
    
}

so easy~~~運(yùn)行結(jié)果截圖就不貼了哈.....因?yàn)閼?

3,service 中使用

Android提供了一個(gè)名為 LifecycleService 的類,該類繼承 Service,并實(shí)現(xiàn)了 LifecycleOwner 的接口,與 Activity/Fragment 類似,也提供了一個(gè) getLifecycle()的方法供我們使用.看下源碼

public class LifecycleService extends Service implements LifecycleOwner {

    private final ServiceLifecycleDispatcher mDispatcher = new ServiceLifecycleDispatcher(this);

    //.........
    @Override
    @NonNull
    public Lifecycle getLifecycle() {
        return mDispatcher.getLifecycle();
    }
}

好了,開始實(shí)現(xiàn)吧.

在 build.gradle 中引用

implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"

然后開擼代碼

class MyService : LifecycleService() {
    companion object {
        const val Tag = "MyService"

    }

    init {
        lifecycle.addObserver(MyLifeCycle())
    }

    override fun onCreate() {
        super.onCreate()
        Log.i(Tag, "MyService---OnCreate")
    }

    override fun onStart(intent: Intent?, startId: Int) {
        super.onStart(intent, startId)
        Log.i(Tag, "MyService---onStart")
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.i(Tag, "MyService---onDestroy")
    }
}

運(yùn)行一下


image.png

完活~
哦,別忘記,清單文件注冊(cè)一下服務(wù)


image.png

通過以上代碼可以看出來,當(dāng) Service 的聲明周期發(fā)生變化時(shí),不在需要主動(dòng)對(duì)組件進(jìn)行通知,LifecycleService很好的實(shí)現(xiàn)了組件與 Service 之間解耦.

4,Application監(jiān)聽 app 的聲明周期

LifeCycle 提供了一個(gè)名為 ProcessLifecycleOwner 的類,以便我們知道整個(gè)程序的聲明周期的情況.
Look下面.
build.gradle 文件

implementation "androidx.lifecycle:lifecycle-extensions:2.2.0"

Application:

class MyApplication : Application() {
    private val Tag = "MyApplication"
    override fun onCreate() {
        super.onCreate()
        Log.i(Tag, "MyApplication---OnCreate")
        ProcessLifecycleOwner.get().lifecycle.addObserver(MyLifeCycle())
    }
}

MyLifeCycle:
重點(diǎn)看注釋,哪些會(huì)被調(diào)用,哪些不會(huì)被調(diào)用

class MyLifeCycle : LifecycleObserver {
    companion object {
        const val Tag = "MyLifeCycle"
    }

    //在應(yīng)用程序整個(gè)聲明周期中只會(huì)被調(diào)用一次
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    fun myLifeOnCreate() {
        Log.d(Tag, "MyLifeCycle---OnCreate")
    }

    //當(dāng)應(yīng)用程序出現(xiàn)在前臺(tái)是被調(diào)用
    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    fun myLifeonStart() {
        Log.d(Tag, "MyLifeCycle---onStart")
    }

    //當(dāng)應(yīng)用程序出現(xiàn)在前臺(tái)是被調(diào)用
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun myLifeonResume() {
        Log.d(Tag, "MyLifeCycle---onResume")
    }

    //當(dāng)應(yīng)用程序出現(xiàn)退出到后臺(tái)是被調(diào)用
    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun myLifeonPause() {
        Log.d(Tag, "MyLifeCycle---onPause")
    }

    //當(dāng)應(yīng)用程序出現(xiàn)退出到后臺(tái)是被調(diào)用
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    fun myLifeonStop() {
        Log.d(Tag, "MyLifeCycle---onStop")
    }

    //永遠(yuǎn)不會(huì)被調(diào)用,系統(tǒng)不會(huì)分發(fā)調(diào)用ON_DESTROY事件
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun myLifeonDestroy() {
        Log.d(Tag, "MyLifeCycle---onDestroy")
    }
}

運(yùn)行一下

image.png

紅色框框里面的是,是我按了 home 鍵,回到桌面,然后又打開 app 的操作.
注意事項(xiàng)
??one: ProcessLifecycleOwner 是針對(duì)整個(gè)應(yīng)用程序的.
??two: Lifecycle.Event.ON_CREATE 只會(huì)被調(diào)用一次,Lifecycle.Event.ON_DESTROY永遠(yuǎn)不會(huì)調(diào)用.
??three: 當(dāng) app從后臺(tái)回到前臺(tái)時(shí),依次會(huì)走Lifecycle.Event.ON_START和Lifecycle.Event.ON_RESUME
??four: 當(dāng)app 從前臺(tái)回到后臺(tái)時(shí),會(huì)依次走Lifecycle.Event.ON_PAUSE和Lifecycle.Event.ON_STOP.
(((但是需要注意的是,這兩個(gè)調(diào)用有一定的延遲,因?yàn)橄到y(tǒng)需要為屏幕旋轉(zhuǎn),由于配置發(fā)生變化而導(dǎo)致 Acvtivty重新創(chuàng)建等情況預(yù)留一些時(shí)間,也就是說,系統(tǒng)需要保證當(dāng)設(shè)備出現(xiàn)這種情況時(shí),這兩個(gè)事件不會(huì)被調(diào)用,以為旋轉(zhuǎn)屏幕時(shí),app 沒有退到后臺(tái),只是進(jìn)入了橫屏/豎屏模式而已.)))
------->實(shí)不相瞞,括號(hào)里面的內(nèi)容我沒驗(yàn)證過,因?yàn)槲叶紡?qiáng)制豎屏或者變形,哈哈哈哈哈.??????
image.png

END

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吕粗,一起剝皮案震驚了整個(gè)濱河市毯炮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丈莺,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蜈项,死亡現(xiàn)場(chǎng)離奇詭異定硝,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)撒会,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門嘹朗,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人诵肛,你說我怎么就攤上這事屹培∧ǎ” “怎么了?”我有些...
    開封第一講書人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵褪秀,是天一觀的道長(zhǎng)蓄诽。 經(jīng)常有香客問我,道長(zhǎng)媒吗,這世上最難降的妖魔是什么仑氛? 我笑而不...
    開封第一講書人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮闸英,結(jié)果婚禮上锯岖,老公的妹妹穿的比我還像新娘。我一直安慰自己甫何,他們只是感情好出吹,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辙喂,像睡著了一般捶牢。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上加派,一...
    開封第一講書人閱讀 49,007評(píng)論 1 284
  • 那天叫确,我揣著相機(jī)與錄音影斑,去河邊找鬼蒸痹。 笑死逞盆,一個(gè)胖子當(dāng)著我的面吹牛览芳,可吹牛的內(nèi)容都是我干的面褐。 我是一名探鬼主播头镊,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼疆液,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼雳窟!你這毒婦竟也來了孽水?” 一聲冷哼從身側(cè)響起票腰,我...
    開封第一講書人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎女气,沒想到半個(gè)月后杏慰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡炼鞠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年缘滥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谒主。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡朝扼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出霎肯,到底是詐尸還是另有隱情擎颖,我是刑警寧澤榛斯,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站搂捧,受9級(jí)特大地震影響驮俗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜异旧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一意述、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吮蛹,春花似錦、人聲如沸拌屏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽倚喂。三九已至每篷,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間端圈,已是汗流浹背焦读。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留舱权,地道東北人矗晃。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像宴倍,于是被迫代替她去往敵國(guó)和親张症。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Lifecycle誕生的背景 在 Android 應(yīng)用程序的開發(fā)過程鸵贬,我們會(huì)經(jīng)常遇到這樣一個(gè)需求俗他,一個(gè)第三方或系統(tǒng)...
    林栩link閱讀 990評(píng)論 0 3
  • 簡(jiǎn)介 在 Android 系統(tǒng)中,有很多系統(tǒng)組件具備生命周期阔逼,比如Activity兆衅、Fragment、Servic...
    Whyn閱讀 861評(píng)論 0 1
  • 使用生命周期感知型組件處理生命周期 生命周期感知型組件可執(zhí)行操作來響應(yīng)另一個(gè)組件(如 Activity 和 Fra...
    有腹肌的豌豆Z閱讀 296評(píng)論 0 0
  • 我是黑夜里大雨紛飛的人啊 1 “又到一年六月嗜浮,有人笑有人哭羡亩,有人歡樂有人憂愁,有人驚喜有人失落周伦,有的覺得收獲滿滿有...
    陌忘宇閱讀 8,521評(píng)論 28 53
  • 信任包括信任自己和信任他人 很多時(shí)候夕春,很多事情,失敗专挪、遺憾及志、錯(cuò)過片排,源于不自信,不信任他人 覺得自己做不成速侈,別人做不...
    吳氵晃閱讀 6,181評(píng)論 4 8