日常开发中经常会遇到这样的场景:在点赞、收藏、进入商店页之前要先让用户登录,登录完成后再继续目标操作。
常规逻辑是点击功能入口时先判断是否登录,未登录则跳转登录页面,在onActivityResult中检测登录成功,再继续目标任务执行。
如果app中有多个功能都需要登录,那么每个地方都得写一段这样相似的逻辑,不免让人恼火。
一个易想到的方案便是把这段逻辑提取到BaseActivity/BaseFragment中。
封装代码示例:
//BaseActivity 代码片段
val LOGIN_REQUEST_CODE = 100
fun runAfterLogin(task: Runnable){ //如果需要向登录页面传递信息,可以再这里增加对应的参数
if (UserModel.instance.isLogin) { //已登录直接执行任务
task.run()
} else {
loginSuccessTask.add(task) //未登录先保存任务,等后续登录成功再执行
val intent = Intent(this, LoginActivity::class.java)
startActivityForResult(intent, LOGIN_REQUEST_CODE)
}
}
//也可以使用 registerForActivityResult实现
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if(requestCode == LOGIN_REQUEST_CODE){
val loginSuccess = resultCode == Activity.RESULT_OK
if(loginSuccess){
for (item in loginSuccessTask) {
item.run()
}
}
loginSuccessTask.clear()
}
}
//BaseFragment代码片段
fun runAfterLogin(task: Runnable?) {
(activity as? BaseActivity)?.runAfterLogin(task)
}
使用代码示例:
//activity或fragment中使用示例
storeEntryView.setOnclickListener{
runAfterLogin{ //登录成功后自动进入商店页
startActivity(Intent(context, StoreActivity::class.java))
}
}
这样用起来就清爽些啦!