Android登录拦截的常见-基本的Intent的实现

前言

关于App实现登录的拦截再执行逻辑,我已经出了几篇方案了,有些同学可能会问,你整的一些花里胡哨的有啥用,原生的Intent就能实现这些功能,我都是这么用的。

其实也没错,其实我之前也是这么使用Intent用的,应该算是比较基本的用法。下面一起看看基于Intent怎么实现登录拦截,又有哪些实现的方式?好不好用呢?

一、ResultApi

最基本的用法就是 startActivityForResult onActivityResult ,当然这一种方案已经Out了,谷歌也推荐我们使用Result Api,关于这一点后期会单独讲,这里还是以 onActivityResult 为例子。

     //Intent的方式        mBtnProfile2.click {            if (!LoginManager.isLogin()) {                gotoLoginPage()            } else {                gotoNextPage()            }        }    fun gotoLoginPage() {        val intent = Intent(mActivity, LoginDemoActivity::class.java)        startActivityForResult(intent, 1010)    }    fun gotoNextPage() {        val intent = Intent(mActivity, ProfileDemoActivity::class.java)        startActivity(intent)    }    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {        super.onActivityResult(requestCode, resultCode, data)        YYLogUtils.w("基于Result实现")        if (requestCode == 1010 && resultCode == -1) {            gotoNextPage()        }    }  

启动到登录页面,然后返回到当前页面,接收到返回事件之后对结果做处理,继续执行。

效果:

确实,刚入坑安卓的同学都会写的代码就能实现的逻辑,我为什么要整那么多花活,是因为方便简洁。可能有些同学不理解,这里我简单说一下。

比如一个页面中有多个地方需要判断登录再执行,需要写这些代码就太多了,还需要维护一个庞大的 onActivityResult 。

又比如如果我们是单Activity+Fragment的架构,我们需要跳转Fragment的,那你跳转Activity的Intent又不符合。又如何使用Intent跳转到Fragment呢?

再比如如果我们的逻辑不限于跳转页面,比如Dialog弹窗也需要校验登录,怎么办?比如弹出PopupWindow, 比如吐司,气泡,下拉选,等等逻辑,Intent能不能实现呢?代码会不会越来越多呢。越来越复杂呢?

所以才会整出那么多花活,就是为了简洁,方便,支持 runnable 或 高阶函数类型 或 function 等等,就是为了灵活。具体的可以看看之前的几种方案。

二、Intent的解析

说了那么多,Intent能不能实现上述说的功能呢?是可以的,只是相对麻烦,代码很多,但是是可以实现的。

如果是传统的Intent方法,那么我们通常是定义一些类型,在 onActivityResult,再根据判断不同的类型调用不同的方法。

    companion object {        val type_profile_page = 0x21        val type_dialog = 0x22        val type_picker = 0x23    }    mBtnProfile2.click {        if (!LoginManager.isLogin()) {            val intent = Intent(mActivity, LoginDemoActivity::class.java)            intent.putExtra("type", type_profile_page)            startActivityForResult(intent, 1010)        } else {             gotoNextPage()        }     }    mBtnProfile3.click {        if (!LoginManager.isLogin()) {            val intent = Intent(mActivity, LoginDemoActivity::class.java)            intent.putExtra("type", type_dialog)            startActivityForResult(intent, 1010)        } else {             gotoNextPage()        }     }    mBtnProfile4.click {        if (!LoginManager.isLogin()) {            val intent = Intent(mActivity, LoginDemoActivity::class.java)            intent.putExtra("type", type_picker)            startActivityForResult(intent, 1010)        } else {             gotoNextPage()        }     }    //返回的回调中再判断不同类型,调用不同的方法    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {        super.onActivityResult(requestCode, resultCode, data)        YYLogUtils.w("基于Result实现")        if (requestCode == 1010 && resultCode == -1) {            when (data?.getIntExtra("type", 0) ?: 0) {                type_profile_page -> {                    //跳转到个人中心页面                    toast("跳转到个人中心页面")                }                type_dialog -> {                    //展示弹窗                    toast("展示弹窗")                }                type_picker -> {                    //展示PickerView                    toast("展示PickerView")                }            }        }    }

Login的页面就需要拿到携带过来的type,在返回回去

    private var mTargetType = 0     override fun init() {        mTargetType = intent.getIntExtra("type", 0)    }    fun doLogin() {            showStateLoading()            CommUtils.getHandler().postDelayed({                showStateSuccess()                SP().putString(Constants.KEY_TOKEN, "abc")                setResult(-1, Intent().apply { putExtra("type", mTargetType) })   //设置Result                finish()            }, 500)        }

使用隐式Intent的方案

另一种方案我们也可以通过inent的隐式跳转,封装一个Intent,然后让Login帮我们执行这个Intent,通过newIntent的形式拿到Intent携带的数据。即可完成逻辑,例如我们首页切换底部的BottomTabBar

 inner class ClickProxy {        fun switchPage0() {            switchFragment(0)        }        fun switchPage1() {            if (!LoginManager.isLogin()) {                val intent = Intent(mActivity, Demo3Activity::class.java)                intent.addCategory(switch_tab1)                gotoLoginPage(intent)            } else {                switchFragment(1)            }        }        fun switchPage2() {            if (!LoginManager.isLogin()) {                val intent = Intent(mActivity, Demo3Activity::class.java)                intent.addCategory(switch_tab2)                gotoLoginPage(intent)            } else {                switchFragment(2)            }        }        fun switchPage3() {            if (!LoginManager.isLogin()) {                val intent = Intent(mActivity, Demo3Activity::class.java)                intent.addCategory(switch_tab3)                gotoLoginPage(intent)            } else {                switchFragment(3)            }        }    }    fun gotoLoginPage(targetIntent: Intent) {        val intent = Intent(mActivity, LoginDemoActivity::class.java)        intent.putExtra("targetIntent", targetIntent)        startActivity(intent)    }    //通过这样的方式可以拿到携带的数据    override fun onNewIntent(intent: Intent) {        super.onNewIntent(intent)        YYLogUtils.w("收到newintent:" + intent.toString())        val categories = intent.categories        when (categories.take(1)[0]) {            switch_tab1 -> {                switchFragment(1)            }            switch_tab2 -> {                switchFragment(2)            }            switch_tab3 -> {                switchFragment(3)            }        }    }

运行效果:

总结

总的来说,不是很推荐Intent的方式。

使用Intent的方式,每一个跳转的地方都需要写判断逻辑和代码,并且在一些类似Dialog等页面不能使用 onActivityResult 的地方,还需要 Activity/Fragment 中转消息,使用有局限性。

使用隐式Intent在 Fragment/Dialog 等一些非Activity的场景使用不方便,需要Activity再次中转消息,比较麻烦。

但是可以看到Intent确实是可以实现登录拦截的逻辑的,就是有点麻烦而已,为什么不一开始就写这一种方式,是为了提现其他方式的封装行与便捷性。

以前我也不知道其他方式,我自己也是使用Intent的方式的,但是现在我有的选,其他的更加便捷的方式不是更方便吗?何必为难自己,维护一个Intent的多个类型Type好麻烦哦。

当然我自己闭门造车,可能有更优的办法,如果对Intent的方式有什么更好的方法,大家可以评论区交流。

后期我会再出一些拦截登录的其他思路,大家可以和Intent或之前的方式做一下对比,的哪一种比较好,更加的方便。

作者:newki
链接:https://juejin.cn/post/7134126903073439775
来源:稀土掘金

发表评论
留言与评论(共有 0 条评论) “”
   
验证码:

相关文章

推荐文章