• Android 从我方界面启动三方界面,如何巧妙地检测三方页面的生命周期呢?


    Android 从我方界面启动三方界面,如何巧妙地检测三方页面的生命周期呢?

    前言

    最近负责对接一个三方需求,简单描述一下就是,利用三方的容器,运行我方的内容。

    虽然打开了三方应用,但是用户的体验是和己方一样的,因为三方的界面是以单独进程的形式跳入了我们的应用栈内。所以看起来和自己应用打开一个新的Activity的行为是一样的。用户体验比较好。

    但三方给的工具类没有他们界面关闭的回调。这时候比如需要统计用户在三方界面的停留时长的话,就没办法做到了。

    如何解决

    所以我们如何感知到三方界面关闭了呢?

    聪明的你一定想得到,如果我们从Activity1打开了Activity2,然后再关闭Activity2之后两者的生命周期。

    如下图所示:

    Activity1打开Activity2

    在这里插入图片描述

    Activity2返回到Activity1

    所以可以利用我方Activity的生命周期取感知到三方的界面如何结束的。

    方案

    那么具体的解决方案,就是启动三方界面之前,我们启动一个透明的Activity专门用于生命周期的感知。

    状态机

        sealed class State {
            object Initialize : State()
            object Activated : State()
            object Destroy : State()
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    透明的ActivityonResume中进行状态校验。

        override fun onResume() {
            super.onResume()
            Log.d(TAG, "onResume: currentState is ${state.javaClass.simpleName}")
            when (state) {
                State.Activated -> tryFinish()
                State.Destroy -> throw IllegalStateException("it is already destroyed.")
                State.Initialize -> tryActivated()
            }
        }
        //打开三方应用,这里使用打开浏览器进行代替了
        private fun tryActivated() {
            if (BrowserHelper.openUrlByBrowser("https://www.baidu.com", AppUtil.application)) {
                state = State.Activated
                startTime = SystemClock.elapsedRealtime()
                return
            }
            finish()
        }
    	//三方界面返回,销毁
        private fun tryFinish() {
            state = State.Destroy
            val consumeTime = SystemClock.elapsedRealtime() - startTime!!
            Log.d(TAG, "consumeTime: $consumeTime , currentState is ${state.javaClass.simpleName}")
            finish()
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    结果

    D/GeneralLifecycle: onResume: currentState is Initialize
    D/GeneralLifecycle: onResume: currentState is Activated
    D/GeneralLifecycle: consumeTime: 3936 , currentState is Destroy
    
    • 1
    • 2
    • 3

    源码地址

    代码地址➡️➡️➡️➡️

    创作不易,如有帮助一键三连咯🙆‍♀️。欢迎技术探讨噢!

  • 相关阅读:
    SpringMVC——SpringMVC框架的基础知识概括
    HashMap原理
    想要精通算法和SQL的成长之路 - 无重叠区间
    计算机竞赛 深度学习 机器视觉 人脸识别系统 - opencv python
    windows环境CLion调试SRS流媒体服务器源码
    Kafka 3.0 面试 + 基础知识 + 原理
    Python超入门(6)__迅速上手操作掌握Python
    Java String 类回顾(期末复习版)
    颠覆IoT行业的开发神器!涂鸦智能重磅推出TuyaOS操作系统【程序员必备】
    使用canvas制作一个无人机旋转特效
  • 原文地址:https://blog.csdn.net/weixin_44235109/article/details/126086804