很多時候,我們都會遇到這樣的需求:我們想要知道,應(yīng)用程序當前是否處在前臺還是后臺,或者我們希望應(yīng)用程序從后臺回到前臺時,能夠得到通知。有不少方法能夠?qū)崿F(xiàn)該需求,但是都不夠好。在此之前,Google官方并沒有提供該需求的實現(xiàn),直到LifeCycle的出現(xiàn)。LifeCycle提供了一個名為ProcessLifecycleOwner的類,使得我們能夠方便地知道整個應(yīng)用程序的生命周期情況。
ProcessLifecycleOwner的使用方式與Activity/Fragment,以及Service是類似的,它也是通過觀察者模式來實現(xiàn)的。由于我們要觀察的是整個應(yīng)用程序,所以我們要在Application中進行相關(guān)的代碼編寫。
public class MyApplication extends Application
{
@Override
public void onCreate()
{
super.onCreate();
ProcessLifecycleOwner.get().getLifecycle().addObserver(new ApplicationObserver());
}
}
接下去就是ApplicationObserver類,我們定義這個類來實現(xiàn)LifecycleObserver接口,負責(zé)對應(yīng)用程序生命周期的監(jiān)聽。
public class ApplicationObserver implements LifecycleObserver
{
private String TAG = this.getClass().getName();
public ApplicationObserver()
{
}
/**
* ON_CREATE 在應(yīng)用程序的整個生命周期中只會被調(diào)用一次
* */
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void onCreate()
{
Log.d(TAG, "Lifecycle.Event.ON_CREATE");
}
/**
* 應(yīng)用程序出現(xiàn)到前臺時調(diào)用
* */
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onStart()
{
Log.d(TAG, "Lifecycle.Event.ON_START");
}
/**
* 應(yīng)用程序出現(xiàn)到前臺時調(diào)用
* */
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onResume()
{
Log.d(TAG, "Lifecycle.Event.ON_RESUME");
}
/**
* 應(yīng)用程序退出到后臺時調(diào)用
* */
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onPause()
{
Log.d(TAG, "Lifecycle.Event.ON_PAUSE");
}
/**
* 應(yīng)用程序退出到后臺時調(diào)用
* */
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onStop()
{
Log.d(TAG, "Lifecycle.Event.ON_STOP");
}
/**
* 永遠不會被調(diào)用到,系統(tǒng)不會分發(fā)調(diào)用ON_DESTROY事件
* */
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy()
{
Log.d(TAG, "Lifecycle.Event.ON_DESTROY");
}
}
ProcessLifecycleOwner針對的是整個應(yīng)用程序的監(jiān)聽,與你的Activity數(shù)量無關(guān),你有一個Activity和N個Activity,對ProcessLifecycleOwner來說是沒有區(qū)別的。
Lifecycle.Event.ON_CREATE只會被調(diào)用一次,而Lifecycle.Event.ON_DESTROY永遠不會被調(diào)用。
當應(yīng)用程序從后臺回到前臺,或者應(yīng)用程序首次打開,會依次調(diào)用Lifecycle.Event.ON_START,Lifecycle.Event.ON_RESUME。
當應(yīng)用程序從前臺退到后臺(用戶按下home鍵或任務(wù)菜單鍵),會依次調(diào)用Lifecycle.Event.ON_PAUSE,Lifecycle.Event.ON_STOP。需要注意的是,這兩個方法的調(diào)用會有一定的延后,因為系統(tǒng)需要為屏幕旋轉(zhuǎn),配置發(fā)生變化導(dǎo)致Activity重新創(chuàng)建預(yù)留一些時間,也就是說,系統(tǒng)需要保證由于屏幕旋轉(zhuǎn),導(dǎo)致Activity重新創(chuàng)建時,這兩個事件不會被調(diào)用到。旋轉(zhuǎn)屏幕,你的應(yīng)用程序并沒有退到后臺,它只是進入了橫/豎屏模式而已。
通過ProcessLifecycleOwner,我們可以知道應(yīng)用程序何時退到后臺,以及何時進入前臺,進而執(zhí)行一些業(yè)務(wù)操作。它使用起來非常簡單,并且不會給項目增加任何的耦合度。