Как закрыть активность из класса с использованием контекста? - PullRequest
0 голосов
/ 16 апреля 2020

Я создал другой класс, в котором у меня есть функция выхода из системы:

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

Но он все еще жив и в результате у меня есть два или более одинаковых действия в моей системе. Я пробовал много способов, таких как создание переменной stati c в первом действии и использование этой переменной во втором для закрытия. Но моя деятельность остается в живых. Я также попытался использовать lauchmode в манифесте и некоторые другие способы. Может, кто-то знает, где я допустил ошибку?

ОБНОВЛЕНИЕ

Два места, откуда я звоню logOut(). 1-й - интерфейс между адаптером 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)
                    }
                }
            }

        }
    }

Ответы [ 2 ]

1 голос
/ 16 апреля 2020

Это не так, как это работает. Что происходит, это. Когда вы делаете:

context.startActivity(intent)

Это не запускает новый Activity сразу. Он просто запрашивает, чтобы Android запускал новый Activity, когда он снова получает контроль. Затем вы делаете это:

(context as Activity).finish()

Этот вызов просто завершает текущий Activity. Когда вы в конечном итоге вернете управление в Android framework, он запустит новый Activity, как вы и просили при вызове startActivity().

Если вы хотите, чтобы ваше приложение завершилось (ie: все действия завершены), вы можете просто выполнить:

(context as Activity).finishAffinity()

Этот вызов завершит sh текущий Activity и все другие действия в задаче, которые принадлежат тому же приложению.

ПРИМЕЧАНИЕ. Это работает только в том случае, если все действия в вашем приложении имеют одинаковую привязку, что является случаем по умолчанию.

1 голос
/ 16 апреля 2020

попробуйте передать Activity вместо Context во внутреннем параметре fun logOut(activity: Activity), это должно помочь вам, если вы вызываете эту функцию из Activity. Если вы звоните из фрагмента, вы можете использовать requareActivity.finish()

...