【问题标题】:How to close activity from class with context usage?如何使用上下文使用关闭课堂活动?
【发布时间】:2020-04-16 10:34:44
【问题描述】:

我创建了另一个具有注销功能的类:

fun logOut(context: Context) {    
        context.stopService(Intent(context, CheckNewMessages::class.java))
        val intent = Intent(context, LoginScr::class.java)
        intent.flags = Intent.FLAG_ACTIVITY_CLEAR_TOP and
                Intent.FLAG_ACTIVITY_NEW_TASK and
                Intent.FLAG_ACTIVITY_NO_ANIMATION
        context.startActivity(intent)

        (context as Activity).finish()
    }

正如你所见,我使用这条线来完成活动:

(context as Activity).finish()

但它仍然存在,因此我的系统中有两个或多个相同的活动。我尝试了很多方法,比如在第一个活动中创建静态变量并在第二个活动中使用这个变量来关闭。但我的活动仍然存在。我还尝试在清单和其他一些方式中使用 lauchmode。也许有人知道我在哪里做错了?

更新

我打电话给logOut()的两个地方。第一个是 RV 适配器和 Fragment 之间的接口:

override fun finish() {
        APICallRequests.logOut(context!!)
        activity!!.finishAffinity()
    }

第二个Interceptor 请求:

private fun updateAccessToken(context: Context) {
        val sp = context.getSharedPreferences(Constants.SHARED_PREFS_STORAGE, 0)
        synchronized(this) {
            val tokensCall = accessTokenApi()
                    .getNewToken(ReqAccessToken(sp.getString("refresh_token", "")!!))
                    .execute()

            if (tokensCall.isSuccessful) {

            } else {
                when (tokensCall.code()) {
                    500 -> {
                        val thread = object : Thread() {
                            override fun run() {
                                Looper.prepare()
                                Toast.makeText(cont, cont.getString(R.string.server_error_500), Toast.LENGTH_SHORT).show()
                                Looper.loop()
                            }
                        }
                        thread.start()
                    }

                    401 -> {
                        APICallRequests.logOut(context)
                    }
                }
            }

        }
    }

【问题讨论】:

  • 什么调用函数logOut(),函数调用时传入的context是什么?
  • @DavidWasser,通常它可以在用户按下注销 btn 时调用,也可以在用户收到一些错误时从拦截器调用,我将片段作为上下文传递
  • 我还是不明白你的问题。无论如何,您不能将Fragment 作为Context 参数传递,因为Fragment 不会扩展Context。编译器会将其标记为错误,因此您显然没有将Fragment 作为context 传递。
  • 请贴出调用logOut()的代码。
  • @DavidWasser,我刚刚更新了我的问题,请检查一下 :)

标签: android android-intent android-activity


【解决方案1】:

这不是它的工作方式。发生的事情是这样的。当你这样做时:

context.startActivity(intent)

这不会立即启动新的Activity。它只是要求 Android 在重新获得控制权时启动新的Activity。然后你这样做:

(context as Activity).finish()

这个调用刚刚结束当前​​的Activity。当您最终将控制权交还给 Android 框架时,它将按照您在调用 startActivity() 时的请求启动新的 Activity

如果您希望您的应用退出(即:所有活动都已完成),您可以这样做:

(context as Activity).finishAffinity()

此调用将完成当前的Activity 以及任务中属于同一应用的所有其他活动。

注意:这仅适用于您应用中的所有 Activity 共享相同亲和力的情况,这是默认情况。

【讨论】:

  • 但是当前活动也可以通过.finish() 关闭?
  • 没有必要,因为finishAffinity() 将关闭所有这些,包括当前的。
  • 但如果我完成所有活动,那么我的应用程序将关闭,不像System.exit(0),但我会在主屏幕上移动?至于我想要什么,我想关闭活动并打开另一个活动,例如关闭 A 并移至 B,使用 finishAffinity() 将允许我进入 B?
  • 对不起。那我不明白你的问题。您是否只想开始一个新的Activity 并完成当前的?
【解决方案2】:

尝试在内部参数fun logOut(activity: Activity) 中传递 Activity 而不是 Context,如果您从 Activity 调用此函数,这应该会对您有所帮助。如果你从片段中调用它,你可以使用requareActivity.finish()

【讨论】:

  • 我通过活动传递从片段中尝试了这段代码,但对我没有帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-30
  • 1970-01-01
  • 1970-01-01
  • 2019-05-13
  • 2015-03-31
相关资源
最近更新 更多