android – 如何完成几个SingleInstance活动?
作者:互联网
我在launchMode SingleInstance中有几个活动.注销时我想完成所有活动并打开launchScreen.
val intent = Intent(context, LauncherActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
(context as AppCompatActivity).finishAffinity()
context.startActivity(intent)
但是,如果我按回Launcher活动,我会转发到以前启动的具有singleInstance模式的活动
解决方法:
更新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然后按下后退按钮:
标签:android,kotlin,back-stack 来源: https://codeday.me/bug/20190716/1473844.html