活动的启动模式和生命周期

我们先来说一下活动的启动模式吧;活动的启动模式有四种:分别是:standard模式,singleTop模式(栈顶模式),singleTask(栈内复用),singlestance(全局单列模式)。

【怎么去指定使用这些启动模式呢?我们只需要在AndroidManifest.xml中通过给标签指定android:launchMode属性来选择启动模式】

下面用我理解的意思跟大家解释一下这四种模式的作用吧;

1:standard模式是活动默认的启动模式,我们知道Android是使用返回栈来管理活动的,在standard模式下,每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。这种模式 ,每次启动都会创建一个实例活动。比如说三个Activity,分别是Activity1,Activity2,Activity3,我们从Activity1跳转到Activity2,再跳转到Activity3,返回顺序就是Activity3->Activity2->Activity1.

2:singleTop模式:首先我们想一下,每一个东西存在都有他的意义,那么既然有了standard模式 ,为什么还要有singleTop模式呢,standard模式有什么缺点呢?其实standard模式的话,像活动明明在栈顶了,但是每次启动的时候还要创建一个新的活动实例。所以这时有了singleTop模式,这singleTop模式在活动启动时发现返回栈的栈顶已经是该活动了,则可以直接认为使用它。

      举个栗子:现在有连个Activity,分别是Activity1和 Activity2,我们从Activity1跳转到Activity2,然后再从Activity2跳转到Activity1,返回顺序是这样的:Activit1->Activity2->Activity1,因为栈顶不是Activity1,所以要重新创建Activity1实例。

3:singleTask模式:同样的问题,为什么要有它?使用singleTop很好的解决了重复创建栈顶活动的问题,但是正如所见,如果该活动没有处于栈顶的位置的时候,还是会创建多个活动实例。那么我们的问题就来了,有什么办法可以让某个活动在整个应用程序的上下文中只存在一个实例呢?所以这时singleTask模式就来了,当活动的启动模式指定为singleTask时,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。

4:最后一个singlestance(全局单列模式),这个模式应该算是四种模式 中最特殊,最复杂的一个了。这个模式不同于其他三种模式 ,如果指定为singlestance模式的活动,将会启动一个新的返回栈来管理 这个活动(其实如果singleTask模式指定你了不同地taskAddinnity,也会启动一个新的返回栈),那么这样做有什么意义呢》想象以下场景,假设我们的程序中有一个活动是允许其他程序调用的,如果我们想实现其他程序和我们的程序可以共享这个活动的实例,应该如何去实现呢?使用前面三种启动模式肯定是做不到的,因为每个应用程序都有自己的返回栈,同一个活动在不同的返回栈中入栈时必然是创建了新的实例。而使用singlestance模式就可以解决这个问题,在这种模式下会有单独的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共用同一个返回栈,也就解决了共享活动实例的问题。

接下来我们再来说一下活动的生命周期

Activity定义了7个回调方法,覆盖了活动的每一个环节 ,下面就来一一介绍这7个方法。

onCreate()。这个方法你已经看过很多次了,每个活动我们都重写了这个方法,它会在活动第一次创建时调用。你应该在这个方法中完成 活动的初始化操作,比如加载布局 ,绑定事件等。

onStar()。这个方法在活动不可见变为可见的时候调用。

onResume()。(重新获得焦点)这个方法在活动准备好和用户交互时的时候调用。此时的活动一定位于返回栈的栈顶,并且处于运行状态。

onPause()。(失去焦点)这个方法在系统准备去启动或者恢复另一个活动的时候调用。我们通常会在这个方法中将一些消耗CPU的资源释放掉,已经保存一些关键数据,但这个方法的执行速度一定要快 ,不然会影响新的栈顶活动的调用。

onStop()。这个方法在活动完全不可见的时候调用。它和onPause()方法主要区别在于,如果启动新活动是一个对话框式的活动,那么onPause()方法会得到执行,而onStop()方法并不会执行。

onDestroy()。这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。

onRestart()。这个方法在活动由停止 状态变为运行状态之前调用,也就是活动被重新启动了。

以上7个方法除了onRestart()方法,其他都是两两相对的,从而又可以将活动分为3种生存期。

完整生存期。活动在onCreate()方法和onDestroy()方法之间所经历的,就是完整生存期。一般情况下,一个活动会在onCreate()方法中完成各种初始化操作,而在onDestroy()方法中完成释放内存的操作。

可见生存期:活动在onStart()方法和onStop()方法之间所经历的,就是可见生存期。在可见生存期内,活动对于用户总是可见的,即便有可能无法和用户进行交互。我们 可以通过这两个方法,合理的管理那些对用户可见的资源。比如在onStart()方法中对资源进行加载,而在onStop()方法中对资源进行释放,从而保证处于停止状态的活动不会占用太多内存。

前台生命期:活动在onResume()和onPause()方法之间所经历的的就是前台生命期。在前台生命期内,活动总是处于运行状态的,此时的活动是可以 和用户进行交互的,我们 平时看到和接触最多的也就是这个状态下的活动。

为了帮助你能够更好的理解,Android官方提供一张活动生命周期的示意图,如下

图片来源于网络:

我们先来说一下活动的启动模式吧;活动的启动模式有四种:分别是:standard模式,singleTop模式(栈顶模式),singleTask(栈内复用),singlestance(全局单列模式)。

