JetPack學習筆記之LifeCyCle(二)

JetPack學習筆記之LifeCyCle(二)

上文介紹了使用LifeCycle監(jiān)聽Activity和Service生命周期變化的方法逝嚎,本文介紹監(jiān)聽Service和Application的生命周期的方法泥张。

1、監(jiān)聽Service的生命周期

要監(jiān)聽Service的生命周期坪郭,需要先引入依賴

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

在創(chuàng)建Service時,將父類修改為LifecycleService脉幢,其繼承了Service并實現(xiàn)了LifecycleOwner接口歪沃,所以創(chuàng)建的Service作為被觀察者。

public class LifecycleService extends Service implements LifecycleOwner

完整代碼如下所示:

public class MyService extends LifecycleService {
    private static final String TAG = "MyService";
    private MyServiceObserver myServiceObserver;
    public MyService(){
        myServiceObserver = new MyServiceObserver();
        getLifecycle().addObserver(myServiceObserver);
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG,"onCreate");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG,"onDestroy");
    }
}




/**
 * 項目名稱 JetPackPro
 * 創(chuàng)建人 xiaojinli
 * 創(chuàng)建時間 2020/8/5 11:17 AM
 **/
public class MyServiceObserver implements LifecycleObserver {
    private static final String TAG = "MyServiceObserver";

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void startService(){
        Log.d(TAG,"在MyServiceObserver中監(jiān)聽到Service啟動 ");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void stopService(){
        Log.d(TAG,"在MyServiceObserver中監(jiān)聽到Service停止 ");
    }
}

在Activity中創(chuàng)建兩個按鈕嫌松,一個啟動Service沪曙,一個停止Service。

    ///啟動Service
    public void startService(View view) {
        Intent intent = new Intent(LocationActivity.this,MyService.class);
        startService(intent);
    }

    //關閉Service
    public void stopService(View view) {
        Intent intent = new Intent(LocationActivity.this,MyService.class);
        stopService(intent);
    }

可檢測到如下輸出

2020-08-05 11:31:56.788 1247-1247/com.example.jetpackpro D/MyService: onCreate
2020-08-05 11:31:56.788 1247-1247/com.example.jetpackpro D/MyServiceObserver: 在MyServiceObserver中監(jiān)聽到Service啟動 
2020-08-05 11:31:58.715 1247-1247/com.example.jetpackpro D/MyServiceObserver: 在MyServiceObserver中監(jiān)聽到Service停止 
2020-08-05 11:31:58.715 1247-1247/com.example.jetpackpro D/MyService: onDestroy

可以看出萎羔,監(jiān)聽Service生命周期的方法與Activity和Fragment相似液走,只是需要自己修改父類,其背后的原理依然是觀察者模式贾陷。

2缘眶、使用ProcessLifecycleOwner監(jiān)聽應用程序的生命周期

谷歌提供了一個名為ProcessLifecycleOwner 的類,來監(jiān)聽應用程序的生命周期髓废,可以知道應用程序是處于前臺還是后臺巷懈,或者是從前臺切換到后臺時可以得到通知。下面介紹其使用方法慌洪。

第一步還是引入依賴顶燕,引入的依賴,與上面Service中引入的依賴相同冈爹。

完整代碼如下:

/**
 * 項目名稱 JetPackPro
 * 創(chuàng)建人 xiaojinli
 * 創(chuàng)建時間 2020/8/5 11:46 AM
 **/
public class MyLifeApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();

        ProcessLifecycleOwner.get().getLifecycle().addObserver(new ApplicatonOberver());
    }
}




/**
 * 項目名稱 JetPackPro
 * 創(chuàng)建人 xiaojinli
 * 創(chuàng)建時間 2020/8/5 11:46 AM
 **/
public class ApplicatonOberver implements LifecycleObserver {
    private static final String TAG = "ApplicatonOberver";

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void onCreate(){
        Log.d(TAG,"onCreate in ApplicatonOberver");
    }

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

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


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

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

