Activity与Fragment的生命周期详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Activity与Fragment的生命周期详解相关的知识,希望对你有一定的参考价值。

参考技术A 一.Activity的生命周期

首先我们来看一下官方文档中给出的图示:

通过上述图示,我们可以总结Activity的生命周期规律如下:

1.启动Activity:系统会先调用onCreate方法,然后调用onStart方法,最后调用onResume,Activity进入运行状态。

2.当前Activity被其他Activity覆盖其上或被锁屏:系统会调用onPause方法,暂停当前Activity的执行。

3.当前Activity由被覆盖状态回到前台或解锁屏:系统会调用onResume方法,再次进入运行状态。

4.当前Activity转到新的Activity界面或按Home键回到主屏,自身退居后台:系统会先调用onPause方法,然后调用onStop方法,进入停滞状态。

5.用户后退回到此Activity:系统会先调用onRestart方法,然后调用onStart方法,最后调用onResume方法,再次进入运行状态。

6.当前Activity处于被覆盖状态或者后台不可见状态,即第2步和第4步,系统内存不足,杀死当前Activity,而后用户退回当前Activity:再次调用onCreate方法、onStart方法、onResume方法,进入运行状态。

7.用户退出当前Activity:系统先调用onPause方法,然后调用onStop方法,最后调用onDestory方法,结束当前Activity。

注意onPause与onStop的不同,onPause表示该Activity处于可见状态但无法获取用户焦点,如在当前Activity上弹出一个对话框,则用户焦点被对话框获取,但当前Activity仍然可以看到,而onStop表示该Activity处于不可见状态,如从一个Activity跳转到另一个Activity,则之前的Activity处于不可见状态。

二Fragment的生命周期

还是先上官方文档图:

从上述图示可以看到Fragment与Activity的生命周期极其相似,我们先看一下只存在于Fragment中的几个方法:

onAttach方法:顾名思义,是Fragment和Activity建立关联的时候调用。

onCreateView方法:为Fragment加载布局时调用。

onActivityCreated方法:当Activity中的onCreate方法执行完后调用。

onDestroyView方法:Fragment中的布局被移除时调用。

onDetach方法:顾名思义,是Fragment和Activity解除关联的时候调用。

重点注意一下onActivityCreated(),因为该方法是在Activity中的onCreate方法执行完成后调用,所以在onActivityCreated()调用之前 Activity的onCreate可能还没执行,所以不能在onCreateView()中进行 与Activity相关的UI操作,而应该在onActivityCreated()中进行与Activity相关的UI操作,而onCreateView中只进行UI的显示操作。

另外需要注意Fragment中不存在onRestart()方法,该方法只存在与Activity中。

Fragment与Activity简单使用,包括二者之间的关联与生命周期

一、概论

随着Android系统的多样化,不仅仅在手机上,在平板、电视等设备上应用的也越来越多,这样就会有一个需要适应不同屏幕的问题。在Android3.0之后,谷歌推出了Fragment,Fragment在Android中被称为碎片。
我们可以把Fragment看作是Activity的一个界面或者组成部分,而且Fragment具有与Activity很相似的生命周期,我们可以在Activity中动态的添加或者移除某个Fragment。

二、生命周期

(一)Fragment的生命周期

谷歌技术文档上Fragment的生命周期截图为:



为了更直观的看到Fragment切换时候的生命周期,我们在每个生命周期方法中打印一句Log日志,更直观的看到Fragment在创建、隐藏、显示、销毁时候的生命周期。

1.第一次打开应用:



2.按home键隐藏应用:

3.从后台切换回来时:

4.退出应用时:


(二)Fragment的生命周期与Activity之间的关系

我们会发现跟Activity对比,Fragment会多几个生命周期,等下会介绍这你个不同生命周期方法的作用,先来看一张谷歌技术文档上Fragment与Activity生命周期之间的关系图:


onCreate( )、onStart( )、 onStop( )等生命周期方法是跟Activity的生命周期一一对应的,这里不做详细介绍,最主要的就是跟Activity不一样的生命周期。

