前面一篇文章概述了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()掉界面.

  • 小结

  一切的理论都要经得起实践的考验,一切不以解决问题为目的的博客文章都是在打酱油.问题得到了解决,灰常开心.

最新文章

  1. Scrapy 爬虫
  2. linux笔记三-------根目录相关说明
  3. How To Install Tinc and Set Up a Basic VPN on Ubuntu 14.04
  4. react 绑定事件
  5. Xen虚拟机磁盘镜像模板制作(三)—CentOS 7
  6. leetcode@ [49] Group Anagrams (Hashtable)
  7. iOS 中SQLite数据库操作
  8. Hibernate 一对多单向关联Demo
  9. VC中的Attach和Detach
  10. (转载博文)VC++API速查
  11. Unity应用架构设计(10)——绕不开的协程和多线程(Part 2)
  12. 《疯狂java讲义》读后感
  13. 图解 HTTP 的缓存机制 | 实用 HTTP
  14. webstorm配置svn详解
  15. BOM与DOM操作
  16. Django之ORM操作(聚合 分组、F Q)
  17. JUC同步锁(五)
  18. PHP快速排序算法
  19. js 继承的方式
  20. FFmpeg(10)-利用FFmpeg进行视频像素格式和尺寸的转换(sws_getCachedContext(), sws_scale())

热门文章

  1. 编写.gitignore 文件
  2. 【剑指offer】顺时针打印数组
  3. 分解质因数法求最大公约数(javascrip实现)
  4. hdu 4489 The King’s Ups and Downs(基础dp)
  5. 【模拟】 Codeforces Round #434 (Div. 1, based on Technocup 2018 Elimination Round 1) C. Tests Renumeration
  6. 【推导】【构造】XVII Open Cup named after E.V. Pankratiev Stage 14, Grand Prix of Tatarstan, Sunday, April 2, 2017 Problem E. Space Tourists
  7. Java学习笔记(10)
  8. c#版 mqtt 3.1.1 client 实现
  9. 【mysql】备份篇2:使用java程序定期备份mysql数据库
  10. cmd复制粘贴