Activity的生命周期以及Activity的launchMode

一、Activity的生命周期

1.Activity生命周期中的重要方法

(1)、onCreate():表示Activity已经被创建。这是Activity生命周期中的第一个方法,Activity生命周期只执行一次,可以在这个方法里做一些初始化工作,比如setContentView加载布局资源,初始化Activity所需要的数据等

(2)、onReStart():表示Activity重新被启动。该方法可以被执行多次,之后紧跟着onStart()。一般是Activity从不可见变为可见时调用。比如:Activity界面按home键或者重新打开一个新的Activity,当前Activity就会停止,执行onPause()和onStop()方法后,用户又回到当前Activity时会被调用。

(3)、onStart():表示Activity已经创建完成,正在被启动。这个方法表示Activity已经是可见状态,但是没有出现在前台,用户看不到,所以还不能和用户进行交互。该方法可以被执行多次,一般是重现启动时,在onReStart()后面被调用.

(4)、onResume():表示Activity已经可见了。该方法说明Activity已经在前台显示了,用户可以看见了,并且交互了。该方法可以被执行多次。

(5)、onPause():表示Activity正在停止,紧接着执行下面onStop()方法。此时可以做一些数据存储、动画停止的任务。不能做太耗时任务,会阻塞UI线程的,影响Activity的显示。该方法适合onResume()相对的。该方法可以被执行多次。

(6)、onStop():表示Activity即将停止。此时可以做一些轻量级资源回收的工作,单不能太耗时。该方法适合onStart()相对的。该方法可以被执行多次。

(7)、onDestory():表示Activity即将被销毁。这是Activity生命周期中的最后一个方法,Activity生命周期中只执行一次,该方法适合onCreate()相对的。可以在该方法中做资源的最终回收已经释放。

(7)、onReStart():表示Activity重新被启动。该方法可以被执行多次,之后紧跟着onStart()。一般是Activity从不可见变为可见时调用。比如:Activity界面按home键或者重新打开一个新的Activity,当前Activity就会停止,执行onPause()和onStop()方法后,用户又回到当前Activity时会被调用。

2、Activity的生命周期


Activity的生命周期以及Activity的launchMode_第1张图片

(1)第一次启动Activity,回调如下:onCreate-->onStart-->onResume。

(2)当用户打开新的Activity或者回到桌面时,回调:onPause-->onStop(如果新的Activity是透明主题的话不会回调onStop)。

(3)用户回到原Activity时,回调如下:onRestart-->onStart-->onResume.

(4)退出Activity是,回调如下:onPause-->onStop-->onDestroy.

(5)当Activity被回收后,重新打开Activity时,是重新创建了Activity,回调和(1)一样。

备注:有错误的地方,还望指正,共同进步。

二、Activity的launchMode

(1)、standard:系统默认的启动模式。Activity在AndroidManifest中不设置launchMode属性时,系统就会以standard的模式启动Activity。该模式的Activity,每启动一次就会创建一个新的实例,放到Activity的任务栈里,不管该Activity是否存在。

(2)、singleTop:栈顶复用模式。该模式下,新的Activity启动时,如果在Activity的任务栈中已经有该Activity的实例,并且位于栈顶,那么新的Activity就不会被重新创建,而是复用栈顶的Activity,同时回调栈顶Activity的onNewIntent方法。如果任务栈中该Activity的实例不位于栈顶或者没有该Activity的实例,则创建新的Activity实例。

比如:Activity任务栈中有3个Activity实例A-B-C,Activity B和C的模式是singleTop。

       1、如果再次启动C时,系统就不会创建Activity C的实例,而是直接调用Activity C的onNewIntent方法。此时任务栈中Activity实例是:A-B-C。

       2、如果再次启动B时,由于B不位于栈顶,系统就会重新创建B的实例。此时任务栈中Activity的实例是:A-B-C-B。

(3)、singleTask:栈内复用模式,该模式是一种单例模式。在这种模式下,只要Activity在一个任务栈中存在,那么不管启动多少次该Activity都不会重新创建新的实例,而是回调onNewIntent方法。该模式还带有clearTop效果,会把任务栈位于该Activity实例之上的所有Activity实例全部出栈。

