Activity的生命周期和启动模式

Activity的生命周期和启动模式

  • Activity的生命周期
  • Activity的启动模式
  • IntentFilter的匹配规则

Activity的生命周期

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

Activity的生命周期

onCreate:Activity正在被创建,可进行一些初始化工作

onStart:Activity已经可见,但还没有出现在前台

onResume:可见可操作,显示在前台

onPause:Activity正在停止,可做一些存储数据、停止动画等工作(不能太耗时,会影响到新Activity的显示)

onStop:Activity即将停止,可做回收工作(不能太耗时)

onRestart:Activity正在重新启动(onPause和onStop被执行后,重新回到该Activity时调用)

onDestroy:Activity即将被销毁,可做回收工作和资源释放

注意

  1. 在新Activity启动之前,上一个Activity需要先onPause后,新的才能启动

2.onPause和onStop中都不能做耗时操作,尤其是onPause

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

1.资源相关的系统配置发生改变导致Activity被杀死重建

例:横竖屏切换、屏幕大小改变、软键盘显示变化

系统会调用onSaveInstanceState()来保存当前Activity的状态,当Activity重新创建后,系统会调用onRestoreInstanceState()来恢复之前的数据

注意

onRestoreInstanceStateonCreate都会获取保存的数据,区别在于:onRestoreInstanceState一旦被调用,其参数Bundle一定有值,不用判断是否为空;但onCreate不一定,所以建议采用onRestoreInstanceState来恢复数据。

不想要Activity重建时

可以给Activity设置configChanges属性

例:android:configChanges="orientation|screenSize|keyboardHidden"

此时当系统配置发生改变时,不会重建Activity,而是系统调用了Activity的onConfigurationChanged方法。

2.资源内存不足导致低优先级的Activity被杀死

Activity的优先级:

  1. 前台Activity
  2. 可见但非前台Activity
  3. 后台Activity

当系统内存不足时,系统会按照优先级由低到高杀死目标Activity所在的进程


Activity的启动模式

1. Activity的LaunchMode

(1)standard:标准模式。

每启动一个Activity都会在启动它的Activity所在的栈中重新创建一个新的实例。

(2)singleTop:栈顶复用模式。

如果新Activity已经位于任务栈的栈顶,则不会新建实例,同时调用onNewIntent方法。

(3)singleTask:栈内复用模式。

首先会寻找是否存在新Activity想要的栈,如果不存在,重新创建新的任务栈并创建Activity的实例;如果存在,判断栈中是否有Activity的实例,如果有,则把Activity调到栈顶,并调用它的onNewIntent方法,不会新建实例,如果没有,就创建实例并压入栈中。

(4)singleInstance:单实例模式。

只能单独位于一个任务栈中。

注意

默认情况下,所有Activity所需的任务栈名字为应用的包名。

给Activity指定启动模式:

例:
android:launchMode="singleTask"

intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

2. Activity的Flags

FLAG_ACTIVITY_NEW_TASK
为Activity指定“singleTask”启动模式

FLAG_ACTIVITY_SINGLE_TOP
为Activity指定“singleTop”启动模式

FLAG_ACTIVITY_CLEAR_TOP
启动时,所有位于它上面的Activity都要出栈

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
不会出现在历史Activity的列表中


IntentFilter的匹配规则

  • 一个Activity中可以有多个intent-filter,一个Intent只要能匹配任何一组intent-filter即可成功启动对应的Activity
  • Intent-filter中的过滤信息包括:action、category、data

action

只要Intent中的action能够和过滤规则中的任何一个action相同即可匹配成功

category

Intent中可以没有category,但如果有,则每个都要和过滤规则中的任何一个category相同

data

data由mimeTypeURI组成
URI的默认值为:content和file

例:
intent.addCategory("com.ryg.category.c");

intent.setDataAndType(Uri.parse("file://abc"),"text/plain");
posted @ 2018-05-05 18:27  lcOPM  阅读(138)  评论(0编辑  收藏  举报