    /**
     * 該方法永遠不會被調用涌攻,因為系統(tǒng)不會分發(fā)ON_DESTROY事件
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void onDestroy(){
        Log.d(TAG,"onDestroy in ApplicatonOberver");
    }
}


可檢測到一下結果:

APP剛啟動時會依次執(zhí)行以下三種方法
2020-08-05 11:52:18.253 1639-1639/com.example.jetpackpro D/ApplicatonOberver: onCreate in ApplicatonOberver
2020-08-05 11:52:18.654 1639-1639/com.example.jetpackpro D/ApplicatonOberver: onStart in ApplicatonOberver
2020-08-05 11:52:18.688 1639-1639/com.example.jetpackpro D/ApplicatonOberver: onResume in ApplicatonOberver
APP切換到后臺時會執(zhí)行以下兩種方法
2020-08-05 11:52:31.788 1639-1639/com.example.jetpackpro D/ApplicatonOberver: onPause in ApplicatonOberver
2020-08-05 11:52:31.788 1639-1639/com.example.jetpackpro D/ApplicatonOberver: onStop in ApplicatonOberver
APP再次切換到前臺時會執(zhí)行以下兩種方法
2020-08-05 11:52:35.807 1639-1639/com.example.jetpackpro D/ApplicatonOberver: onStart in ApplicatonOberver
2020-08-05 11:52:35.807 1639-1639/com.example.jetpackpro D/ApplicatonOberver: onResume in ApplicatonOberver

可以看出,通過ProcessLifecycleOwner我們可以輕易地檢測到APP合適從前臺進入到后臺频伤,又是何時從后臺進入前臺恳谎,進而可以進行一些業(yè)務操作,并且不會增加耦合度憋肖。

  • ProcessLifecycleOwner是針對整個應用程序的監(jiān)聽因痛,與Activity無關。
  • Lifecycle.Event.ON_CREATE只會調用一次瞬哼,Lifecycle.Event.ON_DESTROY永遠不會被調用婚肆。
  • Lifecycle.Event.ON_START 和 Lifecycle.Event.ON_RESUME是一組,會依次調用坐慰,Lifecycle.Event.ON_START在Lifecycle.Event.ON_RESUME之前調用较性。
  • Lifecycle.Event.ON_PAUSE 和 Lifecycle.Event.ON_STOP是一組用僧,會依次調用,而且Lifecycle.Event.ON_PAUSE在Lifecycle.Event.ON_STOP之前調用赞咙。
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末责循,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子攀操,更是在濱河造成了極大的恐慌院仿,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件速和,死亡現(xiàn)場離奇詭異歹垫,居然都是意外死亡,警方通過查閱死者的電腦和手機颠放,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門排惨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人碰凶,你說我怎么就攤上這事暮芭。” “怎么了欲低?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵辕宏,是天一觀的道長。 經常有香客問我砾莱,道長瑞筐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任恤磷,我火速辦了婚禮面哼,結果婚禮上,老公的妹妹穿的比我還像新娘扫步。我一直安慰自己,他們只是感情好匈子,可當我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布河胎。 她就那樣靜靜地躺著,像睡著了一般虎敦。 火紅的嫁衣襯著肌膚如雪游岳。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天其徙,我揣著相機與錄音胚迫,去河邊找鬼。 笑死唾那,一個胖子當著我的面吹牛访锻,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼期犬,長吁一口氣:“原來是場噩夢啊……” “哼河哑!你這毒婦竟也來了?” 一聲冷哼從身側響起龟虎,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤璃谨,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后鲤妥,有當地人在樹林里發(fā)現(xiàn)了一具尸體佳吞,經...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年棉安,在試婚紗的時候發(fā)現(xiàn)自己被綠了容达。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡垂券,死狀恐怖花盐,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情菇爪,我是刑警寧澤算芯,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站凳宙,受9級特大地震影響熙揍,放射性物質發(fā)生泄漏。R本人自食惡果不足惜氏涩,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一届囚、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧是尖,春花似錦意系、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至兜辞,卻和暖如春迎瞧,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背逸吵。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工凶硅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人扫皱。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓足绅,卻偏偏與公主長得像捷绑,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子编检,可洞房花燭夜當晚...
    茶點故事閱讀 45,860評論 2 361