和活动一样,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");
}
}