如何使用上下文从 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 共享相同亲缘关系时才有效,这是默认情况。
我创建了另一个 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 共享相同亲缘关系时才有效,这是默认情况。