假如编程易懂得,那么程序员就不会热情地写出注释,也不会有得到编程的快乐。
这周六周日是在是太忙了,导致博客没有及时更新,在这里深表惭愧,所以这才加班加点完成一篇博客来弥补我的过失,好了不说那么多了,进入正题,今天主要讲的是 Activity 的声明周期和启动模式,其实这两个地方的基础知识本篇不会介绍很多,本篇主要介绍的是我们在使用中遇到的问题,和我们在使用中正确的使用规则。
一、概述
1、当我提起 Activity 的生命周期的时候,你会很容的回答出,onCreate 、onStart、onResume、onPause、onStop、onDestory 等一些回调方法,那每个回调中,我们应该做什么事情,不应该做什么事情或许你就很迷惑了,那今天我们在这篇文章中将会问你排忧解惑。
2、Activity 的启动模式在我看来也是一个很有意思的东西,我们可以通过设置 launchMode 这个属性指定我们的 Activity 的启动模式,我们通常的 Activity 启动模式都是 standard ,有时候会用到 singleTop 和 singleTask,其实我认为最有意思的就是这个 singleInstance,那今天我们就来说说我们在使用这四种启动模式遇到的问题。
二、Activity 生命周期
2.1 正常情况下的声明周期
onCreate:
这个方法其实不用我们多说了,一般只会执行一次,就是进行一些初始化等操作,这个方法中有一个
Bundle 值,这个值在我们正常启动的时候会是空的,所以我们判断是否为正常启动就判断一些这个 Bundle是否 为空就可以了。
onStart:
当回调这个方法的时候,说明我们的 Activity 已经可见了,但是还没有出现在前台,你可以这样理解,这个方 法执行的时候,我们的 Activity 已经可见了,只是我们还看不到。
onRestart:
这个方法是我们重新启动的时候会回调的,当我们的 Activity 从可见到不可见,再由不可见变为可见,这个 方法就会调用,这个方法和用户的操作息息相关,比如用户点了 home 再次回到 APP,或者用户从 A 界面到 B 界面,然后点击了返回键都会回调这个方法。
onResume:
这个方法和 onStart 的区别就是当这个方法回调的时候,Activity 已经出现在前台了,onStart 回调的时候 Activity 还在后台,所以当回调这个方法的时候,Activity 已经可见了。
onPause:
这个方法表示 Activity 正在停止,正常情况下,这个方法执行之后就会执行 onStop 方法,不过在极端情况 下,当用户迅速点击返回键的时候,会直接执行 onResume 方法。因为只有这个方法执行完成,新的 Activity 的 onResume 方法才会执行,所以不要在这个方法中执行一些耗时的操作,因为如果执行耗时操作的话,跳转会慢 很多。
onStop:
这个方法执行的时候表示 Activity 即将停止,可以做一些相对耗时的操作,同样不能太耗时。注意:如果 Activity 使用了透明主题,那么不会回调这个 onStop 方法。
onDestory:
此方法执行之后表示 Activity 正式被销毁,那在这个方法中我们一定要执行资源回收和释放,不然很容易引 起内存泄漏。
最后提出一个问题 onStart 和 onResume ,onPause 和 onStop 有什么不同?
答:对于我们使用,那么最主要的区别就是 onStart 和 onStop 主要是区分 Activity 是否可见来回调的,那 onPause 和 onResume 主要是区分 Activity 是否位于前台来区分的。
2.2 异常情况下的声明周期
首先说一下, 我们的 Activity 的三种运行状态:
①、前台 Activity ,也就是正在和用户进行交互的 Activity。
②、可见但是非前台的 Activity,也就是说这个 Activity 弹出了一个 dialog 导致 Activity 可见但是位于后台
无法交互
③、后台 Activity,已经被暂停的 Activity,比如执行了 onStop。
三、启动模式
启动模式的指定可以改写我们 Activity 栈的顺序,从而修改我们返回的 Activity,我认为最大的作用就是我们的返 回退出。启动模式可以通过 lunchMode 指定。 好了不说这些,下面说正题,Activity 的四种启动模式。
①、standard
定义我就不再这里说明了,这里说一个我们在使用中遇到的问题,在我们用 Application 的 context 去进行跳转 的时候,我们会跳转失败,因为我们新启动的 Activity 需要一个 task,而 context 没有 task,这样就会出现问 题,解决办法就是我们跳转的时候给 Activity 指定一个 task。
当我们启动一个 Activity 的时候指定了一个 task ,那么系统会先创建 task 再去创建 Activity 。
②、singleTop
这个启动模式知识点也就一个,那就是当我们启动的 Activity 在栈顶的时候,这个 Activity 会调用 onNewIntent 方法。
③、singleTask
singleTask 和 singleTop 最大的区别就是会执行 clearTop 操作。clearTop 操作会将目标 Activity 上面的全
部 Activity 出栈。
④、singleIntance
它是 singleTask 的加强版,当我们启动一个新的 Activity 回去重新创建一个 Task,这样我们的 Activity 就运行在
一个独立的 Task 中。
下面说几种特殊情况:
上文中我们多次提到了 Task,那么这个 Task 到底是什么呢,下面看看我的理解:
四、使用中注意的问题
1、当我们每次新启动一个 Activity 的时候,我们的旧 Activity 的 onPause 方法总会最先调用,所以在我们跳 转的时候不要在 onPause 方法中执行耗时的代码,这样会导致跳转缓慢。
2、有两种方法可以指定 lunchMode 一种是配置,一种是在 Intent 中设置,后者的优先级高于前者。
总结:
这些都是在项目中总结出来的一些经验,如果有什么出入欢迎指出,我们共同进步。谢谢。
雅歌不会编代码
2017/07/10