【怎么去指定使用这些启动模式呢?我们只需要在AndroidManifest.xml中通过给标签指定android:launchMode属性来选择启动模式】

下面用我理解的意思跟大家解释一下这四种模式的作用吧;

1:standard模式是活动默认的启动模式,我们知道Android是使用返回栈来管理活动的,在standard模式下,每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。这种模式 ,每次启动都会创建一个实例活动。比如说三个Activity,分别是Activity1,Activity2,Activity3,我们从Activity1跳转到Activity2,再跳转到Activity3,返回顺序就是Activity3->Activity2->Activity1.

2:singleTop模式:首先我们想一下,每一个东西存在都有他的意义,那么既然有了standard模式 ,为什么还要有singleTop模式呢,standard模式有什么缺点呢?其实standard模式的话,像活动明明在栈顶了,但是每次启动的时候还要创建一个新的活动实例。所以这时有了singleTop模式,这singleTop模式在活动启动时发现返回栈的栈顶已经是该活动了,则可以直接认为使用它。

      举个栗子:现在有连个Activity,分别是Activity1和 Activity2,我们从Activity1跳转到Activity2,然后再从Activity2跳转到Activity1,返回顺序是这样的:Activit1->Activity2->Activity1,因为栈顶不是Activity1,所以要重新创建Activity1实例。

3:singleTask模式:同样的问题,为什么要有它?使用singleTop很好的解决了重复创建栈顶活动的问题,但是正如所见,如果该活动没有处于栈顶的位置的时候,还是会创建多个活动实例。那么我们的问题就来了,有什么办法可以让某个活动在整个应用程序的上下文中只存在一个实例呢?所以这时singleTask模式就来了,当活动的启动模式指定为singleTask时,每次启动该活动时系统首先会在返回栈中检查是否存在该活动的实例,如果发现已经存在则直接使用该实例,并把在这个活动之上的所有活动统统出栈,如果没有发现就会创建一个新的活动实例。

4:最后一个singlestance(全局单列模式),这个模式应该算是四种模式 中最特殊,最复杂的一个了。这个模式不同于其他三种模式 ,如果指定为singlestance模式的活动,将会启动一个新的返回栈来管理 这个活动(其实如果singleTask模式指定你了不同地taskAddinnity,也会启动一个新的返回栈),那么这样做有什么意义呢》想象以下场景,假设我们的程序中有一个活动是允许其他程序调用的,如果我们想实现其他程序和我们的程序可以共享这个活动的实例,应该如何去实现呢?使用前面三种启动模式肯定是做不到的,因为每个应用程序都有自己的返回栈,同一个活动在不同的返回栈中入栈时必然是创建了新的实例。而使用singlestance模式就可以解决这个问题,在这种模式下会有单独的返回栈来管理这个活动,不管是哪个应用程序来访问这个活动,都共用同一个返回栈,也就解决了共享活动实例的问题。

接下来我们再来说一下活动的生命周期

Activity定义了7个回调方法,覆盖了活动的每一个环节 ,下面就来一一介绍这7个方法。

onCreate()。这个方法你已经看过很多次了,每个活动我们都重写了这个方法,它会在活动第一次创建时调用。你应该在这个方法中完成 活动的初始化操作,比如加载布局 ,绑定事件等。

onStar()。这个方法在活动不可见变为可见的时候调用。

onResume()。(重新获得焦点)这个方法在活动准备好和用户交互时的时候调用。此时的活动一定位于返回栈的栈顶,并且处于运行状态。

onPause()。这个方法在系统准备去启动或者恢复另一个活动的时候调用。我们通常会在这个方法中将一些消耗CPU的资源释放掉,已经保存一些关键数据,但这个方法的执行速度一定要快 ,不然会影响新的栈顶活动的调用。

onStop()。这个方法在活动完全不可见的时候调用。它和onPause()方法主要区别在于,如果启动新活动是一个对话框式的活动,那么onPause()方法会得到执行,而onStop()方法并不会执行。

onDestroy()。这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。

onRestart()。这个方法在活动由停止 状态变为运行状态之前调用,也就是活动被重新启动了。

以上7个方法除了onRestart()方法,其他都是两两相对的,从而又可以将活动分为3种生存期。

完整生存期。活动在onCreate()方法和onDestroy()方法之间所经历的,就是完整生存期。一般情况下,一个活动会在onCreate()方法中完成各种初始化操作,而在onDestroy()方法中完成释放内存的操作。

可见生存期:活动在onStart()方法和onStop()方法之间所经历的,就是可见生存期。在可见生存期内,活动对于用户总是可见的,即便有可能无法和用户进行交互。我们 可以通过这两个方法,合理的管理那些对用户可见的资源。比如在onStart()方法中对资源进行加载,而在onStop()方法中对资源进行释放,从而保证处于停止状态的活动不会占用太多内存。

前台生命期:活动在onResume()和onPause()方法之间所经历的的就是前台生命期。在前台生命期内,活动总是处于运行状态的,此时的活动是可以 和用户进行交互的,我们 平时看到和接触最多的也就是这个状态下的活动。

为了帮助你能够更好的理解,Android官方提供一张活动生命周期的示意图,如下

图片来源于网络:


活动的启动模式和生命周期_第1张图片

你可能感兴趣的:(活动的启动模式和生命周期)