其他分享
首页 > 其他分享> > android – 如何完成几个SingleInstance活动?

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都是单个实例.

按后退按钮在活动之间移动:

enter image description here

转到LoginActivity然后按下后退按钮:

enter image description here

标签:android,kotlin,back-stack
来源: https://codeday.me/bug/20190716/1473844.html