• 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

    源码地址

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

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

  • 相关阅读:
    uniapp 使用web-view外接三方
    基于物联网技术的工程、地质自动化安全监测产业链及工程应用
    RabbitMQ的使用
    高效使用Python的subprocess模块:基本用法与进阶技巧
    结合实践总结docker 安装 mysql5.7
    2、CSS基础
    lerna publish时报错 E401 [UNAUTHORIZED] Login first
    《论文阅读》BA-NET: DENSE BUNDLE ADJUSTMENT NETWORKS
    JavaEE项目的数据分析师、软件工程师
    web前端Vue 报错:Uncaught (in promise) TypeError: Cannot read properties of nu
  • 原文地址:https://blog.csdn.net/weixin_44235109/article/details/126086804