第一章 Activity的生命周期和启动模式

第一章 Activity的生命周期和启动模式

  1. 生命周期全面分析

    1. 典型情况 : 正常情况启动Activity

      1. 第一次启动某个特定Activity,回调:onCreate()->onStart()-> onResume()

      2. 用户打开新的Activity或者切换到桌面,回调如下:onPause()-> onStop(),如果Activity采用了透明主题,当前Activity不会调用onStop().

      3. 再次回到原来的Activity时,调用如下:onRestart->onStart()->onResume()

      4. onStart()、onStop()是从Activity是否可见的角度来回调的,onResume、onPause()是从是否位于前台的角度来回调的。

      5. 当前Acitivity为A,此时用户打开了一个新的Activity为B.此时A、B各自的调用顺序. onPause(A)->onCreate(B)->onStart(B)->onResume(B)->onStop(A)

      6. 不能在onPause()、onStop()中做耗时操作。资源回收等操作应该在onStop()中操作

    2. 异常情况 :例如屏幕旋转、系统配置发生变化,资源内存不足导致低优先级的Acitivity被杀死。

      1. 系统配置发生改变后,Activity会被销毁,系统会调用onSaveInstanceState()来保存当前Acitiviyt的状态,该方法在onStop()之前调用,onPause()前后都有可能。当Activity被重新创建后,系统会调用onRestoreInstanceState(),该方法在onStart()之后调用。
        第一章 Activity的生命周期和启动模式_第1张图片

      2. Activity销毁被重建,获取之前的存储,接收的位置可以是onCreate()或者onRestoreInstanceState()了,两者的区别,onRestoreInstanceState()一旦被调用,其参数Bundle savedInstanceState一定是有值的。onCreate()不行,onCreate()正常启动savedInstanceState为空。所以必须要进行额外判断。

      3. onSaveInstanceState 方法还有一点需要说明,那就是系统只会在Activity即将被销毁并且有机会重新显示的情况下才会调它。例如,屏幕发生旋转。Activity正常销毁不会调用。

      4. Acitivity优先级情况

        1. 前台Activity. 正与用户交互,优先级最高。
        2. 可见非前台Acitivity . 比如Activity弹出一个对话框,导致Acitivity可见但是位于后台无法与用户直接交互。
        3. 后台Activity. 已经被暂停的Activity ,优先级最低。
      5. 某项内容发生改变后,不想系统重新创建Acitivity.可以给Acitivity指定configChanges属性。例如:

        android:configChanges=”orientation”

  2. Acitivity的启动模式

    1. 各种启动模式:

      1. standard模式: 该模式下,,谁启动了这个Acitivity,那么这个Activity就运行在启动它的那个Acitivity所在的栈中。 由于非Activity类型的Context(例如ApplicationContext)并没有的所谓的任务栈。解决这个问题的方法就是为待启动Activity指定FLAG_ACTIVITY_NEW_TASK标记位,这样启动的时候就会为它创建一个的新的任务栈。

      2. singleTop模式:栈顶复用模式,如果新的Activity已经位于任务栈顶,此Activity不会被重新创建,同时它的onNewIntent()方法会被回调。这个Activity的onCreate() 、onStart() 、onResume()方法不会被调用。

      3. singleTask模式:栈内复用模式。常见的几种情况:

      1. 当前任务栈S1中的情况为:ABC,这个时候Activity D以singleTask模式请求启动,所需要的任务栈为S2,由于S2和D都不存在,所以系统会先创建任务栈S2,然后再创建D的实例将其压入栈S2

      2. 假设D所需要的任务栈为S1,由于S1已经存在,所以系统会直接创建D的实例并将其入栈到S1.

      3. 如果D所需要的任务栈为S1,当前任务栈S1的情况为ADBC,此时D不会被重新创建,系统会把D切换到栈顶并调用其onNewIntent方法。同时D上面所有的Activity全部出栈。

      1. 假设目前有两个任务栈,前台任务栈的情况为AB,后台任务栈的情况为CD,假设CD的启动模式均为singleTask,现在请求D,那么整个后台任务栈都会被切换到前台,这个时候整个后退列表变成了ABCD,当用户按back 时,列表的Activity会一一出栈.
      2. 和上面情况一样,当请求启动的是C,那么后台任务栈的D先出栈,然后,后台任务栈会切换到前台,整个后退列表变成了ABC
    2. SingleInstance:单实例模式:此种模式的Acitivity只能单独地位于一个任务栈。比如Activity A是singleInstance 模式,当A启动后,系统会为它建一个新的任务栈。然后A单独在这个新的任务栈中,由于栈内复用的特性,后序均不会创建新的任务栈。

    3. 什么是任务栈?
      TaskAffinity,任务相关性。标识一个Activity所需要的任务栈的名字。默认情况下,所需要的任务栈的名字为应用的包名。
      TaskAffinity主要和singleTask启动模式或者allowTaskReparenting属性相配对使用。
      任务栈分为前台和后台任务栈,后台任务栈Activity位于暂停状态,用户可以通过切换将后台任务栈再次调用到前台。

      1. 和singleTask启动模式使用
        待启动的Activity会运行在名字和TaskAffinity相同的任务栈中。
      2. 和alloTaskReparenting结合
        比如现在有两个应用A、B。A启动了B一个ActivityC,然后,按Home键回到了桌面,然后再单击B的桌面图标,这个时候并不是启动了B的主Activity.而是重新显示已经被应用A启动的AtivityC。
        由于A启动了C,这个时候ActivityC只能运行在A的任务栈中,但是C属于B应用,正常情况下,它的TaskAffinity不可能和A的任务栈相同,所以B被启动后,B会创建自己的任务栈,这个时候系统发现C原本想要的任务栈已经被创建了了,所以就把C从A的任务栈中转移过来了。
    4. 给Activity指定启动模式?
      1. 通过AndroidMenifest指定
      2. 通过在Intent中设置标志位来为Activity指定启动模式。

        两者区别:
        1.标志位优先级更高。
        2.第一种无法设定FLAG_ACTIVITY_CLEAR_TOP,第二种无法指定singleInstance模式。

  3. Ativity 的flags

    Activity 的flags有很多。常用作用,比如设定启动模式,还有的可以影响Activity的运行状态

  • IntentFilter 的匹配规则

    1. action匹配规则
      action的匹配要求Intent中的action存在且必须和过滤规则中的其中一个action相同。
    2. category匹配规则
      与action匹配过程不同的是,action要求Intent中必须有一个action且必须能够和过滤规则中的某个action相同,而category要求intent中可以没有category,但是如果你一旦有category,不管有几个,每个都要能够和过滤规则中的任何一个category相同。
    3. data匹配规则
      data匹配规则和action类似,它也要求Intent中必须含有data数据,并且data数据能够完全匹配过滤规则中的某一个data。
  • 你可能感兴趣的:(Android开发,读书笔记)