读书笔记—Activity的生命周期和启动模式

来源:互联网 发布:淘宝客买家入口在哪里 编辑:程序博客网 时间:2024/06/05 16:38

Activity的生命周期和启动模式

Activity的生命周期

1.生命周期对应关系

onCreate-onDestroy:创建-销毁onStart-onStop:可见-不可见onResume-onPause:可交互-不可交互

2.如果Activity设置了透明主题,则不会调用onStop

3.Activity启动过程简介:

启动Activity的请求会由Instrumentation处理,然后它通过Binder向AMS发送请求,AMS内部维护着一个ActivityStack并负责栈内的Activity的状态同步,AMS通过ActivityThread去同步Activity的状态从而完成生命周期方法的调用。

4.在新Activity启动之前,栈顶的Activity需要先onPause后,新Activity才会启动。

5.onPause和onStop都不能执行耗时的操作,尤其是onPause,也就是说,我们应当尽量在onStop中做操作,从而使得新Activity尽快显示出来并且切换到前台。

6.异常情况下的生命周期分析:

  • 1.资源现相关的系统配置发生变化导致Activity被杀死并重新创建

    • 默认情况下,系统配置发生改变后会导致Activity销毁并重新创建,需要对数据进行保存
    • 保存数据的两种方式:
    1.onSaveInstanceState()——onRestoreInstanceState()|onCreate()    1.1 onSaveInstanceState()    (1)来保存当前Activity的状态,这个方法的调用时机是在onStop之前,它和onPause没有既定的时序关系。    (2)这个方法只会出现在Activity被异常终止的情况下,正常情况下系统不会回调这个方法。    (3) 系统只有在Activity即将被销毁并且有机会重新显示的请下才会调用。    1.2 onRestoreInstanceState(Bundle bundle)    (1) 和onCreate都可以来判断Activity是否重建    (2) 调用时机在onStart之后。    (3) 一旦被调用,其参数Bundle一定是有值的,不需要额外进行判空。    (4) 使用onCreate进行数据恢复时,其参数Bundle有可能为空,此时必须进行判空操作。2.声明Activity的configChanges属性    android:configChanges="orientation|screenSize|keyboardHidden"
  • 2.资源内存不足导致低优先级的Activity被杀死

    • 按照优先级从高到低,分为三种:
    1.前台Activity2.可见但非前台Activity3.后台Activity

Activity的启动模式

1.任务栈是一种“后进先出”的栈结构

2.四种启动模式:

1.standard:标准模式2.singleTop:栈顶复用模式3.singleTask:栈内复用模式4.singleInstance:单实例模式

3.标准模式:standard

  • 1.谁启动了这个Activity,那么这个Activity就会运行在启动它的那个Activity所在的栈中。
  • 2.ApplicationContext启动标准模式的Activity会出现的问题
Calling startActivity from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag.Is this really what you want?

4.栈顶复用模式:singleTop

  • 1.如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法会被调用。

5.栈内复用模式:singleTask

  • 1.只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例,并会回调onNewIntent方法。
  • 2.singleTask默认具有clearTop效果,会导致栈内所有在该Activity上面的Activity全部出栈。
  • 3.当一个具有singleTask模式的Activity请求启动后,系统首先会寻找是否存在该Activity想要的任务栈,如果不存在,就重新创建一个任务栈,然后创建Activity的实例后把Activity放到栈中。如果存在所需要的任务栈,这是要看Activity是否在栈中有实例存在,如果有实例存在,那么系统就会把Activity调到栈顶并调用它的onNewIntent方法,如果实例不存在,就创建实例并压入栈中。(需要仔细理解)

6.单实例模式:singleInstance

  • 1.这是一种加强的singleTask模式,具有singleTask模式的所有特性。
  • 2.具有此模式的Activity只能单独位于一个任务栈中。

7.TaskAffinity:任务相关性

  • 这个参数标识了一个Activity所需要的任务栈的名字,默认情况下,所有Activity所需要的任务栈的名字为应用的包名。
  • TaskAffinity属性主要和singleTask启动模式或者allowTaskReparenting属性配合使用。
当TaskAffinity和allowTaskReparenting结合使用的时候,会产生特殊的效果。当一个应用A启动了应用B的某个Activity后,如果这个Activity的allowTaskReparenting设置为true的话,那么当应用B被启动后,此Activity会直接从应用A的任务栈转移到应用B的任务栈中。

8.常用的adb命令

1.查看运行的activity:adb shell dumpsys activity

9.Activity的Flags

1.FLAG_ACTIVITY_NEW_TASK:singleTask的启动模式2.FLAG_ACTIVITY_SINGLE_TOP:singleTop的启动模式3.FLAG_ACTIVITY_CLEAR_TOP:清除栈顶4.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS具有此标记的Activity不会出现在历史Activity列表中。等同于在xml中指定属性android:excludeFromRecents="true"
0 0
原创粉丝点击