处理活动回栈

时间:2018-11-15 10:30:23

标签: android android-activity

我有4个活动:

  • MainActivity(启动程序)-检查用户是否已登录,然后启动ContainerActivity或IntroActivity
  • IntroActivity-显示各种登录方法,包括Facebook登录
  • LoginActivity-包含电话或电子邮件的登录方法。成功登录后,启动ContainerActivity
  • ContainerActivity-主应用程序

我有2个问题。

首先,当用户成功从IntroActivity登录时,我想从堆栈中删除LoginActivity。无法使用android:noHistory="true",因为当用户决定使用Facebook登录而不是电话或电子邮件时,IntroActivity应该在堆栈中。

第二,当用户从任何活动中注销时,我想回到MainActivity并清除所有返回堆栈。我将在以后添加活动。正确的方法是什么?

    <activity
        android:name=".MainActivity"
        android:theme="@style/AppTheme.Launcher"
        android:noHistory="true">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

        <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:scheme="@string/fb_login_protocol_scheme" />
        </intent-filter>
    </activity>
    <activity
        android:name=".authentication.LoginActivity"
        android:parentActivityName=".intro.IntroActivity"
        android:noHistory="true" />

2 个答案:

答案 0 :(得分:0)

您可以使用startActivityForResult启动IntoActivity,成功登录后可以在LoginActivity中设置结果RESULT_OK,然后在IntroActivity onActivityResult中检查结果代码并完成IntoActivity。

答案 1 :(得分:0)

要在成功登录后从堆栈中删除IntroActivity,我可以这样做:

假设成功登录后也应该完成LoginActivity(从堆栈中删除),则可以调用startActivity()返回到IntroActivity,并在{{ 1}}告诉Intent开始IntroActivity并完成自身。这样做:

ContainerActivity中:

LoginActivity

Intent intent = new Intent(this, IntroActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); intent.putExtra("startContainerActivity", true); startActivity(intent); finish(); 中:

IntroActivity.onNewIntent()

if (intent.hasExtra("startContainerActivity")) { Intent launchIntent = new Intent(this, ContainerActivity.class); startActivity(launchIntent); finish(); } 然后将启动IntroActivity并完成自身,离开堆栈:ContainerActivity

要从任何其他MainActivity->ContainerActivity返回到MainActivity,只需覆盖Activity并返回到onBackPressed()

MainActivity

当您指定标志@Override public void onBackPressed() { Intent intent = new Intent(this, MainActivity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); startActivity(intent); finish(); } CLEAR_TOP时,这会告诉Android删除目标SINGLE_TOP上方的所有活动并重用目标Activity(即:不创建目标Activity的新实例)。在这种情况下,将在Activity的现有实例上调用onNewIntent()