监听应用程序的生命周期-ProcessLifecycleOwner

很多时候,我们都会遇到这样的需求:我们想要知道,应用程序当前是否处在前台还是后台,或者我们希望应用程序从后台回到前台时,能够得到通知。有不少方法能够实现该需求,但是都不够好。在此之前,Google官方并没有提供该需求的实现,直到LifeCycle的出现。LifeCycle提供了一个名为ProcessLifecycleOwner的类,使得我们能够方便地知道整个应用程序的生命周期情况。


ProcessLifecycleOwner的使用方式与Activity/Fragment,以及Service是类似的,它也是通过观察者模式来实现的。由于我们要观察的是整个应用程序,所以我们要在Application中进行相关的代码编写。

public class MyApplication extends Application
{
    @Override
    public void onCreate()
    {
        super.onCreate();
        ProcessLifecycleOwner.get().getLifecycle().addObserver(new ApplicationObserver());
    }
}

接下去就是ApplicationObserver类,我们定义这个类来实现LifecycleObserver接口,负责对应用程序生命周期的监听。

public class ApplicationObserver implements LifecycleObserver
{
    private String TAG = this.getClass().getName();

    public ApplicationObserver()
    {

    }

    /**
     * ON_CREATE 在应用程序的整个生命周期中只会被调用一次
     * */
    @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");
    }

    /**
     * 永远不会被调用到,系统不会分发调用ON_DESTROY事件
     * */
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void onDestroy()
    {
        Log.d(TAG, "Lifecycle.Event.ON_DESTROY");
    }
}

ProcessLifecycleOwner针对的是整个应用程序的监听,与你的Activity数量无关,你有一个Activity和N个Activity,对ProcessLifecycleOwner来说是没有区别的。

Lifecycle.Event.ON_CREATE只会被调用一次,而Lifecycle.Event.ON_DESTROY永远不会被调用。

当应用程序从后台回到前台,或者应用程序首次打开,会依次调用Lifecycle.Event.ON_STARTLifecycle.Event.ON_RESUME

当应用程序从前台退到后台(用户按下home键或任务菜单键),会依次调用Lifecycle.Event.ON_PAUSELifecycle.Event.ON_STOP。需要注意的是,这两个方法的调用会有一定的延后,因为系统需要为屏幕旋转,配置发生变化导致Activity重新创建预留一些时间,也就是说,系统需要保证由于屏幕旋转,导致Activity重新创建时,这两个事件不会被调用到。旋转屏幕,你的应用程序并没有退到后台,它只是进入了横/竖屏模式而已。

通过ProcessLifecycleOwner,我们可以知道应用程序何时退到后台,以及何时进入前台,进而执行一些业务操作。它使用起来非常简单,并且不会给项目增加任何的耦合度。

项目地址:michaelye/ProcessLifecycleOwnerDemo?

监听应用程序的生命周期-ProcessLifecycleOwner
滚动到顶部