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天程序会自动将他注销并强制他通过登录页面重新进入)
我怎样才能根据我的代码做到这一点?
您可以通过简单地使用周期性
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
这里。