【问题标题】:How to get Application Lifecycle events in Activities?如何在活动中获取应用程序生命周期事件?
【发布时间】:2020-03-09 18:53:08
【问题描述】:

我正在尝试创建一个可以在应用从后台返回时弹出对话框的应用。

我的应用程序有多个活动,我一直在尝试创建一个基类来检查活动中的 OnResume。问题是,当我在活动之间切换时,它们会触发 OnResume,这不是我想要的,我只希望在应用程序本身从后台恢复时出现对话框。

我看到 Jetpack 有应用程序生命周期事件,这与我在 ProcessLifecycleOwner 中寻找的完全一样。

我在我的基本活动中尝试使用this 之类的代码,但现在,显然是因为我已经加载了多个活动,所以我的事件会触发多次......每个活动/侦听器一次。

如何实现这一点,以便只有一个侦听器但所有活动都可以访问应用程序事件?我考虑使用 Application 类作为单个侦听器,但我不确定如何链接到这些事件或将这些信息传递回我的各种活动。

【问题讨论】:

    标签: android


    【解决方案1】:

    如果你使用Application类来监听生命周期事件,BaseActivity可以在onResume()中注册Application类作为当前Activity

    @Override
    protected void onResume() {
        super.onResume();
        ((App)getApplication()).registerActivity(this);
    }
    

    Application 类需要字段

    private boolean showDialog = false;
    private BaseActivity currentRegisteredActivity = null;
    

    然后,一旦注册了Activity,它将被告知如果应用程序到目前为止一直在后台显示对话框:

    public void registerActivity(BaseActivity activity) {
        currentRegisteredActivity = activity;
        if(showDialog){
            activity.showInitialDialog();
            showDialog = false;
        }
    }
    

    生命周期事件的观察方法:

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void appInResumedState(){
        showDialog = true;
        Log.d(LIFECYLE_EVENT, "appInResumedState: ");
        if(currentRegisteredActivity != null){
            currentRegisteredActivity.showInitialDialog();
            showDialog = false;
        }
    }
    
    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void appInPausedState(){
        showDialog = false;
        Log.d("LIFECYLE_EVENT", "appInPausedState: ");
        currentRegisteredActivity = null;
    }
    

    【讨论】:

      【解决方案2】:

      也许可以试试这样?

      让您的活动(或片段)实现一个通用接口,您的应用程序将在生命周期事件期间保持对它的引用和调用。

      class MyApplication : Application(), LifeCycleObserver {
        private var delegate: LifeCycleDelegate? = null
      
        // ... Initialization code for LifeCycle
      
        fun updateCurrentDelegate(delegate: LifeCycleDelegate) {
         currentActivity = delegate
        }
      
        @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
        fun appInResumeState() {
            delegate.onResumeCalled()
        }
      }
      

      知道何时为当前委托设置变量可能很棘手。

      不过,这一切都只是猜测。到目前为止,我只对 Activity 中的 LifeCycleOwnerLifeCycleObserver 感到困惑。我希望这会有所帮助!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多