如何自动注销用户的帐户并强制他们重新登录? (Kotlin Android)

问题描述 投票:0回答:1

LoginPref.kt:

package com.example.sepehr1.Session

import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import com.example.sepehr1.MainActivity

class LoginPref {
    lateinit var pref:SharedPreferences
    lateinit var editor:SharedPreferences.Editor
    lateinit var con: Context
    var PRIVATEMODE : Int = 0

    constructor(con: Context){
        this.con = con
        pref = con.getSharedPreferences(PREF_NAME, PRIVATEMODE)
        editor = pref.edit()
    }

    companion object{
        val PREF_NAME = "Login_Preference"
        val IS_LOGIN = "isLoggedin"
        val KEY_PHONE = "phonenumber"
        val KEY_PASSWORD = "password"
    }

    fun createLoginSession(phoneNumber: String, password: String){
        editor.putBoolean(IS_LOGIN, true)
        editor.putString(KEY_PHONE, phoneNumber)
        editor.putString(KEY_PASSWORD, password)
        editor.commit()
    }

    fun checkLogin(){
        if(!this.isLoggedIn()){
            var i : Intent = Intent(con, MainActivity::class.java)
            i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
            i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            con.startActivity(i)
        }
    }

    fun getUserDetails(): HashMap<String, String>{
        var user: Map<String, String> = HashMap<String, String>()
        (user as HashMap).put(KEY_PHONE, pref.getString(KEY_PHONE, null)!!)
        (user as HashMap).put(KEY_PASSWORD, pref.getString(KEY_PASSWORD, null)!!)
        return user
    }

    fun LogoutUser(){
        editor.clear()
        editor.commit()
        var i = Intent(con, MainActivity::class.java)
        i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        con.startActivity(i)
    }

    fun isLoggedIn(): Boolean{
        return pref.getBoolean(IS_LOGIN, false)
    }
}

MainActivity.kt(登录页面):

class MainActivity : AppCompatActivity() {

lateinit var session: LoginPref


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    session = LoginPref(this)
    var username = findViewById<EditText>(R.id.phoneNumber)
    var password = findViewById<EditText>(R.id.passwords)

    if(session.isLoggedIn()){
        var i : Intent = Intent(applicationContext, dashboard::class.java)
        i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
        startActivity(i)
        finish()
    }
    signIn.setOnClickListener {
        var phone = username.text.toString().trim()
        var pass = password.text.toString().trim()

        if(phone.isEmpty() && pass.isEmpty()){
            Toast.makeText(this,"Failed",Toast.LENGTH_SHORT).show()
        } else{

            session.createLoginSession(phone, pass)
            var i : Intent = Intent(applicationContext, dashboard::class.java)
            startActivity(i)
            finish()
        }
}

“dashboard”是向登录成功的用户展示的布局

问题在于,当用户第一次成功进入应用时,总是进入主页面(dashboard)而没有进入登录页面。 例如,我希望用户在10天后通过登录页面重新进入应用程序(即每隔10天程序会自动将他注销并强制他通过登录页面重新进入)

我怎样才能根据我的代码做到这一点?

android kotlin android-studio logout
1个回答
0
投票

您可以通过简单地使用周期性

WorkManager
来实现您想要的,即使应用程序没有运行,它也会在后台注销。请按照以下步骤操作:

  • 创建工作请求

类 LogOutWorkManager(val context: Context, valworkerParameters:WorkerParameters):Worker(上下文,workerParameters){

override fun doWork(): Result {
    val loginPref = LoginPref()

    return try {
        loginPref.LogoutUser()
        Result.success()
    }catch (e: Exception){
        Result.retry()
    }
}

}

在继续之前有一些建议。将

LogoutUser
重命名为小写,因为它是一个方法而不是
class

  • 将您的工作请求排队:

    val 请求 =PeriodicWorkRequestBuilder(10, TimeUnit.DAYS) .setInitialDelay(10, TimeUnit.DAYS) 。建造() WorkManager.getInstance(上下文) .enqueue(请求)

确保正确配置您的工作请求。此外,您可以减少

initialDelay
时间,例如 15 分钟(支持的最短时间)来测试实施。

您可以阅读更多关于

WorkManager
这里

© www.soinside.com 2019 - 2024. All rights reserved.