android activity 应该知道的一切

来源:互联网 发布:深圳专业java培训机构 编辑:程序博客网 时间:2024/06/05 18:45

1 概述

activity在android中是基础,但是activity的运用中有许多的知识和细节,不代表所有的东西,我们都已经了解。这里我对activity的重要知识做出详解。

2 生命周期

(1) 正常情况

生命周期是最基本的东西,不废话直接上图:

这里写图片描述

这里写图片描述

这是谷歌官方的图,上面两张图很好的说明了activity的流程以及各种状态之间的转换关系。

activity是从什么时候开始可见的,从官方的文档中看,有如下话语:

这里写图片描述

这句话说得很清楚,当onStart被调用的时候,activity处于可见状态。
不过,此时activity并不能与用户交互,需要在onresume调用后才可以交互,所以。

其他的生命周期方法大家都比较清楚,还值得一说的是onPause方法,当我们在一个activity中启动另一个的时候,他们之间的生命周期顺序是怎么样的,要理解这一点,文档中的这段话尤为重要:

这里写图片描述

这里说明了,第一个activity会先执行onpause方法,随后新启动的activity会依次执行onCreate,onstart,onresume,随后,当第一个activity变得不再可见的时候,才会执行它的onstop。这两个activity之间的关系尤为重要。大家谨记。

(2) 异常情况

在文档的保存状态一节中,我们看到有如下图:

这里写图片描述

可以看到,这里表明了在某些异常情况下,activity可能被回收,情况种类如下。

(a) 资源系统配置

例如横竖屏变化的时候,activity可能被销毁掉重建,或者设备语言发生变化,或者键盘发生变化,如果不希望重启activity,可以在configChanges中配置对应的选项,那么activity将不会重新创建,取而代之的是回调onConfigurationChanged方法。

(b ) 系统资源内存不足

这种情况下,系统会回收低优先级的activity,保证系统的正常运行。

优先级如下

前台activity优先级最高

可见的activity次之

最低的是不可见的activity

出现上诉两种情况,需要在onSaveInstanceState和onRestoreInstanceState中保存和恢复数据。在官方文档中可以看到,onSaveInstanceState将会在onStop之前调用,有时候也可能在onPause之前调用。

3 启动模式

activity的启动模式有4种,分别为

standard
标准模式,也是默认的模式,每次启动一个activity都会创建一个新的activity的实例。例如B启动了A,那么A就会进入B的栈中。如果用Application来启动一个activity就会报错,因为Application并没有一个activity的栈,此时需要加入FLAG_ACTIVITY_NEW_TASK标志位,来新开启一个栈,此时的activity实际上是以singleTask启动的。
singleTop
栈顶复用模式,如果B启动A,A就在栈顶,那么A将不会被创建一个新的实例,而是直接调用onNewIntent,然后调用onResume。如果不再栈顶,那么依然会重新创建一个实例。
singleTask
栈内复用,意思是,一个栈内,只会有一个实例。同样的,系统会调用onNewIntent方法。调用这个Activity的时候,会判断是否有其需要的栈,如果没有,那么创建栈并创建实例压入栈中,如果有栈没有实例,那么创建实例压入栈中,如果有栈有实例,那么将实例调到栈顶,并清除掉栈中位于实例上面的activity。
singleInstance
单例模式,activity只有一个实例,并且单独在一个task中,且这个task只有它一个activity。

如果判断activity需要的任务栈呢,根据TaskAffinity属性,默认情况下,这个属性和包名相同,但是也可以人为指定。一般来说和singleTask或者allowTaskReparenting配合使用。除了singleTask以外,在standard以及singleTop中并不会新开task,而在singleInstance中会新开一个单独的task,所以设置与否都没有意义。

allowTaskReparenting标识是否允许activity调整到它原本就想要的task中。例如A应用打开了B应用中的页面c,那么c就进入了A的栈中,当我们从点击home然后从桌面点击B后,B的任务栈就创建了,此时系统发现c想要的任务栈B创建了,如果allowTaskReparenting为true,那么c将会被移动到B中来。

4 Flags

activity的flag可以在intent中设置,这里介绍几个常用的。

FLAG_ACTIVITY_NEW_TASK
指定singleTask模式启动

FLAG_ACTIVITY_SINGLE_TOP
指定singleTop启动

FLAG_ACTIVITY_CLEAR_TOP
一般和singleTask一起出现,此时位于被启动的activity栈上面的将activity被清除。如果是standard模式下使用这个标志,那么该栈中的这个activity以及他上面的都会被清除,然后重新创建一个实例。

FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
设置了这个标志的activity不会出现在历史activity列表中。

activity暂时讲解到这里,后面的文章,会讲解intentFilter的详细情况

1 0