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之前調用赞咙。