Android官网上有一张Activity的生命周期图。
从图中可以看到这边一共有七个状态。
1 onCreate():Activity正在被创建。
2 onRestart():Activity正在重新启动。(当打开另一个Activity或者返回到桌面的时候,又回到这个界面时候会调用)
3 onStart():Activity正在启动。这个时候活动已经显示,但是还没有绘制,肉眼看不到。可以理解为透明。
4 onResume():Activity正在前台,并且能够与用户进行交互(我们平时最常见的界面就是处于这个状态的)
5 onPause():Activity暂停,这个时候处于部分可见的状态。比如说我们又启动了一个透明风格的activity,我们不能与这个界面交互,但是可以看到。这个时候就处于暂停的状态。
6 onStop():Activity正在停止。这个时候界面已经完全隐藏了,不可见。
7 onDestroy():Activity即将销毁。
当activity被异常销毁的时候,会调用onSaveInstanceState()来保存信息,状态,一般发生在onStop之前,可在onPause之前,也可以之后,然后当重新启动的时候,在onRestoreInstanceState()来还原状态。一般发生在onStart()之后。
指定Activity的启动模式总共有两种方式。
一种是通过XML方式:
在这之前先介绍任务栈,这个是先进后出的数据结构.当我们启动一个Activity的时候,这个activity就会进入到这个栈的栈顶。
第一种:standard:标准模式。使用这种模式,无论任务栈中是否已已经存在了需要启动的Activity的实例,都会重新创建这个Activity的实例,并且放入栈顶中。因此栈中会存在多个相同的实例。
第二种:singleTop:栈顶复用模式。使用这种模式,当需要启动的Activity已经存在在任务栈的栈顶。会回调onNewIntent方法,直接使用已经存在的Activity实例。这个时候就不会回调onCreate重新创建实例了。如果需要启动的Activity并没有处于栈顶位置,那么还是会回调onCreate方法,重新创建一个新的实例。
使用场景:当出来有很多个推送或通知的时候,也可以使浏览器保存书签 的时候,操作的都是同一个activity,这种需要设置singleTop,不然的话,每次创建新的activity会导致要按多次返回键才能回到原来的界面,
第三种:singleTask:栈内复用模式。使用这种模式,当需要启动的Activity已经存在在栈内的时候,我们就会回调onNewIntent方法,并且将这个Activity实例放到栈顶,当栈内不存在的时候,则会回调onCreate方法,创建新实例。
使用场景:一般都是一个应用的主界面。当返回到这个主界面的时候,直接将处于主界面上的其他界面取出出栈,避免层次太复杂。
第四种:singleInstance:单实例模式。使用这种模式,启动的Activity都会被单独的另外一个新的任务栈中,并且这个任务栈中只有这个Activity单个实例。
使用场景:比较经典的是设置闹钟的界面和闹钟提醒界面,两个界面是分别放在不同的栈中。
第二种方式就是通过Intent中设置标志位来为Activity指定启动模式。
Intent intent = new Intent(this,SecondActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
标志位有很多种,这里介绍常见的四种
1 FLAG_ACTIVITY_NEW_TASK
这个标记为的作用为Activity指定“singleTask”的启动模式,
2 FLAG_ACTIVITY_SINGLE_TOP
这个标记作用是为Activity指定“singleTop“的启动模式
3 FLAG_ACTIVITY_CLEAR_TOP
具有这种标记位的activity,当启动时,同一个栈上的位于这个activity的所有activity都要出栈,如果被启动的activity在xml中指定为standard模式的话,则连同他自己都要出栈,重新创建实例。singleTask默认使用这种标记位
4 FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
具有这个标记位的Activity不会出现在历史Activity的列表,当某些情况下我们不希望通过历史列表回到activity的时候这个标记比较有用。
两种方式的区别:在java代码中制定启动模式优先级要高于xml中指定。并且xml中无法指定FLAG_ACTIVITY_CLEAR_TOP,而java中无法直接指定singleInstance启动模式。