概述
近期碰到activity onstop延迟回调10s的问题。
关于问题的具体复现和原因,有博主总结的很不错,此处给上原链接:
深入分析Android中Activity的onStop和onDestroy()回调延时及延时10s的问题
此文主要记录一下笔者目前认为的解决方案,以及各方案的优劣。
1、避免过度频繁或耗时的主线程操作
假设现在是ActivityOne跳转到ActivityTwo,那么有两种情况都会导致延迟执行:
- ActivityOne频繁执行主线程操作,比如一些循环执行的动画操作。
- ActivityTwo在onCreate或者onStart中执行一些耗时或者频繁的主线程操作。
优势
从根源上解决了问题。
劣势
- 去动原来的逻辑就意味着风险,改动越大风险越大。
- 实际项目中,模块间往往是解耦的。有可能ActivityOne是我负责的,而ActivityTwo则是其他团队负责了。
- 有些频繁或者耗时的主线程操作由于业务原因没法去掉,或者去掉的风险太高。
2、使用EventBus
假设现在是ActivityOne跳转到ActivityTwo,那么在ActivityTwo执行到onCreate的时候就抛出事件,然后在ActivityOne中接收事件,做与onstop中一样的处理。
优势
几乎不会影响代码原来的逻辑,风险很低。
劣势
- 项目需要支持EventBus。(EventBus一旦滥用,代码会非常恶心,因此很多项目直接不允许用EventBus)
- 这种情况更适合一些公用的页面,比如登录页面,webview页面,视频播放页面等。在这些场景下,抛出这个事件才会比较合理。
- 如果原来没有这块逻辑,仍然需要在两个activity中都改。
3、监控所有activity的生命周期
假设现在是ActivityOne跳转到ActivityTwo,在ActivityOne中监控所有activity的生命周期,在ActivityTwo的onCreate执行到的时候,去执行onstop的逻辑。
优势
只需要在ActivityOne中新增逻辑即可,不需要动ActivityTwo。
劣势
- 需要靠谱的识别activity的方式。如果仅使用ActivityTwo的类名作为识别方式,那么如果ActivityTwo一旦改名,这块逻辑就会有问题。
- 难以判断行为轨迹,假设现在有A,B,C三个activity。
我只想监控A到B的情况,如果我只判断B的onCreate的话,那么如果A到C再到B也会被监控到。