【问题标题】:inexplicable behaviour of activity backstack活动回栈的莫名其妙的行为
【发布时间】:2017-04-05 11:27:42
【问题描述】:

我有两个活动的简单应用程序。这是清单:

<application>
<activity
            android:name=".ActivityA"
            android:theme="@style/AppTheme.NoActionBar.Map">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
        <activity
            android:name=".ActivityB"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:host="https://stackoverflow.com/"
                      android:scheme="http"
                      android:pathPrefix="/questions/ask"
                    />
            </intent-filter>
        </activity>
</>

如您所见,当点击链接“https://stackoverflow.com/questions/ask”时 - 我的应用程序将打开第二个活动。 在 ActivityB 我重写 onBackPressed 方法:

override fun onBackPressed() {
        if(isTaskRoot){
                startActivity(Intent(this, MapActivity::class.java))
                finish()
            } else {
                super.onBackPressed()
            }
    }

所以当第二个活动从链接开始并且我点击返回 btn 时,ActivityA 被打开并且 ActivityB 完成。

乍一看,一切看起来都很好,但如果在此之后我按下 home btn,然后从堆栈重新启动应用程序 - ActivityB 再次打开而不是 ActivityA。

请解释一下为什么会发生这种情况以及如何解决这个问题。谢谢!

更新 在ActivityB中onBackPressed之后,ActivityA被打开,然后我点击onBackBtn而不是HomeBtn,所以应用程序被关闭。在这种情况下,从堆栈 ActivityB 重新启动后打开。

【问题讨论】:

    标签: android android-activity back-stack onbackpressed


    【解决方案1】:

    当您按下ActivityB 中的home btn 时,Android 会在activity 生命周期中调用onPause() 方法,此时您的应用会在activityB 上暂停。它不会像您覆盖 onBackPressed() 那样被销毁。因此,当您再次重新启动您的应用程序时,SO 将在后台堆栈中的 ActivityB 上调用 onResume()。 要更改此行为,您必须在手动完成活动时覆盖 onPause() 方法。

    【讨论】:

    • 在使用 onBackPressed 离开 ActivityB 后,我在 ActivityA 中按 homeBtn
    • 我明白了,尝试在else 以及else { finish() } 中调用finish 方法
    • 没用,因为 isTaskRoot = true,所以 else 方法不会调用
    猜你喜欢
    • 2012-11-14
    • 1970-01-01
    • 2012-05-19
    • 1970-01-01
    • 2018-12-23
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多