如何使用上下文从 class 关闭 activity?

How to close activity from class with context usage?

我创建了另一个 class 并具有注销功能:

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

如你所见,我用这一行来完成 activity:

(context as Activity).finish()

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

更新

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

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

和第 2 个在 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)
                    }
                }
            }

        }
    }

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

这不是它的工作方式。这是怎么回事。当你这样做时:

context.startActivity(intent)

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

(context as Activity).finish()

这次调用刚刚结束当前​​的 Activity。当您最终 return 控制 Android 框架时,它将按照您在调用 startActivity().

时的请求启动新的 Activity

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

(context as Activity).finishAffinity()

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

注意:这仅在您应用中的所有 Activity 共享相同亲缘关系时才有效,这是默认情况。