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

来源:互联网 发布:小米抢红包软件 编辑:程序博客网 时间:2024/05/21 14:07

1.1 Activity的生命周期全面分析

1.1.1 典型情况下的生命周期分析


  • 从整个生命周期来说,onCreate和onDestroy是配对的,分别标识着Activity的创建和销毁,按下back键会回调如下:
    onPause->onStop->onDestroy。
  • 从Activity是否可见来说,onStart和onStop是配对的,随着用户的操作或者设备屏幕的点亮和熄灭,这两个方法可能会调用多次。
  • 从Activity是否位于前台来说,onResume和onPause是配对的,随着用户的操作或者设备的点亮和熄灭,这两个方法可能会调用多次。

Android官方文档对onPause解释:不能在onPause中做重量级操作,因为必须onPause执行完成之后新Activity才能onResume,应尽量在onStop中做操作,使新Activity尽快显示出来并切换到前台

1.1.2异常情况下的生命周期分析

  • 情况1:资源相关的系统配置发生改变导致Activity被杀死并重新创建
    比如横屏手机和竖屏手机拿到两张不同的图片,突然屏幕旋转,默认情况下,Activity会被销毁并且重新创建。
    • 由于Activity是在异常情况下终止的,系统会调用onSaveInstanceState来保存当前Activity的状态,调用时机在onStop之前。
    • 当Activity被重新创建后,系统会调用onRestoreInstanceState,调用时机在onStart之后,并把onSaveInstanceState方法保存的Bundle对象作为参数传递给onRestoreInstanceState和onCreate方法。
    • 系统只在Activity异常终止的情况下才会调用onSaveInstanceState和onRestoreInstanceState来存储和恢复数据,其他情况不会触发这个过程,但是按home键或者启动新的Activity仍然会单独触发onSaveInstanceState的调用。
  • 情况2:资源内存不足导致低优先级的Activity被杀死
    • Activity优先级,由高到低,可以分如下三种:
      前台Activity -> 可见非前台Activity -> 后台Activity
    • 不想系统重新创建Activity可以给指定configChanges属性
      android:configChanges="orientation" 屏幕旋转不会重新创建
      注意:minSdkVersion和targetSdkVersion有一个大于13,还要加上screeSize。

1.2Activity的启动模式

1.2.1 Activity的LaunchMode

  • standard:标准模式,系统默认模式。每次启动一个Activity都会创建一个实例,不管实例是否已经存在。一个任务栈中可以有多个实例,每个实例可以存在不同的任务栈,在这种模式下,谁启动了这个Activity,那么这个Activity就运行在启动那个Activity的任务栈中。
  • singleTop:栈顶复用模式。如果新Activity已经位于栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法会被回调,这个Activity的onCreate和onStart方法不会被系统调用。如果新的Activity没有在栈顶,那么新Activity会被重新创建。
  • singleTask:栈内复用模式,单实例模式。只要Activity在栈中存在,那么多次启动此Activity都不会重新创建实例,回调其onNewIntent方法。
    • 例子1:任务栈S1中为ABC, Activity D以singleTask模式请求启动,所需任务栈为S2,系统会先创建任务栈S2,然后将实例D放入任务栈到S2。
    • 例子2:D所需要的任务栈为S1,系统会直接将创建实例D放入任务栈到S1。
    • 例子3:如果D所需要的任务栈为S1,栈内情况为ADBC,那么D不会被重新创建,调用其onNewIntent方法,由于singleTask有clearTop的效果,栈内所有D上面的Activity都会出栈,最终为AD。
  • singleInstance: 单实例模式。具有singleTask的所有特性,并且此模式的Activity只能位于一个任务栈中。Activity A是singleInstance模式,当A启动后,系统会新建一个新的任务栈,然后A会独自在这个新的任务栈中。

    某个Activity所需要的任务栈,从一个参数说起,TaskAffinity,翻译为任务相关性,默认情况下所需要的任务栈名字为应用的包名,TaskAffinity属性主要和singleTask或allowTaskReparenting属性配对使用,其他情况没有意义。

  • 给Activity指定启动模式有另种方法,一种在通过AndroidMenifest,一种通过Intent设置标志位addFlags为Activity指定启动模式。

1.2.2 Activity的Flags

  • FLAG_ACTIVITY_NEW_TASK
    为Activity指定singleTask启动模式,其效果和在XML中指定该模式相同。
  • FLAG_ACTIVITY_SINGLE_TOP
    为Activity指定singleTop启动模式,其效果和在XML中指定该模式相同。
  • FLAG_ACTIVITY_CLEAR_TOP
    为Activity指定singleTask启动模式,其效果和在XML中指定该模式相同。

1.3 InentFilter的匹配规则

隐式调用中需要需要Intent能够匹配目标组件的IntentFilter所设置的过滤信息,一个过滤列表中activity中action,category,data可以有多个,一个Activity中可以有多个intent-fliter,一个Intent只要能匹配任何一组intent-fliter即可成功启动对应Activity。


  • action的匹配规则
    • action是一个字符串,系统定义了一些action,同时也可以自己定义自己的action。一个过滤规则中可以有多个action,只要Intent中action能够和过滤规则中的任何一个action相同即可匹配成功。
  • category的匹配规则
    • category是一个字符串,系统定义了一些action,同时也可以自己定义自己的action。一个过滤规则中可以有多个action,Intent中如果出现了category,它必须是过滤规则中已定义了的category。Intent中也可以没有category。
  • data的匹配规则
    • data由两部分组成,mimeType和URI。mimeType指媒体类型,比如image/jpeg,video/*等。URI包括模式,主机名,端口号,路径信息,比如 http://www.baidu.com:80/search/info。
    • 过滤规则中指定媒体类型为图片,默认值为content和file。匹配如下
      intent.setDataAndType(Uri.parse(“file://abc”),”image/png”)。
      不能先调用setData,再调用setType,两个方法会彼此消除对方的值。

当我们通过隐式方式启动一个Activity的时候,可以先做一下判断,验证是否能够匹配成功,采用PackageManager的resolveActivity或Intent的resolveActivity方法。

原创粉丝点击