(1)onAttach( ):当Fragment与Activity绑定、关联的时候调用;
(2)onCreateView( ):创建该Fragment对应的视图,并把视图返回给调用者,与onCreate( )的区别是你可以在onCreate( )中初始化与View无关的东西; (3)onActivityCreated( )在Activity完成其onCreate()方法后调用; (4)onDestroyView( ):当Fragment销毁视图的时候调用; (5)onDetach( ):Fragment与Activity脱离关系的时候调用;

三、Fragment与Activity的关联

如图:我们要实现这种效果,上面的标题与下面的内容区域,我们分别用两个Fragment来显示。


Fragment与Activity关联主要有两种方式,一种是通过在Activity的布局文件中写入fragment控件,使用name属性指定一个Fragment;另一种是在java代码中动态的添加与删除Fragment。

(一)在Activity布局中关联Fragment

这种关联方式比较简单,只需要在Activity的布局文件中关联上需要显示的fragment控件,就是把Fragment当成普通的View一样声明在Activity的布局文件中,而Activity的java代码只需要加载自己的这个布局即可,优点是比较快捷,可以提高复用性与维护性,缺点是移除与替换比较麻烦,xml布局文件如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <fragment
        android:id="@+id/fragmentone"
        android:name="com.example.fragmentdemo.FragmentOne"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
    <fragment
        android:id="@+id/fragmenttwo"
        android:name="com.example.fragmentdemo.FragmentTwo"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

FragmentOne跟FragmentTwo的布局这里就不贴出来了,就是两个简单的TextView而已。

(二)实用java代码关联Fragment

实用java代码可以动态的添加、删除与替换Fragment,实用性更广一些。 首先我们在Activity的布局文件中添加两个FrameLayout控件,用来存放要显示的Fragment:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <FrameLayout
        android:id="@+id/framelayoutone"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" >
    </FrameLayout>
    <FrameLayout
        android:id="@+id/framelayouttwo"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    </FrameLayout>
</LinearLayout>
对应Activity中的java代码为:
package com.example.fragmentdemo;

import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.view.Window;
import android.widget.FrameLayout;

public class MainActivity extends Activity 
	
	private FragmentOne fragmentOne;
	private FragmentTwo fragmentTwo;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) 
		super.onCreate(savedInstanceState);
		
		requestWindowFeature(Window.FEATURE_NO_TITLE); 
		setContentView(R.layout.activity_main);
		
		// 初始化要显示的两个Fragment
		fragmentOne = new FragmentOne();
		fragmentTwo = new FragmentTwo();
		
		// 得到Fragment的管理者FragmentManager
		FragmentManager fm = getFragmentManager();
		
		// 开启一个事务
		FragmentTransaction ft = fm.beginTransaction();
		
		/**
		 * 在FrameLayout中加载我们要显示的Fragment,这里我们使用了replace方法,下面我会介绍它与add的区别
		 * 参数:
		 * containerViewId:需要存放到哪个控件中;
		 * fragment:需要显示的Fragment;
		 * tag:给Fragment定义一个标签,方便我们取出使用等。
		 */
		ft.replace(R.id.framelayoutone, fragmentOne, "ONE");
		ft.replace(R.id.framelayouttwo, fragmentTwo, "TWO");
		
		// 最后,千万不要忘记了使用commit提交,这点有点类似数据库中的事务的使用
		ft.commit();	
	


其中的布局,Fragment我们都可以进行替换,所以就达到了动态创建Fragment的目的。
事务中其他的方法还有: ft.add( ):添加一个Fragment到Activity中; ft.remove( ):把Fragment从Activity中移除; ft.hide( ):隐藏当前的Fragment,不会销毁它; ft.show( ):显示隐藏的Fragment; 上面我们为什么要使用ft.replace( )呢?因为ft.replace( )是ft.remove( )与ft.add( )的合体,相当于先移除Fragment后,再添加一个Fragment。
Fragment与Activity的简单关联就先介绍到这里了,他们之间的交互与通信以后再向大家介绍,最后,附上本文的Demo: http://download.csdn.net/detail/xiaoli100861/9220813



以上是关于Activity与Fragment的生命周期详解的主要内容,如果未能解决你的问题,请参考以下文章

Fragment生命周期详解

Fragment生命周期详解

Fragment与Activity生命周期关系

Activity与Fragment的生命周期

Fragment的生命周期

Fragment 使用详解