Yar*_*arh 4 android kotlin back-stack
我在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)
Run Code Online (Sandbox Code Playgroud)
但是,如果我按回Launcher活动,我会转发到以前启动的具有singleInstance模式的活动
我已经测试了多种方法来处理它,例如事件传播,意图标记,计数活动实例等.有一些奇怪的场景,例如按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()
}
}
}
Run Code Online (Sandbox Code Playgroud)
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()
}
}
Run Code Online (Sandbox Code Playgroud)
具体活动:
class ActivityA : LogoutAwareActivity() {
// ...
}
Run Code Online (Sandbox Code Playgroud)
另一个具体活动:
class ActivityB : LogoutAwareActivity() {
// ...
}
Run Code Online (Sandbox Code Playgroud)
您的退出功能:
fun logout() {
val intent = Intent(context, LoginActivity::class.java)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
LogoutHandler.logout()
context.startActivity(intent)
}
Run Code Online (Sandbox Code Playgroud)
视觉结果:
所有的MainActivity,ActivityA,ActivityB并且ActivityC是单一实例.
按后退按钮在活动之间移动:
要LoginActivity然后按后退按钮:
| 归档时间: |
|
| 查看次数: |
532 次 |
| 最近记录: |