ОБНОВЛЕНИЕ 11/1/2018:
Я протестировал несколько подходов, чтобы справиться с ним, таких как распространение событий, флаги намерений, подсчет экземпляров активности и т. Д. Есть несколько странных сценариев, таких как запуск нескольких singleInstance
деятельность последовательно.В этом случае средние действия вообще не запускаются (метод onCreate
не вызывается) и после нажатия кнопки назад они будут запущены.Поэтому ни один из предыдущих подходов не работает!Поскольку проблема немного странная, я попытался решить ее немного странным способом.
Мы поддерживаем состояние выхода из системы в одноэлементном объекте с именем LogoutHandler
.Он взаимодействует с классом LogoutAwareActivity
, который наследуется всеми действиями, кроме LoginActivity
, поскольку на него не должен влиять механизм выхода из системы.Когда происходит выход из системы, в LogoutHandler
устанавливается флаг до тех пор, пока не закончится последний дочерний элемент LogoutAwareActivity
, а затем очищается флаг.
Вот реализация этого:
LogoutHandler:
import java.util.*
object LogoutHandler {
private var isLogout = false
private var timerWatchDog: TimerWatchDog? = null
fun isLogout() = isLogout
fun onActivityDestroyed() {
if (isLogout) {
timerWatchDog?.refresh(Runnable {
isLogout = false
timerWatchDog = null
})
}
}
fun logout() {
isLogout = true
timerWatchDog = TimerWatchDog(500)
}
private class TimerWatchDog(private val delay: Long) : Runnable {
private var timer: Timer? = null
private var runnable: Runnable? = null
fun refresh(runnable: Runnable) {
this.runnable = runnable
timer?.cancel()
val timerTask = object : TimerTask() {
override fun run() {
Thread(this@TimerWatchDog).start()
}
}
timer = Timer()
timer?.schedule(timerTask, delay)
}
override fun run() {
runnable?.run()
}
}
}
LogoutAwareActivity:
import android.support.v7.app.AppCompatActivity
abstract class LogoutAwareActivity : AppCompatActivity() {
override fun onResume() {
super.onResume()
if (LogoutHandler.isLogout()) {
finish()
}
}
override fun onDestroy() {
super.onDestroy()
LoginHandler.onActivityDestroyed()
}
}
Конкретное действие:
class ActivityA : LogoutAwareActivity() {
// ...
}
Другой конкретный вид деятельности:
class ActivityB : LogoutAwareActivity() {
// ...
}
Ваша функция выхода из системы:
fun logout() {
val intent = Intent(context, LoginActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
LogoutHandler.logout()
context.startActivity(intent)
}
Визуальный результат:
Все MainActivity
, ActivityA
, ActivityB
и ActivityC
являются одним экземпляром.
Переход между действиями нажатием кнопки назад:
Перейдите к LoginActivity
, затем нажмите кнопку возврата: