快速转换期间 onResume 之后接收到前一个 Activity 实例的 Activity onStop

问题描述 投票:0回答:1

Launcher 活动负责处理主屏幕的小部件。在onStart中它调用appWidgetHost.startListening,在onStop中它调用appWidgetHost.stopListening()。预期是当活动位于前台时,小部件应该从小部件提供者接收更新。当它切换到后台时,它应该停止接收小部件更新。

活动代码如下-

    protected void onResume() {
        currentState = ActivityState.RESUMED;
        super.onResume();
        Log.d(TAG, "onResume currentState:"+currentState+" object:"+this);
    }
    @Override
    protected void onPause() {
        currentState = ActivityState.PAUSED;
        super.onPause();
        Log.d(TAG, "onPause currentState:"+currentState+" object:"+this);
    }

    @Override
    protected void onStart() {
        currentState = ActivityState.STARTED;
        super.onStart();
        Log.d(TAG, "onStart currentState:"+currentState+" object:"+this);
        if (appWidgetHost != null) {
            Log.d(TAG, "onStart appWidgetHost startListening = " + appWidgetHost);
                appWidgetHost.startListening();
        }
    }

在理想情况下,当我们切换到不同的应用程序并切换回主屏幕时,将调用 Activity onStart 并加载小部件。

但是,如果我们非常快地执行转换,有时最终会获得当前活动实例的 onStart 状态,然后获得前一个活动实例的 onStop 状态。因此,即使 Activity 位于前台,它也会停止侦听小部件更新。在这种情况下,小部件不会更新。 从日志中,我们可以看到 Activity onStop 来自前一个实例。

错误场景日志:

LauncherActivity:onPause currentState:PAUSED对象:com.bosch.apps.homescreen.ui.LauncherActivity@11a9396 启动主屏幕 LauncherActivity:onCreate:对象:com.bosch.apps.homescreen.ui.LauncherActivity@ebd5de9 LauncherActivity: onStart currentState:STARTED 对象:com.bosch.apps.homescreen.ui.LauncherActivity@ebd5de9 LauncherActivity:onResume currentState:RESUMED对象:com.bosch.apps.homescreen.ui.LauncherActivity@ebd5de9 LauncherActivity:onStop()当前状态:暂停对象:com.bosch.apps.homescreen.ui.LauncherActivity@11a9396

遇到这种情况我们应该如何处理?

android android-lifecycle activity-lifecycle
1个回答
0
投票

这是一个有效的转换。对于前面的onStart和onStop的顺序没有承诺。事实上,在旧的 onStop 之前启动新的 onStart 的可能性更大。我会制作一个更智能的 onStartListening 和 onStopListening 函数。一个简单的解决方案是引用计数,使每个 startListening 调用增加一个变量,而 onStop 减少它。仅当实际达到 0 时才停止收听。

© www.soinside.com 2019 - 2024. All rights reserved.