比如:Activity任务栈S1中有3个Activity实例A-B-C,B的模式是singleTask,新的Activity实例D也是singleTask模式。

       1、如果启动D,并且压入到任务栈S1中。则创建新的实例D,压入到S1中。此时S1中Activity的实例是:A-B-C-D。

       2、如果启动的是实例B的话,并且压入到任务栈S1中。则不会创建新的实例B,而是直接回调S1栈中的实例B的onNewIntent方法,并且把栈中实例B之上的C出栈。此时S1中Activity的实例是:A-B。

      3、如果启动的是实例B的话,并且压入到任务栈S2中。系统就会查找有否存在S2,如果不存在,就创建S2,并不B压入到S2,此时任务栈实例:S1任务栈{A-B-C}、S2任务栈{B}。如果S2存在,就查看S2中是否有实例B。若S2中不存在B,则创建并压入S2任务栈中。若S2中存在B,则直接回调栈中的实例B的onNewIntent方法,并把栈中B之上的实例出栈。

(4)、singleInstance:单实例模式。是singleTask的升级版,不但包含了singleTask模式的特性外,还具有有一点,只能单独位于一个任务栈中。该模式的Activity第一次被启动时,系统会为该Activity创建一个新的任务栈,该Activity独自在这个任务栈中。由于站内复用特性,后续不会创建新的该Activity实例。除非这个任务栈被销毁。

三、Intent Flags(或者Activity的Flags)

Flags:表示Intent的标志位,常用于Activity的场景中,它和Activity的启动模式有着密切的联系。Flags优先级高于AndroidManifest中的LaunchMode属性。如果Activity A在AndroidManifest中设置了LaunchMode属性,而且在启动A时有添加了Flags标志位,则已Flags标志位为准。

以下介绍几种常见的Flags:

(1)、FLAG_ACTIVITY_NEW_TASK 

当Intent对象包含这个标记时,系统会寻找或创建一个新的task来放置目标Activity,寻找时依据目标Activity的taskAffinity属性进行匹配,如果找到一个task的taskAffinity与之相同,就将目标Activity压入此task中,如果查找无果,则创建一个新的task,并将该task的taskAffinity设置为目标Activity的taskActivity,将目标Activity放置于此task。注意,如果同一个应用中Activity的taskAffinity都使用默认值或都设置相同值时,应用内的Activity之间的跳转使用这个标记是没有意义的,因为当前应用task就是目标Activity最好的宿主

FLAG_ACTIVITY_SINGLE_TOP

这个FLAG就相当于启动模式中的singletop,例如:原来栈中结构是A B C D,在D中启动D,栈中的情况还是A,B,C,D。

FLAG_ACTIVITY_CLEAR_TOP

这个FLAG就相当于启动模式中的SingleTask,这种FLAG启动的Activity会把要启动的Activity之上的Activity全部弹出栈空间。例如:原来栈中的结构是A B C D ,从D中跳转到B,栈中的结构就变为了A B了。(这个方法可以用来关闭多个Activity,之后的一篇博文里面会提到)

FLAG_ACTIVITY_BROUGHT_TO_FRONT

这个网上很多人是这样写的。如果activity在task存在,拿到最顶端,不会启动新的Activity。这个有可能会误导大家! 他这个FLAG其实是这个意思!比如说我现在有A,在A中启动B,此时在A中Intent中加上这个标记。此时B就是以FLAG_ACTIVITY_BROUGHT_TO_FRONT方式启动,此时在B中再启动C,D(正常启动C,D),如果这个时候在D中再启动B,这个时候最后的栈的情况是 A,C,D,B。如果在A,B,C,D正常启动的话,不管B有没有用FLAG_ACTIVITY_BROUGHT_TO_FRONT启动,此时在D中启动B的话,还是会变成A,C,D,B的。

FLAG_ACTIVITY_NO_USER_ACTION

onUserLeaveHint()作为activity周期的一部分,它在activity因为用户要跳转到别的activity而要退到background时使用。比如,在用户按下Home键,它将被调用。比如有电话进来(不属于用户的选择),它就不会被调用。

那么系统如何区分让当前activity退到background时使用是用户的选择?

它是根据促使当前activity退到background的那个新启动的Activity的Intent里是否有FLAG_ACTIVITY_NO_USER_ACTION来确定的。

注意:调用finish()使该activity销毁时不会调用该函数

FLAG_ACTIVITY_NO_HISTORY

意思就是说用这个FLAG启动的Activity,一旦退出,它不会存在于栈中,比方说!原来是A,B,C这个时候再C中以这个FLAG启动D的,D再启动E,这个时候栈中情况为A,B,C,E。


备注:有错误的地方,还望指正,共同进步。

你可能感兴趣的:(Activity的生命周期以及Activity的launchMode)