Android 从我方界面启动三方界面,如何巧妙地检测三方页面的生命周期呢?
前言
最近负责对接一个三方需求,简单描述一下就是,利用三方的容器,运行我方的内容。
虽然打开了三方应用,但是用户的体验是和己方一样的,因为三方的界面是以单独进程的形式跳入了我们的应用栈内。所以看起来和自己应用打开一个新的Activity 的行为是一样的。用户体验比较好。
但三方给的工具类没有他们界面关闭的回调。这时候比如需要统计用户在三方界面的停留时长的话,就没办法做到了。
如何解决
所以我们如何感知到三方界面关闭了呢?
聪明的你一定想得到,如果我们从Activity1 打开了Activity2 ,然后再关闭Activity2 之后两者的生命周期。
如下图所示:
Activity1 打开Activity2
Activity2 返回到Activity1
所以可以利用我方Activity 的生命周期取感知到三方的界面如何结束的。
方案
那么具体的解决方案,就是启动三方界面之前,我们启动一个透明的Activity 专门用于生命周期的感知。
状态机
sealed class State {
object Initialize : State()
object Activated : State()
object Destroy : State()
}
透明的Activity 的onResume 中进行状态校验。
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()
}
结果
D/GeneralLifecycle: onResume: currentState is Initialize
D/GeneralLifecycle: onResume: currentState is Activated
D/GeneralLifecycle: consumeTime: 3936 , currentState is Destroy
源码地址
代码地址????????
创作不易,如有帮助一键三连咯🙆?♀?。欢迎技术探讨噢!
|