Android 如何完成几个单实例活动?

Android 如何完成几个单实例活动?,android,kotlin,back-stack,Android,Kotlin,Back Stack,我有几个与launchMode SingleInstance有关的活动。注销时,我希望完成所有活动并打开启动屏幕 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_C

我有几个与launchMode SingleInstance有关的活动。注销时,我希望完成所有活动并打开启动屏幕

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)

但是,如果我在启动程序活动中按back键,我将转到以前使用单实例模式启动的活动

我不知道你到底想做什么,但我感觉你可以重新设计你的应用程序,让它做得更好

不管怎样,请回答您的问题-我猜如果用户已注销,您可以检查活动的启动,如果他确实启动了单实例启动器活动,并使用
finish()
关闭这些活动

我有几个与launchMode SingleInstance有关的活动。注销时,我希望完成所有活动并打开启动屏幕

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)
这里有一个方法:

  • 让所有活动扩展自定义的
    BaseActivity
  • 单击注销按钮时,您可以使用发送本地广播(在应用程序内)
  • 在基本活动中,您可以实现侦听器。您可以在侦听器中调用
    finish()
  • 因此,当用户单击注销按钮时,您将向所有打开的活动发送本地广播。由于您的所有活动都扩展了公共
    BaseActivity
    ,因此会调用侦听器并完成活动
  • 发送广播后,您可以打开预期的
    启动器活动
  • 看 更多

    附言:您可以在
    onDestroy
    中取消注册侦听器。由于活动仍然存在,因此不会调用onDestroy。如果它已经被销毁,那么你就少担心一件事。

    2018年11月1日更新: 我已经测试了多种方法来处理它,比如事件传播、意图标志、计数活动实例等。有一些奇怪的场景,比如按顺序启动多个
    singleInstance
    活动。在这种情况下,中间活动根本不会启动(
    onCreate
    method未被调用),在按下后退按钮后,它们将启动。因此,之前的方法中没有一种是有效的!由于这个问题有点奇怪,我试图用一种有点奇怪的方式来解决它

    我们在名为
    LogoutHandler
    的单例对象中维护注销状态。它与类
    logoutaweactivity
    协作,该类由除
    LoginActivity
    之外的所有活动继承,因为它不应受到注销机制的影响。注销时,将在
    LogoutHandler
    中设置一个标志,直到
    logoutaweactivity
    的最后一个子项完成,然后清除该标志

    以下是一个实现:

    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()
            }
        }
    
    }
    
    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)
    }
    
    LogoutAwareActivity:

    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()
            }
        }
    
    }
    
    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)
    }
    
    具体活动:

    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()
            }
        }
    
    }
    
    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)
    }
    
    另一项具体活动:

    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()
            }
        }
    
    }
    
    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)
    }
    
    您的注销功能:

    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()
            }
        }
    
    }
    
    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)
    }
    
    视觉效果:

    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()
            }
        }
    
    }
    
    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
    然后按后退按钮:


    启动启动启动屏幕之前,请添加此行

    ActivityCompat.finishAffinity(this)
    

    根据我的经验,扩展应用程序类是存储需要在所有活动之间共享的有限数据量的最简单、最有效的方法


    在您的情况下,您可以创建一个保存登录数据的类,并将其实例存储在自定义应用程序对象中,所有活动都可以访问它。他们可以在开始时检查登录可用性,订阅更改,并在需要完成时收到通知。应用程序对象本身可以订阅更改,并在需要时启动登录活动。

    您的解决方案将不起作用。在您的代码中,事件总线在onStop中被取消认证。因此,backstack中的所有活动都不会收到此事件您提到的奇怪的esenario-正是我的情况)您在哪里注销广播接收器?在我启动注销活动之前,将调用onPause、onStop和onDestroy。问得好。您可以在
    onDestroy
    中执行此操作。由于活动的实例仍然存在,我认为不会调用onDestroy。onStop肯定会被调用,因为您的新活动完全隐藏了旧活动。