我在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.AppCompatActivityabstract 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 – 如何完成几个SingleInstance活动?全部内容,希望文章能够帮你解决android – 如何完成几个SingleInstance活动?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)