启动另一个全屏 Activity 时未调用 Activity 的 onStop()

Posted

技术标签:

【中文标题】启动另一个全屏 Activity 时未调用 Activity 的 onStop()【英文标题】:Activity's onStop() not called when starting another full screen Activity 【发布时间】:2017-04-11 21:53:37 【问题描述】:

我曾经认为,当Activity A被另一个全屏Activity B替换时,会调用A的onStop()回调。

这也反映在文档中:

活动的可见生命周期发生在调用 onStart() 和对 onStop() 的调用。在此期间,用户可以看到 屏幕上的活动并与之交互。例如, onStop() 是 当一个新活动开始并且这个活动不再可见时调用。

然而,现在我观察到了一种不同的行为(在 Lollipop 和 Marshmallow 上进行了测试)。

我从HomeActivity 开始AuthenticationActivity,尽管AuthenticationActivity 是一个全屏活动,HomeActivity 并没有停止。

在清单中声明这些活动:

    <activity
        android:name=".screens.home.activities.HomeActivity"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:launchMode="singleTop">
        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>

            <category android:name="android.intent.category.LAUNCHER"/>
        </intent-filter>
    </activity>

    <activity
        android:name=".screens.authentication.activities.AuthenticationActivity"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:windowSoftInputMode="adjustResize"
        android:theme="@style/AppTheme.Transparent"/>

当活动切换时,这是我在 logcat 中观察到的:

11-28 10:16:31.443 15183-15183/somepackage I/LOG:: LifeCycle : activity (somepackage.screens.home.activities.HomeActivity@3561e8e1) paused
11-28 10:16:31.583 15183-15183/somepackage I/LOG:: LifeCycle : activity (somepackage.screens.authentication.activities.AuthenticationActivity@2bbdb20f) created
11-28 10:16:31.753 15183-15183/somepackage D/Activity: performCreate Call secproduct feature valuefalse
11-28 10:16:31.753 15183-15183/somepackage D/Activity: performCreate Call debug elastic valuetrue
11-28 10:16:31.753 15183-15183/somepackage D/AuthenticationActivity: onStart()
11-28 10:16:31.753 15183-15183/somepackage I/LOG:: LifeCycle : activity (somepackage.screens.authentication.activities.AuthenticationActivity@2bbdb20f) started
11-28 10:16:31.993 15183-15183/somepackage D/AuthenticationActivity: onResume()
11-28 10:16:31.993 15183-15183/somepackage I/LOG:: LifeCycle : activity (somepackage.screens.authentication.activities.AuthenticationActivity@2bbdb20f) resumed
11-28 10:16:32.213 15183-15183/somepackage I/Timeline: Timeline: Activity_idle id: android.os.BinderProxy@266569db time:354918367
11-28 10:16:32.613 15183-15183/somepackage I/LOG:: LifeCycle : activity (somepackage.screens.home.activities.HomeActivity@3561e8e1) saveInstanceState
11-28 10:16:32.633 15183-15183/somepackage V/ActivityThread: updateVisibility : ActivityRecord2bcd65fd token=android.os.BinderProxy@86da390 somepackage/somepackage.screens.home.activities.HomeActivity show : true

发生了什么事?

【问题讨论】:

【参考方案1】:

“例如,onStop() 在一个新活动开始时被调用,而这个活动不再可见。”

因为您的 AuthenticationActivity 是透明的,所以 HomeActivity 仍然可见 => 不调用 onStop

【讨论】:

【参考方案2】:

尝试删除:

android:theme="@style/AppTheme.Transparent"

【讨论】:

以上是关于启动另一个全屏 Activity 时未调用 Activity 的 onStop()的主要内容,如果未能解决你的问题,请参考以下文章

activity怎么跳转到fragment

区分从主屏幕启动的 Activity 或从 App 启动的另一个 Activity

Appium运行时没有启动activity的权限:A new session could not be created.(Original error: Permission to start act

在Android N多窗口模式下按下主页按钮时未调用Activity onStop()

Android群英传知识点回顾——第八章:Activity与Activity调用栈分析

Android添加全屏启动画面