Activity生命周期以及启动模式对生命周期的影响(二)
前面一篇文章概述了Android四大组件之一的Activity生命周期方法的调用先后顺序,但对于非标准启动模式下Activity被多次调用时的一些生命周期方法并未详细阐述,现在针对该情况着重记录.
- 现象
发布会demo中出现了这样的一种现象:当界面即将出现时,语音重复唤起该界面时,由于在onPause中调用了finish(),界面一直未显示出来,这不是我们想要的.
- 分析
由于系统组这边存在的一个bug,全屏的Activity出现时会带起在后台运行的应用界面,所以我们这边的Activity不得不采用singleTask的启动模式来规避该问题(暂时还未找到有效方法解决),由此当非第一次启动时,先走该Activity的onPause,
然后再走onNewIntent,最后onStart-->onResume-->界面展示且获取到焦点.那么根据这个顺序我们就可以采用下面的方式来解决了.
- 解决办法
我们现在onPause方法中,用主线程的handler去post一下,是否需要finish()掉界面.这样操作可以把post的消息内容置于onNewIntent消息之后执行.
如果是通过onNewIntent启动,那么我们就不操作;
如果是通过onCreate启动,那么我们就finish()掉.
具体代码如下
private boolean isStartedAgain = false; @Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
this.isStartedAgain = true;
} @Override
protected void onPause() {
super.onPause();
uiHandler.post(new Runnable() {
@Override
public void run() {
if (isStartedAgain) {
isStartedAgain = false;
} else {
uiHandler.removeMessages(0);
finish();
}
}
});
}
像这样,如果你是第一次启动该Activity,不会走onNewIntent方法;当再次启动时,onPause-->onNewIntent-->post的消息队列.
那么onPause时,把要执行的runnable抛出来,onNewIntent时,标志isStartedAgain为true(默认为false),
最后判断run方法中如何走;如果是再次启动isStartedAgain=true的话,不会关掉界面;如果是第一次启动,即isStartedAgain=false的话,移除动画操作的消息(不做此操作有出现使用已关闭的Activity对象异常的风险),并且finish()掉界面.
- 小结
一切的理论都要经得起实践的考验,一切不以解决问题为目的的博客文章都是在打酱油.问题得到了解决,灰常开心.
最新文章
- Scrapy 爬虫
- linux笔记三-------根目录相关说明
- How To Install Tinc and Set Up a Basic VPN on Ubuntu 14.04
- react 绑定事件
- Xen虚拟机磁盘镜像模板制作(三)—CentOS 7
- leetcode@ [49] Group Anagrams (Hashtable)
- iOS 中SQLite数据库操作
- Hibernate 一对多单向关联Demo
- VC中的Attach和Detach
- (转载博文)VC++API速查
- Unity应用架构设计(10)——绕不开的协程和多线程(Part 2)
- 《疯狂java讲义》读后感
- 图解 HTTP 的缓存机制 | 实用 HTTP
- webstorm配置svn详解
- BOM与DOM操作
- Django之ORM操作(聚合 分组、F Q)
- JUC同步锁(五)
- PHP快速排序算法
- js 继承的方式
- FFmpeg(10)-利用FFmpeg进行视频像素格式和尺寸的转换(sws_getCachedContext(), sws_scale())
热门文章
- 编写.gitignore 文件
- 【剑指offer】顺时针打印数组
- 分解质因数法求最大公约数(javascrip实现)
- hdu 4489 The King’s Ups and Downs(基础dp)
- 【模拟】 Codeforces Round #434 (Div. 1, based on Technocup 2018 Elimination Round 1) C. Tests Renumeration
- 【推导】【构造】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem E. Space Tourists
- Java学习笔记(10)
- c#版 mqtt 3.1.1 client 实现
- 【mysql】备份篇2:使用java程序定期备份mysql数据库
- cmd复制粘贴