Android Fragment 生命周期详解

本篇文章的目的,是帮助Fragment的初学者彻底了解Fragment的生命周期。

大家都知道,Android 3.0中引入Fragment(碎片、片段) 的概念,其的是为了解决不同屏幕分辩率的动态和灵活UI设计。

大屏幕如平板,小屏幕如手机,平板电脑的设计使得其有更多的空间来放更多的UI组件,而多出来的空间存放UI使其会产生更多的交互,从而诞生了Fragments 。

所以说无论是手机还是平板开发者,在以后的开发中都会经常用到Fragment,所以彻底的了解Fragment的生命周期极其重要,该篇文章亦可以,作为Fragment生命周期面试题目的参考。


好了,开始学习:

在学这篇文章的之前,学者最好对Activity的生命周期比较了解,大家都知道Fragment的生命周期是伴随着Activity的生命周期出现而出现的,是不可以单独出现的。这里同时打印出了Activity和Fragment的生命周期,把两者放到一起,看起来更加明了。也更容易了解两者生命周期及两者之间飞关系。


首先研究下面两生命周期图:Activity和Fragment生命周期图。


Activity和Fragment周期之间的关系:



Demo代码:

Android Fragment 生命周期详解_第1张图片

布局文件:

activity_main:

<RelativeLayout 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"
    tools:context=".MainActivity" >

    <fragment
        android:id="@+id/fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        class="com.fragmentzhouqi.MyFragment" />

</RelativeLayout>

代码文件:

MainActivity:

package com.fragmentzhouqi;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;

public class MainActivity extends Activity {
	private static final String TAG = "MyTag";

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		/**
		 * 注意这里的log日志打印需写到setContentView前面,
		 * 以更能清晰的表示最先调用的总是Activity的onCreate方法。
		 */
		Log.d(TAG, "-----Activity onCreate-----");
		setContentView(R.layout.activity_main);
	}

	@Override
	protected void onStart() {
		super.onStart();
		Log.d(TAG, "-----Activity onStart-----");
	}

	@Override
	protected void onRestart() {
		super.onRestart();
		Log.d(TAG, "-----Activity onRestart-----");
	}

	@Override
	protected void onResume() {
		super.onResume();
		Log.d(TAG, "-----Activity onResume-----");
	}

	@Override
	protected void onPause() {
		super.onPause();
		Log.d(TAG, "-----Activity onPause-----");
	}

	@Override
	protected void onStop() {
		super.onStop();
		Log.d(TAG, "-----Activity onStop-----");
	}

	@Override
	protected void onDestroy() {
		super.onDestroy();
		Log.d(TAG, "-----Activity onDestroy-----");
	}
}




MyFragment:

package com.fragmentzhouqi;

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class MyFragment extends Fragment {
	private static final String TAG = "MyTag";

	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);
		Log.d(TAG, "----------Fragment onAttach----------");
	}

	@Override 
	public void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		Log.d(TAG, "----------Fragment onCreate----------");
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		Log.d(TAG, "----------Fragment onCreateView----------");
		TextView textView = new TextView(getActivity());
		textView.setText("欢迎来到zhongyao的Fragment生命周期的测试");
		return textView;
	}

	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		super.onActivityCreated(savedInstanceState);
		Log.d(TAG, "----------Fragment onActivityCreated----------");
	}

	@Override
	public void onStart() {
		super.onStart();
		Log.d(TAG, "----------Fragment onStart----------");
	}

	@Override
	public void onResume() {
		super.onResume();
		Log.d(TAG, "----------Fragment onResume----------");
	}

	@Override
	public void onPause() {
		super.onPause();
		Log.d(TAG, "----------Fragment onPause----------");
	}

	@Override
	public void onStop() {
		super.onStop();
		Log.d(TAG, "----------Fragment onStop----------");
	}

	@Override
	public void onDestroyView() {
		super.onDestroyView();
		Log.d(TAG, "----------Fragment onDestroyView----------");
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		Log.d(TAG, "----------Fragment onDestroy----------");
	}

	@Override
	public void onDetach() {
		super.onDetach();
		Log.d(TAG, "----------Fragment onDetach----------");
	}

}

运行项目后:

Android Fragment 生命周期详解_第2张图片

点击手机上的home键后:


再次打开该项目(可以长按home键,选择刚刚打开的该项目):

点击手机上的返回键:

Android Fragment 生命周期详解_第3张图片

从上可以得出结论:如果点击home键,并不会销毁该Activity或Fragment(只是stop);但是点击返回键后,该Activity和 fragment都销毁。这个结论在我以前的面试中经常问到。所以还是希望初学者能够把这个结论搞懂。


最后贴一下源Demo,可以试着研究一下:

点击下载源码


你可能感兴趣的:(android,生命周期,Fragment)