正确的方法在片段之间移动以纠正使用后栈

时间:2016-01-28 17:01:10

标签: android android-fragments

我想从活动A转移到活动B,然后再次转移到A.

A是父活动,在android.manifest中以这种方式定义:

<activity
    android:name=".ui.map.view.AActivity"
    android:screenOrientation="portrait"
    android:launchMode="singleTop"
    android:windowSoftInputMode="adjustPan" />

虽然B的定义如下:

    <activity
        android:name=".ui.addwifi.view.BActivity"
        android:noHistory="true"
        android:screenOrientation="portrait"
        android:windowSoftInputMode="adjustResize">

我使用此调用从A移动到B:

public void openBActivity(UserData user) {
    Intent intent = new Intent(getApplicationContext(), BActivity.class);
    intent.putExtra(BActivity.SSID, BActivity.getWifi_ssid().replace("\"", ""));

    if (user != null) {
        intent.putExtra(BActivity.LATITUDE, user.getLatitude());
        intent.putExtra(BActivity.LONGITUDE, user.getLongitude());
        intent.putExtra(BActivity.ZOOM_LEVEL, (int) user.zoom);
    }

    startActivity(intent);
}

从B到A:

public void openAActivity() {
    Intent intent = new Intent(context, SpotsMapActivity.class);
    startActivity(intent);
}

问题是,当我按回A时,它会移动到另一个不退出应用程序的活动A.我想要做的是从A移动到B,然后从B移动到A,从A移动到退出(按下后退按钮)。

Activity navigation flow

我已阅读Google docs about back navigation,但它对我不起作用。

2 个答案:

答案 0 :(得分:1)

首先,您正在使用Activity,并且没有使用任何片段。也许你可以使用Fragments(?),当你按Back时,你基本上退出了Activity(如果你没有将碎片添加到BackStack中)。这将为您提供所需的行为。

如果您当前正在实施,那么当您从活动B按回来时,您需要退出应用程序吗?在这种情况下,当你从它移动到B时,你需要关闭活动A.只需调用finish()方法即可。把它放在startActivity(intent)调用之后:

startActivity(intent);
finish();

这应该关闭活动A然后开始B.这有点像关闭A的暴力。为了使它优雅,只要确保你关闭任何资源A可能挂在上面,以避免泄漏

正如旁注,Android启动新Activity时的预期行为是将其他Activity置于停止状态但仍在Activity堆栈中。由于您正在摆脱Android的设计原则,也许片段可能更适合您的需求 - 我不知道您究竟想要做什么但是我强烈建议人们在离开Android之前重新考虑&# 39;设计。

修改

当您退出B时,看起来您正在从B再次启动活动A - 实际上并不需要它。 Android会保留之前的A实例,这就是为什么当你回去时你会看到另一个A的实例

答案 1 :(得分:0)

我使用FLAGS解决了这个问题。我认为这是最优雅的方式。

public void openAActivity(){     Intent intent = new Intent(context,SpotsMapActivity.class);     intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK + Intent.FLAG_ACTIVITY_CLEAR_TASK);     startActivity(意向); }