(一)学习笔记——Activity的生命周期和启动模式

1.Activity的生命周期
  • onCreate:表示Activity正在创建,是生命周期调用的第一个方法,在这个方法中可以做一些初始化的工作。例如调用setContentView去加载界面布局资源,初始化Activity所需要的数据。
  • onRestart:表示Activity正在重新启动,当当前Activity从不可见重新变为可见状态的时候,onRestrat就会被调用。通常是用户的操作所导致的,例如用户按下Home键切换带桌面或者用户打开了一个新的Activity,这时当前的Activity就会被暂停,执行了onPause和onStop被执行,但是还没有执行到onDestroy,接着这个用户又回到这个Activity就会调用该方法。
  • onStart:表示Activity正在启动,即将开始,这时的Activity已经可见了,但是还没出现在前台,无法和用户进行交互,可以理解为Activity已经显示出来,但是我们还不能看见。
  • onResume:表示Activity已经可见了,并且出现在前台并且开始活动,与onStart的区别是,虽然两者都是可见的,但是onStart的时候Activity还在后台,不可进行交互,而onResume的时候已经出现在前台,可进行交互。
  • onPause:表示Activity正在停止,此时可以做一些存储数据,停止动画等工作,但是需要注意不能太耗时,因为这会影响到Activity的显示,onPause必须现执行完,新的Activity的onResume才会执行。
  • onStop:表示Activity即将停止,可以做一些稍微轻量级的回收工作,但是不能太耗时。
  • onDestroy:表示Activity即将被销毁,这个是Activity生命周期中的最后一个回调,可以做一些回收工作和最终的资源的释放。
    (一)学习笔记——Activity的生命周期和启动模式_第1张图片
    Activity生命周期的切换过程

    Q:假设当前Activity为A,如果这时用户打开一个新的ActivityB,那么B的onResume和A的onPause哪个先执行。
    执行顺序:A-onPause()->B onCreate()->B onStart()->B onResume()-A onStop()
    (一)学习笔记——Activity的生命周期和启动模式_第2张图片
    image.png

    Q这时按下返回键的执行过程:
    执行顺序:B-onPause()->A-onRestart()->A-onStart()->A-onResume()->B-onStop()->B-onDestory();
    (一)学习笔记——Activity的生命周期和启动模式_第3张图片
    image.png
2.Activity的启动模式

2.1 Activity的LaunchMode

  • standard:标准模式,是系统默认的模式。每次启动一个Activity都会重新创建一个新的实例,不管这个实例是否已经存在。一个任务栈可以有多个实例,每个实例也可以有多个任务栈,在这种模式下,谁启动了这个Activity,那么这个Activity就运行在启动它的那个Activirty所在的栈中。
  • singleTop:栈顶复用模式,在这种模式下,如果新Activity已经在任务栈的栈顶了,那么此Activity不会被重新创建,同时它的onNewIntent方法会被回调,通过此方法的参数我们可以取出当前请求的信息。如果新Activity如果存在但是不是在栈顶,那么新Activit依然会重新创建。
  • singleTask:栈内复用模式。是一种单例模式,在这种模式下,Act只要Activity在一个栈中存在,那么多次启动此Activity都不会重建,和singleTop一样,也会回调其onNewIntent。注意当一个任务栈s1中存在Activity D中时,s1当前情况为ABCD,但是不在栈顶,此时不会重新创建,系统会把Activity D切换到栈顶并调用其onNewIntent方法,同时由于singleTask默认具有cleanTop的效果,会导致栈内所有在D上面的Activity全部出栈,任务栈s1的情况为AD。
  • singleInstance:单实例模式,此种模式的Activity只能单独地位于一个任务栈中。
    Q:如何给Activity指定启动模式呢?
    有两种方法,第一种是通过AndroidMenifest为Activity指定启动模式。
    image.png

    第二种是通过在Intent中设置标志位为Activity指定启动模式。
    image.png
    但是两者是由区别的,第二种方式的优先级要高于第一种,在限定范围上有所不同,第一种方式无法直接为Activity设定FLAG_ACTIVITY_CLEAR_TOP标识,而第二种方法无法设定为Activity指定singleInstance模式。

2.2 Activity的Flags

  • FLAG_ACTIVITY_NEW_TASK:这个标记位的作用是为Activity指定singleTask启动模式。
  • FLAG_ACTIVITY_SINGLE_TOP:这个标记位的作用是位Activity指定singleTop启动模式。
  • FLAG_ACTIVITY_CLEAR_TOP:具有此标记为的Activity,当它启动时,在同一个任务栈中的所有位于它上面的Activity都要出栈。这个模式 一般需要和FLAG_ACTIVITY_NEW_TASK配合使用。
  • FLAG_ACTIVITY_EXCUDE_FROM_RECENTS:具有这个标记位的Activity不会出现在历史Activity的列表中,当某些情况下我们希望通过历史列表回到我们的Activity的时候这个标记比较有作用。它等同于在XML中指定Activity的属性android:excludeFromRecents="true"。
1.IntentFilter的匹配规则

隐式调用需要Intent能够匹配目标组件的IntentFilter中所设置的过滤信息,如果不匹配将无法启动目标Activity。为了匹配过滤列表,需要同时匹配过滤列表中的action,category,data的信息,否者匹配失败。只有一个Intent同时匹配action类别,category类别,data类别才能算完全匹配过程,另外注意,哟个Activity中可以有多个intent-filter,一个Intent只要能匹配任意一组intent-filter即可以成功启动对应的Activity。

  • action的匹配规则:action时哟个字符串,匹配规则是Intent中的action必须能够和过滤规则中的action匹配。
  • category的匹配规则:category是一个符出串。匹配规则和action的匹配规则不同,它要求Intent中如果含有category,那么所有的category都必须和过滤规则中的其中一个category相同。action要求Intent中必须有一个action且必须能够和过滤规则中的某个action相同,而category要求Intent可以没有category,但是如果有categroy,不管有几个,每个都要能够和过滤规则中的任何一个category相同。
  • data的匹配规则:data的匹配规则和action类似,它要求Intent中必须还含有data数据,并且data数据能够完全匹配过滤规则中的某一个data。这里的完全匹配是指过滤规则中出现的data数据也要出现在Intent的data中。


    (一)学习笔记——Activity的生命周期和启动模式_第4张图片
    image.png

以上内容来源于《Android开发艺术与探索》

你可能感兴趣的:((一)学习笔记——Activity的生命周期和启动模式)