Обрабатывать задний стек активности - PullRequest
0 голосов

У меня есть 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 голосов
/ 15 ноября 2018

Чтобы удалить IntroActivity из стека после успешного входа в систему, я бы сделал это:

Предполагая, что LoginActivity также должен быть завершен (удален из стека) при успешном входе в систему, вы можете позвонить startActivity(), чтобы вернуться к IntroActivity и добавить «дополнительный» к Intent, сообщающему IntroActivity: начать ContainerActivity и закончить сам. Сделайте это:

in 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();

in 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 и SINGLE_TOP, это говорит Android об удалении всех действий над целью Activity и повторном использовании цели Activity (т. Е. Не создает новый экземпляр цели Activity). В этом случае onNewIntent() вызывается на существующем экземпляре Activity.

0 голосов
/ 15 ноября 2018

Вы можете запустить IntoActivity с помощью startActivityForResult, а в LoginActivity после успешного входа в систему вы можете установить результат RESULT_OK, а в IntroActivity onActivityResult проверить код результата и завершить IntoActivity.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...