重新回顾关于Activity及其启动方式

       首先简单说一下什么是Activity?Activity是Android四大组件之一,我们主要通过Activity来显示我们的UI,方便用户操作。一个app中会有多个activity,当启动新的activity时,当前activity会停止,新的activity会进入栈中,获取用户焦点。当用户按“返回”按钮时,当前activity销毁,前一个activity重新恢复。

Activity生命周期图

Activity 的生命周期:

activity的四种状态:

(1)运行状态:当一个活动位于返回栈的栈顶时,用户可以获取焦点做出操作,系统一般不会回收这个状态。

(2)暂停状态:弹出一个活动或者一个非全屏的activity时,就会让前一个activity处于pause状态。这时activity就不会处于栈顶,但是仍然可见,只不过用户无法操作。系统也一般不会回收这样的活动,除非内存占用过大。

(3)停止状态:当一个活动不处于栈顶位置,且完全不可见的时候,就进入停止状态,当内存较低时系统会回收这样的活动

(4)销毁状态:当一个活动从栈中移除后就编程销毁状态,系统会回收这样的活动,状态信息和成员变量都已经不存在了

大致流程可以分为:

.Activity启动 -->  onCreate() --> onStart() --> onResume()

2.点击Home键回到系统主界面的时候 --> onPause() --> onStop()

3.当我们再次回到原来的那个Activity的时候 --> onRestart() --> onStart() --> onResume()

4.退出当前的Activity的时候 --> onPause() --> onStop() --> onDestory()

5.A Activity 调用弹出B Activity的时候(完全覆盖) --> A onPause() --> B onCreate() --> B onStart() --> B onResume --> A onStop()

6.Activity异常退出的时候 --> onPause() --> onSaveInstanceState() --> onStop() --> onDestory(),

需要注意的是onSaveInstanceState() 方法与onPause并没有严格的先后关系,有可能在onPause之前,也有可能在其后面调用,但会在onStop()方法之前调用

7.异常退出后又重新启动该Activity --> onCreate() --> onStart() --> onRestoreInstanceState() --> onResume()

2)启动模式

为什么要有启动模式?

我们在开发项目的过程中,一般都需要在本应用中多个Activity组件之间的跳转,也可能需要在本应用中打开其它应用的可复用的Activity。如我们可能需要跳转到原来某个Activity实例,此时我们更希望这个Activity可以被重用而不是创建一个新的 Activity,但根据Android系统的默认行为,确实每次都会为我们创建一个新的Activity并添加到Task中,这样android系统是不是很傻?还有一点就是在我们每开启一次页面加入到任务栈Task中后,一个Activity的数据和信息状态都将会被保留,这样会造成数据冗余, 重复数据太多, 最终还可能导致内存溢出的问题(OOM)。为了解决这些问题,android系统提供了一套Activity的启动模式来修改系统Activity的默认启动行为。

a)standard,标准模式,也是系统的默认模式(可以不指定),在这样模式下,每启动一个Activity都会重新创建一个Activity的新实例,并且将其加入任务栈中,而且完全不会去考虑这个实例是否已存在

b)singleTop,栈顶复用模式,顾名思义,在这种模式下,如果有新的Activity已经存在任务栈的栈顶,那么此Activity就不会被重新创建新实例,而是复用已存在任务栈栈顶的Activity。这里重点是位于栈顶,才会被复用,如果新的Activity的实例已存在但没有位于栈顶,那么新的Activity仍然会被重建。需要注意的是,Activity的onNewIntent方法会被调用

c)singleTask,栈内复用模式。这是一种单例模式,与singTop点类似,只不过singTop是检测栈顶元素是否有需要启动的Activity,而singTask则是检测整个栈中是否存在当前需要启动的Activity,如果存在就直接将该Activity置于栈顶,并将该Activity以上的Activity都从任务栈中移出销毁,同时也会回调onNewIntent方法

d)singleInstance模式下,该Activity在整个android系统内存中有且只有一个实例,而且该实例单独尊享一个Task。换句话说,A应用需要启动的MainActivity 是singleInstance模式,当A启动后,系统会为它创建一个新的任务栈,然后A单独在这个新的任务栈中,如果此时B应用也要激活MainActivity,由于栈内复用的特性,则不会重新创建,而是两个应用共享一个Activity的实例

3)startActivityForResult和启动模式

startActivityForResult方法能够起效:standard和singleTop

startActivityForResult方法不能够起效:singleTask和singleInstance

1)只要将被启动的Activity属性设置为singleTask则一定不起效

2)只要将被启动的Activity属性设置为singleInstance则一定不起效

3)只要将启动的Activity模式设置为singleInstance则不论被启动的Activity为什么模式均不起效

推荐阅读更多精彩内容