Android进阶之路Android知识Android开发

Activity你该懂的

2017-02-13  本文已影响819人  Benhero

本文不适合入门新手,适合进阶者阅读。

0. 提问

一. 生命周期

1. 顺序

Activity Lifecycle

2. 详细作用

Tips:注册、反注册应当在成对的生命周期回调方法里执行

3. onStart和onResume?

onStart和onResume都是可见,区分在于onResume可点击交互,用户可以操作界面。

4. onPause和onStop?

5. 异常状态下的生命周期

1. 系统配置改变

如屏幕旋转、键盘、语言等等,会触发Activity重新创建。若想要这些改变时,不触发Activity重启,可以通过在AndroidManifest里设置activity的configChanges属性。常用的有locale(语言区域)、orientation(屏幕方向)、keyboardHidden(键盘无障碍功能)、screenSize(当前可用屏幕尺寸发生了变化,旋转屏幕尺寸会触发)。具体参照官网API指南

2. 系统资源不足

Activity优先级从高到低,分3种:
Ⅰ. 前台:可交互
Ⅱ. 可见非前台:比如打开了一个对话框或者透明Activity
Ⅲ. 后台:跳转其他Activity
内存不足时,从低到高进行销毁。

二. 状态保存与恢复

当Activity跳转到其他Activity,或者按Home键后,在后台由于资源不足被系统回收,再次打开时若想恢复原有的数据,则需要通过Bundle进行数据存储与恢复。

三. LaunchMode-启动模式

1. 设置方法

  1. AndroidMenifest配置:无法设置FLAG_ACTIVITY_CLEAR_TOP标识
  2. 代码中设置intent.addFlags():若与第一种同时存在,则以本方式为准,无法设置singleInstance模式

2. Activity任务栈

3. LaunchMode的4种类型

  1. standard:标准模式:每次启动一个Activity都会创建一个新的实例,并加入到当前任务栈的顶部

  2. singleTop:栈顶复用模式:若打开的Activity位于即将放入的栈的顶部,则复用,不会创建新的实例。按照onPause → onNewIntent → onResume的顺序触发,可以onNewIntent内处理业务。

  3. singleTask:栈内复用模式:Activity A在栈S1,若A打开B(singleTask)

  1. singleInstance:单实例模式:单独位于一个任务栈中,栈中不会有其他Activity,单例,你懂的,还是onNewIntent。

4. 标识Flags

验证方式:Manifest中配置为singleTask的Activity,通过一个application的context来启动一个声明为singleTask的Activity来进行测试,会报错。因为在解析目标Activity属性之前,系统对context进行检测,导致报错,位于源码中的ContextImpl.startActivity方法中。

正确理解如下(通过源码理解测试):

特别组合:被启动的Activity使用standard模式,则会将它以及它以上的Activity都出栈,创建新的Activity放入栈中。

5. 应该进入哪个任务栈?(难点)

  1. taskAffinity:官方翻译为亲和关系,而非栈名,表示更倾向于进入哪个栈。所以不是设置了该属性的Activity,就是在属于这个名的栈中
  2. taskAffinity不设置时,则默认为包名;设置为空,则为当前Activity的包名路径
  3. 当A启动一个声明为standard、singleTop的B时,且不带FLAG_ACTIVITY_NEW_TASK,则只会加入到A所在的栈顶,不会加入B所配置taskAffinity所声明的栈顶。
  4. 不严谨的概括:只有singleTask、singleInstance或者带FLAG_ACTIVITY_NEW_TASK等带创建栈能力的方式启动,才会让taskAffinity生效。
  5. allowTaskReparenting这个属性,也会让taskAffinity生效。比如栈S1中的A启动设置了taskAffinity的B,无论B使用使用什么启动模式,B都会被放入其taskAffinity所声明的栈。

四. 文章引用

本文是在学习了以下文章后,进行案例测试后的总结归纳,强烈推荐阅读以下书籍、博客。LaunchMode这部分知识特别需要代码测验,才能理清几个关键细节。

上一篇 下一篇

猜你喜欢

热点阅读