Android: как возобновить с последней активности после очистки стека - PullRequest
0 голосов
/ 14 сентября 2018

У меня есть 3 действия LandingActivity -> LoginActivity -> MainActivity У меня есть кнопка входа в действие Landing, которое запускает LoginActivity, которое переводит меня в MainActivity после успешного входа в систему. Я очистил задачу в LoginActivity, поэтому, когда я нажимаю кнопку «Назад» в MainActivity, приложение переходит в backroung, так как оно является корневым в задаче, проблема в том, что когда я возобновляю его, начинается с LandingActivity, как я могу это исправить, чтобы заставить его возобновить с MainActivity

AndroidManifest

<activity android:name=".activity.LandingActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

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

    <activity android:name=".activity.MainActivity"/>
    <activity android:name=".activity.SignUpActivity"/>
    <activity android:name=".activity.LoginActivity"/>

намерение используется в кнопке входа в систему

val intent = Intent(this, MainActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or Intent.FLAG_ACTIVITY_CLEAR_TASK )
startActivity(intent)

Ответы [ 2 ]

0 голосов
/ 14 сентября 2018

Когда в стеке нет активностей, например, если вы нажмете назад, пока не вернетесь домой, и не нажмете значок запуска, он всегда будет запускать действие с помощью фильтра намерений модуля запуска, независимо от того, какое действие было открыто последнимили если процесс приложения еще жив или нет.Как предлагает @TheHebrewHammer, чтобы обойти это, ваша LandingActivity может выступать в качестве дерева решений навигации на основе сохраненных данных и действий по запуску.Вы можете проверить, как Google обрабатывает нечто подобное в приложении Google I / O Schedule здесь

В качестве альтернативы, если ваша LandingActivity не показывает большой пользовательский интерфейс и просто запрашивает в качестве сегвея для других действий,Вы могли бы избегать нескольких действий большую часть времени, объявив MainActivity как средство запуска и проверив сеанс, вошедший в систему, как показано ниже:

override fun onCreate(savedInstanceState: Bundle?) {
    if (!isUserLoggedIn()) {
        val intent = Intent(this, LoginActivity::class.java)
        startActivity(intent)
        finish()
        return
    }
    // continue as normal
}

Если в большинстве случаев сеанс вошел в систему, вы только начнетеодно действие большую часть времени, и вам не нужно будет передавать информацию через намеренные данные из LauncherActivity в некоторых ситуациях.

0 голосов
/ 14 сентября 2018

Что вы хотите сделать, это сохранить логическое значение в общих настройках, сохраняющее состояние входа в систему. В LandingActivity onCreate проверьте это логическое значение, если оно верно, просто очистите задачу и перейдите к своему MainActivity пользовательский интерфейс не будет отображаться, и будет выглядеть, будто пользователь только что перешел к основной деятельности.Если вы затем осуществите выход из системы, ваше приложение автоматически вернется к старому поведению.

Поведение кнопки входа в систему:

PreferenceManager.getDefaultSharedPreferences(this)
        .edit()
        .putBoolean("is_logged_in", true)
        .apply()
val intent = Intent(this, MainActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or 
Intent.FLAG_ACTIVITY_CLEAR_TASK )
startActivity(intent)

onCreate LandingActivity:

override fun onCreate(savedInstanceState: Bundle?) {
    val isLoggedIn = PreferenceManager.getDefaultSharedPreferences(this)
            .getBoolean("is_logged_in", false)
    if (isLoggedIn) {
        val intent = Intent(this, MainActivity::class.java)
        intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK or 
        Intent.FLAG_ACTIVITY_CLEAR_TASK )
        startActivity(intent)
        return
    }
    // Your normal initialization code here...
}
...