本篇文章的目的,是帮助Fragment的初学者彻底了解Fragment的生命周期。
大家都知道,Android 3.0中引入Fragment(碎片、片段) 的概念,其的是为了解决不同屏幕分辩率的动态和灵活UI设计。
大屏幕如平板,小屏幕如手机,平板电脑的设计使得其有更多的空间来放更多的UI组件,而多出来的空间存放UI使其会产生更多的交互,从而诞生了Fragments 。
所以说无论是手机还是平板开发者,在以后的开发中都会经常用到Fragment,所以彻底的了解Fragment的生命周期极其重要,该篇文章亦可以,作为Fragment生命周期面试题目的参考。
好了,开始学习:
在学这篇文章的之前,学者最好对Activity的生命周期比较了解,大家都知道Fragment的生命周期是伴随着Activity的生命周期出现而出现的,是不可以单独出现的。这里同时打印出了Activity和Fragment的生命周期,把两者放到一起,看起来更加明了。也更容易了解两者生命周期及两者之间飞关系。
首先研究下面两生命周期图:Activity和Fragment生命周期图。
Activity和Fragment周期之间的关系:
Demo代码:
布局文件:
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----------"); } }
运行项目后:
点击手机上的home键后:
再次打开该项目(可以长按home键,选择刚刚打开的该项目):
点击手机上的返回键:
从上可以得出结论:如果点击home键,并不会销毁该Activity或Fragment(只是stop);但是点击返回键后,该Activity和 fragment都销毁。这个结论在我以前的面试中经常问到。所以还是希望初学者能够把这个结论搞懂。
最后贴一下源Demo,可以试着研究一下:
点击下载源码