JetPack組件之Lifecycle

一直以來(lái)腕铸,Android開(kāi)發(fā)都充斥了大量的不規(guī)范的操作和重復(fù)代碼姨拥,比如生命周期的管理甲脏,開(kāi)發(fā)過(guò)程的重復(fù),項(xiàng)目架構(gòu)的選擇等等仅淑。谷歌IO大會(huì)上似芝,Google官方向推出了 Jetpack悠反,旨在讓開(kāi)發(fā)者們能夠更好铺然,更快疙渣,更規(guī)范地開(kāi)發(fā)出優(yōu)質(zhì)應(yīng)用。

1. 作用

Lifecycle 是 Android Jetpack 的一部分俗冻,是生命周期感知型組件礁叔,可執(zhí)行操作來(lái)響應(yīng)另一個(gè)組件(Activity 和 Fragment)的生命周期狀態(tài)的變化。Lifecycle是一個(gè)類迄薄,用于存儲(chǔ)有關(guān)組件(如 Activity 或 Fragment)的生命周期狀態(tài)的信息晴圾,并允許其他對(duì)象觀察此狀態(tài)。

  • 被觀察者:LifecycleOwner
  • 觀察者:LifecycleObserver

在新 SDK 中噪奄,Acticity、Fragment 人乓、LifecycleService默認(rèn)實(shí)現(xiàn)了 LifecycleOwner 接口(也可自己實(shí)現(xiàn))勤篮,觀察者只需要實(shí)現(xiàn) LifecycleObserver 接口。

2.如何使用色罚?

1. 使用方式

Lifecycle 有三種實(shí)現(xiàn)方法:

  • LifecycleObserver 配合注解
  • FullLifecyclerObserver 擁有宿主所有生命周期事件
  • LifecycleEventObserver宿主生命周期事件封裝成 Lifecycle.Event

2.使用場(chǎng)景

場(chǎng)景一: 使用 LifeCycle 解耦頁(yè)面與組件

以定位功能為案例碰缔,我們正常使用定位功能時(shí)都是在Avtivity的OnStart() 中開(kāi)啟定位,在OnStop()中關(guān)閉定位戳护。而使用LifeCycle可以感知宿主的能力進(jìn)行解耦金抡。

// gradle依賴添加
implementation 'androidx.appcompat:appcompat:1.2.0'
public class LocationListener implements LifecycleObserver {
    private static String TAG = "MyVideoPlayListener";

    //  被注解標(biāo)記過(guò)的方法便會(huì)自動(dòng)調(diào)用
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    private void startLocation(){
        Log.i(TAG,"開(kāi)啟定位");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    private void stopLocation(){
        Log.i(TAG,"關(guān)閉定位");
    }
}
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        LocationListener listener = new LocationListener();
        getLifecycle().addObserver(listener);
    }
}

場(chǎng)景二:使用 LifecycleService 解耦 Service 與組件

LifecycleService 就是用來(lái)監(jiān)聽(tīng)和解耦 Service 組件的,它繼承了Service類的同時(shí)也實(shí)現(xiàn)了LifecycleOwner 接口腌且。

// gradle依賴添加
implementation "androidx.lifecycle:lifecycle-service:2.2.0"
public class ServiceLocationListener implements LifecycleObserver {
    private static String TAG = "MyVideoPlayListener";

    //  被注解標(biāo)記過(guò)的方法便會(huì)自動(dòng)調(diào)用
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    private void startLocation(){
        Log.i(TAG,"開(kāi)啟定位");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    private void stopLocation(){
        Log.i(TAG,"關(guān)閉定位");
    }
}
public class MyService extends LifecycleService {
    private ServiceLocationListener myServiceObserver;

    public MyService(){
        myServiceObserver = new ServiceLocationListener();
        getLifecycle().addObserver(myServiceObserver);
    }
}
場(chǎng)景三:使用 ProcessLifecycleOwner 監(jiān)聽(tīng)?wèi)?yīng)用程序的生命周期

具有生命周期的組件除了 Activity梗肝、Fragment 和 Service 外,還有 Application铺董。ProcessLifecycleOwner 就是用來(lái)監(jiān)聽(tīng)整個(gè)應(yīng)用程序的生命周期情況巫击。

