一. Activity的生命周期
下面先上Activity的生命周期图:
1.Activity生命周期方法:
(1)onCreate:表示Activity正在被创建,在这里可以做一些初始化的工作;
(2)onRestart:表示Activity正在重新启动,当当前Activity从不可见切换到可见的状态时会被调用;
(3)onStart:表示Activity正在被启动,这时Activity已可见,但还没出现在前台;
(4)onResume:表示Activity已经可见,可与用户进行交互;
(5)onPause:表示Activity正在停止,正常情况下紧接着onStop方法就会被调用。但在特殊的情况下,如果这个时候快速地返回当前的Activity,那么onResume方法会被调用。可以在这个方法里面做一些存储数据、停止动画的操作,但不能太耗时,因为只有执行完这个方法后新的Activity的onResume方法才会被执行;
(6)onStop:表示Activity即将停止,可以做一些重量级的回收工作,同样不能太耗时;
(7)onDestroy:表示Activity即将被销毁,可以做一些回收工作以及最终资源的释放。
2.Activity生命周期的一些场景:
(1)第一次启动:onCreate -> onStart -> onResume;
(2)当用户打开新的Activity或者切换到桌面时:onPause -> onStop;
注:假如当前的主题是透明的,则只回调onPause方法。
(3)再次切换回到当前Activity:onRestart -> onStart -> onResume;
(4)当用户按back键回退时:onPause -> onStop -> onDestroy;
下面顺带介绍一下Activity的四种启动模式:
3.Activity的启动模式:
(1)standard:标准模式,系统的默认模式。每次启动都重新创建一个实例,不管实例是否存在。
(2)singleTop:栈顶复用模式。在这种模式下,如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时它的onNewIntent方法会被回调,通过此方法的参数可以取出当前请求的信息。
(3)singleTask:栈内复用模式。是一种单例模式。
1) 栈S1为ABC,D需要的任务栈为S2,由于S2和D均不存在,所以先创建S2,再创建D的实例并将其入栈S2;
2) 栈S1为ABC,D需要的任务栈为S1,直接创建D的实例并将其入栈到S1;
3) 栈S1为ADBC,D需要的任务栈为S1,切换D到栈顶,D上面的全部出栈,最终S1为AD;
(4)singleInstance:单实例模式。singleTask的加强版,此种模式的Activity只能单独的位于一个任务栈中。
二.Fragment的生命周期
下面先上Fragment的生命周期图:
与Activity想比较:
1.Fragment生命周期方法:
(1)onAttach:onAttach()回调将在Fragment与其Activity关联之后调用。需要使用Activity的引用或者使用Activity作为其他操作的上下文,将在此回调方法中实现。
需要注意的是:将Fragment附加到Activity以后,就无法再次调用setArguments()——除了在最开始,无法向初始化参数添加内容。
(2)onCreate(Bundle savedInstanceState):此时的Fragment的onCreate回调时,该fragment还没有获得Activity的onCreate()已完成的通知,所以不能将依赖于Activity视图层次结构存在性的代码放入此回调方法中。在onCreate()回调方法中,我们应该尽量避免耗时操作。此时的bundle就可以获取到activity传来的参数
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Bundle args = getArguments();
if (args != null) {
mLabel = args.getCharSequence("label", mLabel);
}
}
(3)onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState): 其中的Bundle为状态包与上面的bundle不一样。
注意的是:不要将视图层次结构附加到传入的ViewGroup父元素中,该关联会自动完成。如果在此回调中将碎片的视图层次结构附加到父元素,很可能会出现异常。
这句话什么意思呢?就是不要把初始化的view视图主动添加到container里面,以为这会系统自带,所以inflate函数的第三个参数必须填false,而且不能出现container.addView(v)的操作。
View v = inflater.inflate(R.layout.hello_world, container, false);
(4)onActivityCreated:onActivityCreated()回调会在Activity完成其onCreate()回调之后调用。在调用onActivityCreated()之前,Activity的视图层次结构已经准备好了,这是在用户看到用户界面之前你可对用户界面执行的最后调整的地方。
强调的point:如果Activity和她的Fragment是从保存的状态重新创建的,此回调尤其重要,也可以在这里确保此Activity的其他所有Fragment已经附加到该Activity中了
(5)Fragment与Activity相同生命周期调用:接下来的onStart()\onResume()\onPause()\onStop()回调方法将和Activity的回调方法进行绑定,也就是说与Activity中对应的生命周期相同,因此不做过多介绍。
(6)onDestroyView:该回调方法在视图层次结构与Fragment分离之后调用。
(7)onDestroy:不再使用Fragment时调用。(备注:Fragment仍然附加到Activity并任然可以找到,但是不能执行其他操作)
(8)onDetach:Fragme生命周期最后回调函数,调用后,Fragment不再与Activity绑定,释放资源。
2.场景演示 :
切换到该Fragment:onAttach -> onCreate -> onCreateView -> onActivityCreated -> onStart -> onResume;
屏幕灭掉:onPause -> onSaveInstanceState-> onStop;
屏幕解锁:onStart -> onResume;
切换到其他Fragment:onPause -> onStop -> onDestroyView;
切换回本身的Fragment:onCreateView -> onActivityCreated -> onStart -> onResume;
回到桌面:onPause -> onSaveInstanceState -> onStop;
回到应用:onStart -> onResume;
退出应用:onPause -> onStop -> onDestroyView -> onDestroy -> onDetach;