Android从零单排 002 关于activity的几个问题 -启动模式和Flags

Android 四种启动模式和Flags


四种启动模式

为什么要有启动模式?
1. 因为Android 要省电,这是原罪,如果每次启动Act都去弄个新的,你可以思考下,那得吃多少资源,你和别人聊微信,聊QQ,每次都来个新的界面,那样手机电池估计抗不过个把小时就要没电了.

2. 另外,act的存储方式是一种栈结构,采用”后进先出”的原则,同样道理,如果你在聊QQ的时候,看了一下腾讯新闻,然后朋友回了个消息,这时候,新闻act 处于聊天Act之上,如果想恢复聊天界面,是把已经有了的聊天Act拿上来,还是再创建一个新的,你怎么看?

  • Standard 标准模式
    这个模式就是默认的模式,如果你不去配置相关的参数,每次启动activity 就是重新创建一个新的实例,会执行相应的 oncreate,onstart,onresume 生命周期,所以,在一个任务栈中,是可能存在很多个相同activity 的实例,这点很重要,既然它没有特殊的地方,当你startActivity(new Intent (ApplicationContext,StandardActivity.Class)),会报错,因为Applicaiton是没有任务栈的,新创建的StandardAct无处可放,只能抛出异常了.

  • SingeTop 栈顶复用模式
    这种模式也很容易理解,启动的新的actvity 正好和栈顶的一样,行,我不创建新的,就原来的activity 我执行OnNewIntent 通过intent 接受用户可能改变参数变化,其他的初始化生命周期,我一个都不执行,尽可能的提高复用性.
    Android从零单排 002 关于activity的几个问题 -启动模式和Flags

  • SingeTask 栈内复用模式
    同singletask类似,顾名思义,是一种通过栈内寻找可复用的实例的模式,举个栗子,我要启动activity C ,首先,我会找C想要的的任务栈,没有一个合适的栈可以存放,那好,系统创建一个新的适合C存放的任务栈, 反之,存在这样一个任务栈,就去这个栈内部搜索C的实例,如果有,直接提到最上面层来,没有的话,创建一个C的实例,压入栈顶,这样也可以保证activity 的实例复用性.

    值得一提的是,SingTask自带Cleartop的效果(Flags后面会提到) ,用图片举个栗子,就可以一目了然.
    Android从零单排 002 关于activity的几个问题 -启动模式和Flags
  • SingleInstance 单实例模式
    可以理解为SingleTask的升级版本,什么意思呢,就是SingleInstance 模式下的activity,只会存在于一个新的任务栈,除非这个任务栈被销毁了,activity 不会重新创建新的,有点人在塔在的意味.

今天就先写在这个吧,体谅下加班狗.