活动后台的莫名其妙的行为

时间:2017-04-05 11:27:43

标签: android android-activity back-stack onbackpressed

我有两个活动的简单应用程序。这是显而易见的:

<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结束。

第一眼看上去一切都很好,但如果在此之后我按回家btn,然后从堆栈重新启动应用程序 - 再次打开ActivityB而不是ActivityA。

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

更新 在ActivityB中的onBackPressed之后,ActivityA被打开,然后我点击了BackBtn而不是HomeBtn,因此应用程序已关闭。在这种情况下,从堆栈重新启动后,ActivityB将被打开。

1 个答案:

答案 0 :(得分:0)

当您在ActivityB中按下主页btn时,Android会在活动生命周期中调用onPause()方法,此时您的应用会在activityB上暂停。它没有像你覆盖onBackPressed()那样被破坏。因此,当您再次重新启动应用时,SO将会在靠背的onResume()上呼叫ActivityB。 要更改此行为,您必须在手动完成活动时覆盖onPause()方法。