深蓝互联专注深圳小程序开发、微网站、O2O系统、APP开发和深圳网站建设欢迎咨询邮箱:wisepu@szdbi.com   电话:13530005652   联系我们   |   网站地图   



监听应用程序的生命周期-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,我们可以知道应用程序何时退到后台,以及何时进入前台,进而执行一些业务操作。它使用起来非常简单,并且不会给项目增加任何的耦合度。

相关文章

无相关信息


深圳市龙华新区龙观西路2号宝龙大厦A903(与布龙路交汇处)