和活动一样,Android中的碎片也有自己的生命周期。
当碎片被创建时,会经历以下状态:
onAttach()
onCreate()
onCreateView()
onActivityCreated()
当碎片变得可见时,会经历以下状态:
onStart()
onResume()
当碎片进入后台模式时,会经历以下状态:
onPause()
onStop()
当碎片被销毁(它当前所在的活动被销毁)时,会经历以下状态:
onPause()
onStop()
onDestroyView()
onDestroy()
onDetach()
与活动一样,可以使用Bundle对象在以下状态中还原碎片的实例:
onCreate()
onCreateView()
onActivityCreated()
注意: 可以在onSaveInstanceState()方法中保存碎片的状态。
碎片经历的状态大多数与活动类似。但是,有一些新状态是碎片独有的:
onAttached()——当碎片与活动建立关联时调用。
onCreateView()——用于创建碎片的视图。
onActivityCreated——当活动的onCreate()方法被返回时调用。
onDestroyView()——当碎片的视图被移除时调用。
onDetach()——当碎片与活动的关联被移除时调用。
注意,活动与碎片之间存在一个主要的区别:当活动进入后台时,会被放到back stack中。这样当用户按Back按钮时,活动可以恢复。但是,碎片在进入后台时不会被自动放到back stack中。要实现这一目的,需要在碎片处理期间显式调用addToBackStack()方法。如:
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
这段代码确保了当把碎片添加到活动中后,用户可以单击Back按钮移除它。
示例代码:
package com.example.androidtest; 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; public class Fragment1 extends Fragment{ @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d("Fragment1", "onCreateView"); return inflater.inflate(R.layout.fragment1, container, false); } @Override public void onAttach(Activity activity) { super.onAttach(activity); Log.d("Fragment1", "onAttach"); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); Log.d("Fragment1", "onCreate"); } @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Log.d("Fragment1", "onActivityCreated"); } @Override public void onStart() { super.onStart(); Log.d("Fragment1", "onStart"); } @Override public void onResume() { super.onResume(); Log.d("Fragment1", "onResume"); } @Override public void onPause() { super.onPause(); Log.d("Fragment1", "onPause"); } @Override public void onStop() { super.onStop(); Log.d("Fragment1", "onStop"); } @Override public void onDestroyView() { super.onDestroyView(); Log.d("Fragment1", "onDestroyView"); } @Override public void onDetach() { super.onDetach(); Log.d("Fragment1", "onDetach"); } }