// gradle依賴添加
implementation "androidx.lifecycle:lifecycle-process:2.2.0"
public class ApplicationObserver implements LifecycleObserver {
    private String TAG = this.getClass().getName();

    /**
     * 在應(yīng)用程序的整個(gè)生命周期中只會(huì)被調(diào)用一次
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void onCreate() {
        Log.d(TAG,"Lifecycle.Event.ON_CREATE");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onStart() {
        Log.d(TAG,"Lifecycle.Event.ON_START");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void onResume() {
        Log.d(TAG,"Lifecycle.Event.ON_RESUME");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void onPause() {
        Log.d(TAG,"Lifecycle.Event.ON_PAUSE");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void onStop() {
        Log.d(TAG,"Lifecycle.Event.ON_STOP");
    }

    /**
     * 永遠(yuǎn)不會(huì)被調(diào)用,系統(tǒng)不會(huì)分發(fā)調(diào)用 ON_DESTROY 事件
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void onDestroy() {
        Log.d(TAG,"Lifecycle.Event.ON_DESTROY");
    }
}
public class App extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        ProcessLifecycleOwner.get().getLifecycle().addObserver(new ApplicationObserver());
    }
}

注意事項(xiàng):

  • ProcessLifecycleOwner 是針對(duì)整個(gè)應(yīng)用程序的監(jiān)聽(tīng)精续,與 Activity 的數(shù)量無(wú)關(guān)坝锰。
  • Lifecycle.Event.ON_CREATE 只會(huì)被調(diào)用一次,而 Lifecycle.Event.ON_DESTROY 永遠(yuǎn)不會(huì)被調(diào)用重付。
  • Lifecycle.Event.ON_PAUSE 和 Lifecycle.Event.ON_STOP 的調(diào)用會(huì)有一定的延后顷级,因?yàn)橄到y(tǒng)需要為“屏幕旋轉(zhuǎn),由于配置發(fā)生變化而導(dǎo)致的 Activity 重新創(chuàng)建” 的情況預(yù)留一些時(shí)間确垫。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末弓颈,一起剝皮案震驚了整個(gè)濱河市帽芽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌恨豁,老刑警劉巖嚣镜,帶你破解...
    沈念sama閱讀 221,198評(píng)論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異橘蜜,居然都是意外死亡菊匿,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)计福,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)跌捆,“玉大人,你說(shuō)我怎么就攤上這事象颖∨搴瘢” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,643評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵说订,是天一觀的道長(zhǎng)抄瓦。 經(jīng)常有香客問(wèn)我,道長(zhǎng)陶冷,這世上最難降的妖魔是什么钙姊? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,495評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮埂伦,結(jié)果婚禮上煞额,老公的妹妹穿的比我還像新娘。我一直安慰自己沾谜,他們只是感情好膊毁,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,502評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著基跑,像睡著了一般婚温。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上涩僻,一...
    開(kāi)封第一講書(shū)人閱讀 52,156評(píng)論 1 308
  • 那天缭召,我揣著相機(jī)與錄音,去河邊找鬼逆日。 笑死嵌巷,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的室抽。 我是一名探鬼主播搪哪,決...
    沈念sama閱讀 40,743評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼坪圾!你這毒婦竟也來(lái)了晓折?” 一聲冷哼從身側(cè)響起惑朦,我...
    開(kāi)封第一講書(shū)人閱讀 39,659評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎漓概,沒(méi)想到半個(gè)月后漾月,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,200評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡胃珍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,282評(píng)論 3 340
  • 正文 我和宋清朗相戀三年梁肿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片觅彰。...
    茶點(diǎn)故事閱讀 40,424評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡吩蔑,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出填抬,到底是詐尸還是另有隱情烛芬,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評(píng)論 5 349
  • 正文 年R本政府宣布飒责,位于F島的核電站赘娄,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏宏蛉。R本人自食惡果不足惜擅憔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,789評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望檐晕。 院中可真熱鬧,春花似錦蚌讼、人聲如沸辟灰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,264評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)芥喇。三九已至,卻和暖如春凰萨,著一層夾襖步出監(jiān)牢的瞬間继控,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,390評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工胖眷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留武通,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,798評(píng)論 3 376
  • 正文 我出身青樓珊搀,卻偏偏與公主長(zhǎng)得像冶忱,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子境析,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,435評(píng)論 2 359

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