在一个活动中按下电话后退按钮将转到另一个在Android之前尚未初始化的活动

时间:2017-10-09 02:17:32

标签: android android-activity

这与所有类似的"非常不同。 SO给了我的问题。我正在开发一个应用程序,当用户在一个名为SignUpActivity的活动中注册一个帐户时,我会使用以下代码将它们带到另一个名为UserProfileActivity的活动中:

SignUpActivity:

Intent userProfileIntent = new Intent(SignUpActivity.this, UserProfileActivity.class);
startActivity(userProfileIntent);
finish();

现在,在UserProfileActivity中,如果我按下后退按钮,它会转到我在应用程序生命周期内从未访问/实例化的活动,称为PartyListActivity。

UserProfileActivity:

public class UserProfileActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_user_profile);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Snackbar.make(view, "Replace with your own action", Snackbar.LENGTH_LONG)
                        .setAction("Action", null).show();
            }
        });
    }

}

所以我的问题是,为什么当我回到UserProfileActivity时,它回到PartyListActivity,当我以前从未参加过PartyListActivity时?清单文件中是否有某些内容决定了这种行为?

修改

的AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.sample.package">

    <!-- To auto-complete the email text field in the login form with the user's emails -->
    <uses-permission android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission android:name="android.permission.READ_PROFILE" />
    <uses-permission android:name="android.permission.READ_CONTACTS" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.AppCompat.Light.NoActionBar">
        <activity
            android:name=".LoginActivity"
            android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".SignUpActivity"
            android:label="@string/title_activity_sign_up" />
        <activity
            android:name=".PartyListActivity"
            android:label="@string/title_activity_party_list"
            android:theme="@style/AppTheme.NoActionBar" />
        <activity
            android:name=".UserProfileActivity"
            android:label="@string/title_activity_user_profile"
            android:theme="@style/AppTheme.NoActionBar" />
        <activity
            android:name=".FriendsActivity"
            android:label="@string/title_activity_friends"
            android:theme="@style/AppTheme.NoActionBar" />
    </application>

</manifest>

3 个答案:

答案 0 :(得分:1)

我会尽力打破这些东西并遵循活动流程:

  • 启动以及 root 活动为LoginActivity
    (来自您的manifest文件)。

  • 然后,从LoginActivity您输入SignUpActivity,使用某些UI操作或以编程方式(假设LoginActivity未完成)。

  • 从您输入的SignUpActivity UserProfileActivity开始。 (完成SignUpActivity,即SignUpActivity从后栈中删除。

  • 现在您已经进入UserProfileActivity并从那里按回按钮会将您带到LoginActivity,因为SignUpActivity已从后堆栈中删除。

  • 但是你说,你在PartyListActivity,只有当你从LoginActivity以编程方式启动它时才会发生这种情况。

  

查看 LoginActivity ,意外活动就是从那里开始的。

有关Tasks and Back Stack的更多信息。

答案 1 :(得分:0)

您可以在AndroidManifest.xml中的活动定义中指定“parentActivityName”属性。您在SignUpActivity的定义中是否有这样的属性?

有关此属性的完整文档以及有关后台堆栈导航的其他信息,请访问https://developer.android.com/training/implementing-navigation/temporal.html

答案 2 :(得分:0)

选项1:在UserProfileActivity完成后启动PartyListActivity是没有意义的。在某处你以某种方式配置或调用该活动。仔细检查您的密码。

选项2:尝试在onBackPress()上完成UserProfileActivity活动(即使它会完成)

@android:dimen/value